{"diffoscope-json-version": 1, "source1": "/srv/reproducible-results/rbuild-debian/r-b-build.aQuIUwZc/b1/dune-common_2.10.0-4_amd64.changes", "source2": "/srv/reproducible-results/rbuild-debian/r-b-build.aQuIUwZc/b2/dune-common_2.10.0-4_amd64.changes", "unified_diff": null, "details": [{"source1": "Files", "source2": "Files", "unified_diff": "@@ -1,4 +1,4 @@\n \n e31bc8169c15cf89a5279e4c9dc8152a 519784 debug optional libdune-common-dev-dbgsym_2.10.0-4_amd64.deb\n 0250ca179606c3c31e9d634cf0f27df3 412216 libdevel optional libdune-common-dev_2.10.0-4_amd64.deb\n- 67908966614aea4d7b9493a951e56f79 3175368 doc optional libdune-common-doc_2.10.0-4_all.deb\n+ fc7927ee85bfa58eeda135cca05b2e8f 3176972 doc optional libdune-common-doc_2.10.0-4_all.deb\n"}, {"source1": "libdune-common-doc_2.10.0-4_all.deb", "source2": "libdune-common-doc_2.10.0-4_all.deb", "unified_diff": null, "details": [{"source1": "file list", "source2": "file list", "unified_diff": "@@ -1,3 +1,3 @@\n -rw-r--r-- 0 0 0 4 2024-11-22 14:28:16.000000 debian-binary\n--rw-r--r-- 0 0 0 28072 2024-11-22 14:28:16.000000 control.tar.xz\n--rw-r--r-- 0 0 0 3147104 2024-11-22 14:28:16.000000 data.tar.xz\n+-rw-r--r-- 0 0 0 28088 2024-11-22 14:28:16.000000 control.tar.xz\n+-rw-r--r-- 0 0 0 3148692 2024-11-22 14:28:16.000000 data.tar.xz\n"}, {"source1": "control.tar.xz", "source2": "control.tar.xz", "unified_diff": null, "details": [{"source1": "control.tar", "source2": "control.tar", "unified_diff": null, "details": [{"source1": "./control", "source2": "./control", "unified_diff": "@@ -1,13 +1,13 @@\n Package: libdune-common-doc\n Source: dune-common\n Version: 2.10.0-4\n Architecture: all\n Maintainer: Debian Science Maintainers \n-Installed-Size: 23532\n+Installed-Size: 23533\n Depends: libjs-sphinxdoc (>= 7.4)\n Built-Using: doxygen (= 1.9.8+ds-2)\n Section: doc\n Priority: optional\n Multi-Arch: foreign\n Homepage: https://www.dune-project.org/\n Description: toolbox for solving PDEs -- basic classes (documentation)\n"}, {"source1": "./md5sums", "source2": "./md5sums", "unified_diff": null, "details": [{"source1": "./md5sums", "source2": "./md5sums", "comments": ["Files differ"], "unified_diff": null}, {"source1": "line order", "source2": "line order", "unified_diff": "@@ -29,68 +29,69 @@\n usr/share/doc/libdune-common-doc/doxygen/a00017.html\n usr/share/doc/libdune-common-doc/doxygen/a00017_source.html\n usr/share/doc/libdune-common-doc/doxygen/a00020.html\n usr/share/doc/libdune-common-doc/doxygen/a00020_source.html\n usr/share/doc/libdune-common-doc/doxygen/a00023.html\n usr/share/doc/libdune-common-doc/doxygen/a00023_source.html\n usr/share/doc/libdune-common-doc/doxygen/a00026.html\n-usr/share/doc/libdune-common-doc/doxygen/a00026_source.html\n usr/share/doc/libdune-common-doc/doxygen/a00029.html\n usr/share/doc/libdune-common-doc/doxygen/a00029_source.html\n usr/share/doc/libdune-common-doc/doxygen/a00032.html\n usr/share/doc/libdune-common-doc/doxygen/a00032_source.html\n usr/share/doc/libdune-common-doc/doxygen/a00035.html\n usr/share/doc/libdune-common-doc/doxygen/a00035_source.html\n usr/share/doc/libdune-common-doc/doxygen/a00038.html\n+usr/share/doc/libdune-common-doc/doxygen/a00038_source.html\n usr/share/doc/libdune-common-doc/doxygen/a00041.html\n usr/share/doc/libdune-common-doc/doxygen/a00041_source.html\n usr/share/doc/libdune-common-doc/doxygen/a00044.html\n usr/share/doc/libdune-common-doc/doxygen/a00044_source.html\n usr/share/doc/libdune-common-doc/doxygen/a00047.html\n usr/share/doc/libdune-common-doc/doxygen/a00047_source.html\n usr/share/doc/libdune-common-doc/doxygen/a00050.html\n usr/share/doc/libdune-common-doc/doxygen/a00050_source.html\n usr/share/doc/libdune-common-doc/doxygen/a00053.html\n usr/share/doc/libdune-common-doc/doxygen/a00053_source.html\n usr/share/doc/libdune-common-doc/doxygen/a00056.html\n usr/share/doc/libdune-common-doc/doxygen/a00056_source.html\n usr/share/doc/libdune-common-doc/doxygen/a00059.html\n-usr/share/doc/libdune-common-doc/doxygen/a00059_source.html\n usr/share/doc/libdune-common-doc/doxygen/a00062.html\n usr/share/doc/libdune-common-doc/doxygen/a00062_source.html\n usr/share/doc/libdune-common-doc/doxygen/a00065.html\n usr/share/doc/libdune-common-doc/doxygen/a00065_source.html\n usr/share/doc/libdune-common-doc/doxygen/a00068.html\n usr/share/doc/libdune-common-doc/doxygen/a00068_source.html\n usr/share/doc/libdune-common-doc/doxygen/a00071.html\n usr/share/doc/libdune-common-doc/doxygen/a00071_source.html\n usr/share/doc/libdune-common-doc/doxygen/a00074.html\n usr/share/doc/libdune-common-doc/doxygen/a00074_source.html\n usr/share/doc/libdune-common-doc/doxygen/a00077.html\n usr/share/doc/libdune-common-doc/doxygen/a00077_source.html\n+usr/share/doc/libdune-common-doc/doxygen/a00080.html\n+usr/share/doc/libdune-common-doc/doxygen/a00080_source.html\n usr/share/doc/libdune-common-doc/doxygen/a00083.html\n usr/share/doc/libdune-common-doc/doxygen/a00083_source.html\n usr/share/doc/libdune-common-doc/doxygen/a00086.html\n usr/share/doc/libdune-common-doc/doxygen/a00086_source.html\n usr/share/doc/libdune-common-doc/doxygen/a00089.html\n usr/share/doc/libdune-common-doc/doxygen/a00089_source.html\n usr/share/doc/libdune-common-doc/doxygen/a00092.html\n usr/share/doc/libdune-common-doc/doxygen/a00092_source.html\n usr/share/doc/libdune-common-doc/doxygen/a00095.html\n usr/share/doc/libdune-common-doc/doxygen/a00095_source.html\n usr/share/doc/libdune-common-doc/doxygen/a00098.html\n-usr/share/doc/libdune-common-doc/doxygen/a00101.html\n-usr/share/doc/libdune-common-doc/doxygen/a00101_source.html\n+usr/share/doc/libdune-common-doc/doxygen/a00098_source.html\n usr/share/doc/libdune-common-doc/doxygen/a00104.html\n usr/share/doc/libdune-common-doc/doxygen/a00104_source.html\n usr/share/doc/libdune-common-doc/doxygen/a00107.html\n usr/share/doc/libdune-common-doc/doxygen/a00107_source.html\n usr/share/doc/libdune-common-doc/doxygen/a00110.html\n usr/share/doc/libdune-common-doc/doxygen/a00110_source.html\n usr/share/doc/libdune-common-doc/doxygen/a00113.html\n+usr/share/doc/libdune-common-doc/doxygen/a00113_source.html\n usr/share/doc/libdune-common-doc/doxygen/a00116.html\n usr/share/doc/libdune-common-doc/doxygen/a00116_source.html\n usr/share/doc/libdune-common-doc/doxygen/a00119.html\n usr/share/doc/libdune-common-doc/doxygen/a00119_source.html\n usr/share/doc/libdune-common-doc/doxygen/a00122.html\n usr/share/doc/libdune-common-doc/doxygen/a00122_source.html\n usr/share/doc/libdune-common-doc/doxygen/a00125.html\n@@ -106,15 +107,14 @@\n usr/share/doc/libdune-common-doc/doxygen/a00140.html\n usr/share/doc/libdune-common-doc/doxygen/a00140_source.html\n usr/share/doc/libdune-common-doc/doxygen/a00143.html\n usr/share/doc/libdune-common-doc/doxygen/a00143_source.html\n usr/share/doc/libdune-common-doc/doxygen/a00146.html\n usr/share/doc/libdune-common-doc/doxygen/a00146_source.html\n usr/share/doc/libdune-common-doc/doxygen/a00149.html\n-usr/share/doc/libdune-common-doc/doxygen/a00149_source.html\n usr/share/doc/libdune-common-doc/doxygen/a00152.html\n usr/share/doc/libdune-common-doc/doxygen/a00152_source.html\n usr/share/doc/libdune-common-doc/doxygen/a00155.html\n usr/share/doc/libdune-common-doc/doxygen/a00155_source.html\n usr/share/doc/libdune-common-doc/doxygen/a00158.html\n usr/share/doc/libdune-common-doc/doxygen/a00158_source.html\n usr/share/doc/libdune-common-doc/doxygen/a00161.html\n@@ -130,15 +130,14 @@\n usr/share/doc/libdune-common-doc/doxygen/a00176.html\n usr/share/doc/libdune-common-doc/doxygen/a00176_source.html\n usr/share/doc/libdune-common-doc/doxygen/a00179.html\n usr/share/doc/libdune-common-doc/doxygen/a00179_source.html\n usr/share/doc/libdune-common-doc/doxygen/a00182.html\n usr/share/doc/libdune-common-doc/doxygen/a00182_source.html\n usr/share/doc/libdune-common-doc/doxygen/a00185.html\n-usr/share/doc/libdune-common-doc/doxygen/a00185_source.html\n usr/share/doc/libdune-common-doc/doxygen/a00188.html\n usr/share/doc/libdune-common-doc/doxygen/a00188_source.html\n usr/share/doc/libdune-common-doc/doxygen/a00191.html\n usr/share/doc/libdune-common-doc/doxygen/a00191_source.html\n usr/share/doc/libdune-common-doc/doxygen/a00194.html\n usr/share/doc/libdune-common-doc/doxygen/a00194_source.html\n usr/share/doc/libdune-common-doc/doxygen/a00197.html\n@@ -154,49 +153,46 @@\n usr/share/doc/libdune-common-doc/doxygen/a00212.html\n usr/share/doc/libdune-common-doc/doxygen/a00212_source.html\n usr/share/doc/libdune-common-doc/doxygen/a00215.html\n usr/share/doc/libdune-common-doc/doxygen/a00215_source.html\n usr/share/doc/libdune-common-doc/doxygen/a00218.html\n usr/share/doc/libdune-common-doc/doxygen/a00218_source.html\n usr/share/doc/libdune-common-doc/doxygen/a00221.html\n-usr/share/doc/libdune-common-doc/doxygen/a00221_source.html\n usr/share/doc/libdune-common-doc/doxygen/a00224.html\n usr/share/doc/libdune-common-doc/doxygen/a00224_source.html\n usr/share/doc/libdune-common-doc/doxygen/a00227.html\n usr/share/doc/libdune-common-doc/doxygen/a00227_source.html\n usr/share/doc/libdune-common-doc/doxygen/a00230.html\n+usr/share/doc/libdune-common-doc/doxygen/a00230_source.html\n usr/share/doc/libdune-common-doc/doxygen/a00233.html\n usr/share/doc/libdune-common-doc/doxygen/a00233_source.html\n usr/share/doc/libdune-common-doc/doxygen/a00236.html\n usr/share/doc/libdune-common-doc/doxygen/a00236_source.html\n usr/share/doc/libdune-common-doc/doxygen/a00239.html\n usr/share/doc/libdune-common-doc/doxygen/a00239_source.html\n usr/share/doc/libdune-common-doc/doxygen/a00242.html\n-usr/share/doc/libdune-common-doc/doxygen/a00242_source.html\n usr/share/doc/libdune-common-doc/doxygen/a00245.html\n usr/share/doc/libdune-common-doc/doxygen/a00245_source.html\n usr/share/doc/libdune-common-doc/doxygen/a00248.html\n usr/share/doc/libdune-common-doc/doxygen/a00248_source.html\n usr/share/doc/libdune-common-doc/doxygen/a00251.html\n-usr/share/doc/libdune-common-doc/doxygen/a00251_source.html\n usr/share/doc/libdune-common-doc/doxygen/a00254.html\n usr/share/doc/libdune-common-doc/doxygen/a00254_source.html\n usr/share/doc/libdune-common-doc/doxygen/a00257.html\n-usr/share/doc/libdune-common-doc/doxygen/a00257_source.html\n usr/share/doc/libdune-common-doc/doxygen/a00260.html\n usr/share/doc/libdune-common-doc/doxygen/a00260_source.html\n usr/share/doc/libdune-common-doc/doxygen/a00263.html\n usr/share/doc/libdune-common-doc/doxygen/a00263_source.html\n usr/share/doc/libdune-common-doc/doxygen/a00266.html\n usr/share/doc/libdune-common-doc/doxygen/a00266_source.html\n usr/share/doc/libdune-common-doc/doxygen/a00269.html\n-usr/share/doc/libdune-common-doc/doxygen/a00269_source.html\n usr/share/doc/libdune-common-doc/doxygen/a00272.html\n usr/share/doc/libdune-common-doc/doxygen/a00272_source.html\n usr/share/doc/libdune-common-doc/doxygen/a00275.html\n+usr/share/doc/libdune-common-doc/doxygen/a00275_source.html\n usr/share/doc/libdune-common-doc/doxygen/a00278.html\n usr/share/doc/libdune-common-doc/doxygen/a00278_source.html\n usr/share/doc/libdune-common-doc/doxygen/a00281.html\n usr/share/doc/libdune-common-doc/doxygen/a00281_source.html\n usr/share/doc/libdune-common-doc/doxygen/a00284.html\n usr/share/doc/libdune-common-doc/doxygen/a00284_source.html\n usr/share/doc/libdune-common-doc/doxygen/a00287.html\n@@ -214,19 +210,20 @@\n usr/share/doc/libdune-common-doc/doxygen/a00305.html\n usr/share/doc/libdune-common-doc/doxygen/a00305_source.html\n usr/share/doc/libdune-common-doc/doxygen/a00308.html\n usr/share/doc/libdune-common-doc/doxygen/a00308_source.html\n usr/share/doc/libdune-common-doc/doxygen/a00311.html\n usr/share/doc/libdune-common-doc/doxygen/a00311_source.html\n usr/share/doc/libdune-common-doc/doxygen/a00314.html\n+usr/share/doc/libdune-common-doc/doxygen/a00314_source.html\n usr/share/doc/libdune-common-doc/doxygen/a00317.html\n-usr/share/doc/libdune-common-doc/doxygen/a00317_source.html\n usr/share/doc/libdune-common-doc/doxygen/a00320.html\n usr/share/doc/libdune-common-doc/doxygen/a00320_source.html\n usr/share/doc/libdune-common-doc/doxygen/a00323.html\n+usr/share/doc/libdune-common-doc/doxygen/a00323_source.html\n usr/share/doc/libdune-common-doc/doxygen/a00326.html\n usr/share/doc/libdune-common-doc/doxygen/a00326_source.html\n usr/share/doc/libdune-common-doc/doxygen/a00329.html\n usr/share/doc/libdune-common-doc/doxygen/a00329_source.html\n usr/share/doc/libdune-common-doc/doxygen/a00332.html\n usr/share/doc/libdune-common-doc/doxygen/a00332_source.html\n usr/share/doc/libdune-common-doc/doxygen/a00335.html\n@@ -244,14 +241,15 @@\n usr/share/doc/libdune-common-doc/doxygen/a00353.html\n usr/share/doc/libdune-common-doc/doxygen/a00353_source.html\n usr/share/doc/libdune-common-doc/doxygen/a00356.html\n usr/share/doc/libdune-common-doc/doxygen/a00356_source.html\n usr/share/doc/libdune-common-doc/doxygen/a00359.html\n usr/share/doc/libdune-common-doc/doxygen/a00359_source.html\n usr/share/doc/libdune-common-doc/doxygen/a00362.html\n+usr/share/doc/libdune-common-doc/doxygen/a00362_source.html\n usr/share/doc/libdune-common-doc/doxygen/a00365.html\n usr/share/doc/libdune-common-doc/doxygen/a00365_source.html\n usr/share/doc/libdune-common-doc/doxygen/a00368.html\n usr/share/doc/libdune-common-doc/doxygen/a00368_source.html\n usr/share/doc/libdune-common-doc/doxygen/a00371.html\n usr/share/doc/libdune-common-doc/doxygen/a00371_source.html\n usr/share/doc/libdune-common-doc/doxygen/a00374.html\n@@ -263,21 +261,23 @@\n usr/share/doc/libdune-common-doc/doxygen/a00383.html\n usr/share/doc/libdune-common-doc/doxygen/a00383_source.html\n usr/share/doc/libdune-common-doc/doxygen/a00386.html\n usr/share/doc/libdune-common-doc/doxygen/a00386_source.html\n usr/share/doc/libdune-common-doc/doxygen/a00389.html\n usr/share/doc/libdune-common-doc/doxygen/a00389_source.html\n usr/share/doc/libdune-common-doc/doxygen/a00392.html\n+usr/share/doc/libdune-common-doc/doxygen/a00392_source.html\n usr/share/doc/libdune-common-doc/doxygen/a00395.html\n usr/share/doc/libdune-common-doc/doxygen/a00395_source.html\n usr/share/doc/libdune-common-doc/doxygen/a00398.html\n usr/share/doc/libdune-common-doc/doxygen/a00398_source.html\n usr/share/doc/libdune-common-doc/doxygen/a00401.html\n usr/share/doc/libdune-common-doc/doxygen/a00401_source.html\n usr/share/doc/libdune-common-doc/doxygen/a00404.html\n+usr/share/doc/libdune-common-doc/doxygen/a00404_source.html\n usr/share/doc/libdune-common-doc/doxygen/a00407.html\n usr/share/doc/libdune-common-doc/doxygen/a00407_source.html\n usr/share/doc/libdune-common-doc/doxygen/a00410.html\n usr/share/doc/libdune-common-doc/doxygen/a00410_source.html\n usr/share/doc/libdune-common-doc/doxygen/a00413.html\n usr/share/doc/libdune-common-doc/doxygen/a00413_source.html\n usr/share/doc/libdune-common-doc/doxygen/a00416.html\n"}]}]}]}, {"source1": "data.tar.xz", "source2": "data.tar.xz", "unified_diff": null, "details": [{"source1": "data.tar", "source2": "data.tar", "unified_diff": null, "details": [{"source1": "file list", "source2": "file list", "unified_diff": "@@ -26,282 +26,282 @@\n -rw-r--r-- 0 root (0) root (0) 2825 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/buildsystem/html/search.html\n -rw-r--r-- 0 root (0) root (0) 12803 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/buildsystem/html/searchindex.js\n -rw-r--r-- 0 root (0) root (0) 2433 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/changelog.Debian.gz\n -rw-r--r-- 0 root (0) root (0) 10768 2024-10-04 18:52:15.000000 ./usr/share/doc/libdune-common-doc/changelog.gz\n -rw-r--r-- 0 root (0) root (0) 9815 2023-01-12 15:06:30.000000 ./usr/share/doc/libdune-common-doc/copyright\n drwxr-xr-x 0 root (0) root (0) 0 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/\n -rw-r--r-- 0 root (0) root (0) 3044 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00002.html\n--rw-r--r-- 0 root (0) root (0) 5621 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00008.html\n--rw-r--r-- 0 root (0) root (0) 7109 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00008_source.html\n--rw-r--r-- 0 root (0) root (0) 6780 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00011.html\n--rw-r--r-- 0 root (0) root (0) 8262 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00011_source.html\n--rw-r--r-- 0 root (0) root (0) 14004 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00014.html\n--rw-r--r-- 0 root (0) root (0) 86151 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00014_source.html\n--rw-r--r-- 0 root (0) root (0) 6585 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00017.html\n--rw-r--r-- 0 root (0) root (0) 44036 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00017_source.html\n--rw-r--r-- 0 root (0) root (0) 19994 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00020.html\n--rw-r--r-- 0 root (0) root (0) 180715 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00020_source.html\n--rw-r--r-- 0 root (0) root (0) 9111 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00023.html\n--rw-r--r-- 0 root (0) root (0) 53122 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00023_source.html\n--rw-r--r-- 0 root (0) root (0) 6611 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00026.html\n--rw-r--r-- 0 root (0) root (0) 19944 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00026_source.html\n--rw-r--r-- 0 root (0) root (0) 3648 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00029.html\n--rw-r--r-- 0 root (0) root (0) 4981 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00029_source.html\n--rw-r--r-- 0 root (0) root (0) 7591 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00032.html\n--rw-r--r-- 0 root (0) root (0) 138694 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00032_source.html\n--rw-r--r-- 0 root (0) root (0) 7456 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00035.html\n--rw-r--r-- 0 root (0) root (0) 33695 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00035_source.html\n--rw-r--r-- 0 root (0) root (0) 23464 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00038.html\n--rw-r--r-- 0 root (0) root (0) 8504 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00041.html\n--rw-r--r-- 0 root (0) root (0) 45745 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00041_source.html\n--rw-r--r-- 0 root (0) root (0) 9140 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00044.html\n--rw-r--r-- 0 root (0) root (0) 173678 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00044_source.html\n--rw-r--r-- 0 root (0) root (0) 3471 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00047.html\n--rw-r--r-- 0 root (0) root (0) 10170 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00047_source.html\n--rw-r--r-- 0 root (0) root (0) 8765 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00050.html\n--rw-r--r-- 0 root (0) root (0) 72000 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00050_source.html\n--rw-r--r-- 0 root (0) root (0) 6676 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00053.html\n--rw-r--r-- 0 root (0) root (0) 58446 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00053_source.html\n--rw-r--r-- 0 root (0) root (0) 6490 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00056.html\n--rw-r--r-- 0 root (0) root (0) 34021 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00056_source.html\n--rw-r--r-- 0 root (0) root (0) 6031 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00059.html\n--rw-r--r-- 0 root (0) root (0) 51849 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00059_source.html\n--rw-r--r-- 0 root (0) root (0) 11615 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00062.html\n--rw-r--r-- 0 root (0) root (0) 103142 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00062_source.html\n--rw-r--r-- 0 root (0) root (0) 6822 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00065.html\n--rw-r--r-- 0 root (0) root (0) 40313 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00065_source.html\n--rw-r--r-- 0 root (0) root (0) 3657 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00068.html\n--rw-r--r-- 0 root (0) root (0) 4978 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00068_source.html\n--rw-r--r-- 0 root (0) root (0) 5637 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00071.html\n--rw-r--r-- 0 root (0) root (0) 33707 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00071_source.html\n--rw-r--r-- 0 root (0) root (0) 6914 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00074.html\n--rw-r--r-- 0 root (0) root (0) 47730 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00074_source.html\n--rw-r--r-- 0 root (0) root (0) 11466 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00077.html\n--rw-r--r-- 0 root (0) root (0) 291478 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00077_source.html\n--rw-r--r-- 0 root (0) root (0) 13224 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00083.html\n--rw-r--r-- 0 root (0) root (0) 179116 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00083_source.html\n--rw-r--r-- 0 root (0) root (0) 7782 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00086.html\n--rw-r--r-- 0 root (0) root (0) 12395 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00086_source.html\n--rw-r--r-- 0 root (0) root (0) 26302 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00089.html\n--rw-r--r-- 0 root (0) root (0) 62033 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00089_source.html\n--rw-r--r-- 0 root (0) root (0) 5246 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00092.html\n--rw-r--r-- 0 root (0) root (0) 9924 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00092_source.html\n--rw-r--r-- 0 root (0) root (0) 6383 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00095.html\n--rw-r--r-- 0 root (0) root (0) 16095 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00095_source.html\n--rw-r--r-- 0 root (0) root (0) 9164 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00098.html\n--rw-r--r-- 0 root (0) root (0) 10468 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00101.html\n--rw-r--r-- 0 root (0) root (0) 33173 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00101_source.html\n--rw-r--r-- 0 root (0) root (0) 8193 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00104.html\n--rw-r--r-- 0 root (0) root (0) 41652 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00104_source.html\n--rw-r--r-- 0 root (0) root (0) 4767 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00107.html\n--rw-r--r-- 0 root (0) root (0) 14347 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00107_source.html\n--rw-r--r-- 0 root (0) root (0) 16770 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00110.html\n--rw-r--r-- 0 root (0) root (0) 48541 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00110_source.html\n--rw-r--r-- 0 root (0) root (0) 3898 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00113.html\n--rw-r--r-- 0 root (0) root (0) 5653 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00116.html\n--rw-r--r-- 0 root (0) root (0) 7232 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00116_source.html\n--rw-r--r-- 0 root (0) root (0) 5355 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00119.html\n--rw-r--r-- 0 root (0) root (0) 41537 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00119_source.html\n--rw-r--r-- 0 root (0) root (0) 5881 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00122.html\n--rw-r--r-- 0 root (0) root (0) 13121 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00122_source.html\n--rw-r--r-- 0 root (0) root (0) 5664 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00125.html\n--rw-r--r-- 0 root (0) root (0) 39917 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00125_source.html\n--rw-r--r-- 0 root (0) root (0) 5662 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00128.html\n--rw-r--r-- 0 root (0) root (0) 50072 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00128_source.html\n--rw-r--r-- 0 root (0) root (0) 5660 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00131.html\n--rw-r--r-- 0 root (0) root (0) 39763 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00131_source.html\n--rw-r--r-- 0 root (0) root (0) 13174 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00134.html\n--rw-r--r-- 0 root (0) root (0) 35626 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00134_source.html\n--rw-r--r-- 0 root (0) root (0) 5397 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00137.html\n--rw-r--r-- 0 root (0) root (0) 14949 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00137_source.html\n--rw-r--r-- 0 root (0) root (0) 6997 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00140.html\n--rw-r--r-- 0 root (0) root (0) 54427 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00140_source.html\n--rw-r--r-- 0 root (0) root (0) 4899 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00143.html\n--rw-r--r-- 0 root (0) root (0) 13459 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00143_source.html\n--rw-r--r-- 0 root (0) root (0) 6381 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00146.html\n--rw-r--r-- 0 root (0) root (0) 10393 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00146_source.html\n--rw-r--r-- 0 root (0) root (0) 12424 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00149.html\n--rw-r--r-- 0 root (0) root (0) 91584 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00149_source.html\n--rw-r--r-- 0 root (0) root (0) 6400 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00152.html\n--rw-r--r-- 0 root (0) root (0) 151816 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00152_source.html\n--rw-r--r-- 0 root (0) root (0) 13246 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00155.html\n--rw-r--r-- 0 root (0) root (0) 83988 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00155_source.html\n--rw-r--r-- 0 root (0) root (0) 5441 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00158.html\n--rw-r--r-- 0 root (0) root (0) 9255 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00158_source.html\n--rw-r--r-- 0 root (0) root (0) 6157 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00161.html\n--rw-r--r-- 0 root (0) root (0) 19958 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00161_source.html\n--rw-r--r-- 0 root (0) root (0) 4992 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00164.html\n--rw-r--r-- 0 root (0) root (0) 31443 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00164_source.html\n--rw-r--r-- 0 root (0) root (0) 8730 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00167.html\n--rw-r--r-- 0 root (0) root (0) 61448 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00167_source.html\n--rw-r--r-- 0 root (0) root (0) 17515 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00170.html\n--rw-r--r-- 0 root (0) root (0) 45457 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00170_source.html\n--rw-r--r-- 0 root (0) root (0) 5081 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00173.html\n--rw-r--r-- 0 root (0) root (0) 7897 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00173_source.html\n--rw-r--r-- 0 root (0) root (0) 9720 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00176.html\n--rw-r--r-- 0 root (0) root (0) 240953 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00176_source.html\n--rw-r--r-- 0 root (0) root (0) 17881 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00179.html\n--rw-r--r-- 0 root (0) root (0) 79928 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00179_source.html\n--rw-r--r-- 0 root (0) root (0) 7773 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00182.html\n--rw-r--r-- 0 root (0) root (0) 22676 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00182_source.html\n--rw-r--r-- 0 root (0) root (0) 6186 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00185.html\n--rw-r--r-- 0 root (0) root (0) 17740 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00185_source.html\n--rw-r--r-- 0 root (0) root (0) 5324 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00188.html\n--rw-r--r-- 0 root (0) root (0) 10218 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00188_source.html\n--rw-r--r-- 0 root (0) root (0) 7344 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00191.html\n--rw-r--r-- 0 root (0) root (0) 18649 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00191_source.html\n--rw-r--r-- 0 root (0) root (0) 5204 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00194.html\n--rw-r--r-- 0 root (0) root (0) 29990 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00194_source.html\n--rw-r--r-- 0 root (0) root (0) 5346 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00197.html\n--rw-r--r-- 0 root (0) root (0) 33491 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00197_source.html\n--rw-r--r-- 0 root (0) root (0) 8835 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00200.html\n--rw-r--r-- 0 root (0) root (0) 10531 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00200_source.html\n--rw-r--r-- 0 root (0) root (0) 33482 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00203.html\n--rw-r--r-- 0 root (0) root (0) 357624 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00203_source.html\n--rw-r--r-- 0 root (0) root (0) 9860 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00206.html\n--rw-r--r-- 0 root (0) root (0) 20795 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00206_source.html\n--rw-r--r-- 0 root (0) root (0) 6712 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00209.html\n--rw-r--r-- 0 root (0) root (0) 11002 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00209_source.html\n--rw-r--r-- 0 root (0) root (0) 81299 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00212.html\n--rw-r--r-- 0 root (0) root (0) 145525 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00212_source.html\n--rw-r--r-- 0 root (0) root (0) 13870 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00215.html\n--rw-r--r-- 0 root (0) root (0) 20197 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00215_source.html\n--rw-r--r-- 0 root (0) root (0) 24038 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00218.html\n--rw-r--r-- 0 root (0) root (0) 42062 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00218_source.html\n--rw-r--r-- 0 root (0) root (0) 3817 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00221.html\n--rw-r--r-- 0 root (0) root (0) 6524 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00221_source.html\n--rw-r--r-- 0 root (0) root (0) 8169 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00224.html\n--rw-r--r-- 0 root (0) root (0) 63827 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00224_source.html\n--rw-r--r-- 0 root (0) root (0) 39912 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00227.html\n--rw-r--r-- 0 root (0) root (0) 14840 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00227_source.html\n--rw-r--r-- 0 root (0) root (0) 4124 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00230.html\n--rw-r--r-- 0 root (0) root (0) 3371 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00233.html\n--rw-r--r-- 0 root (0) root (0) 88030 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00233_source.html\n--rw-r--r-- 0 root (0) root (0) 8322 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00236.html\n--rw-r--r-- 0 root (0) root (0) 40739 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00236_source.html\n--rw-r--r-- 0 root (0) root (0) 9498 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00239.html\n--rw-r--r-- 0 root (0) root (0) 250587 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00239_source.html\n--rw-r--r-- 0 root (0) root (0) 5124 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00242.html\n--rw-r--r-- 0 root (0) root (0) 29705 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00242_source.html\n--rw-r--r-- 0 root (0) root (0) 21360 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00245.html\n--rw-r--r-- 0 root (0) root (0) 122172 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00245_source.html\n--rw-r--r-- 0 root (0) root (0) 3473 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00248.html\n--rw-r--r-- 0 root (0) root (0) 14821 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00248_source.html\n--rw-r--r-- 0 root (0) root (0) 3471 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00251.html\n--rw-r--r-- 0 root (0) root (0) 9186 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00251_source.html\n--rw-r--r-- 0 root (0) root (0) 6818 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00254.html\n--rw-r--r-- 0 root (0) root (0) 100135 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00254_source.html\n--rw-r--r-- 0 root (0) root (0) 8195 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00257.html\n--rw-r--r-- 0 root (0) root (0) 144459 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00257_source.html\n--rw-r--r-- 0 root (0) root (0) 7720 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00260.html\n--rw-r--r-- 0 root (0) root (0) 10467 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00260_source.html\n--rw-r--r-- 0 root (0) root (0) 22052 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00263.html\n--rw-r--r-- 0 root (0) root (0) 46229 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00263_source.html\n--rw-r--r-- 0 root (0) root (0) 6286 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00266.html\n--rw-r--r-- 0 root (0) root (0) 21544 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00266_source.html\n--rw-r--r-- 0 root (0) root (0) 13584 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00269.html\n--rw-r--r-- 0 root (0) root (0) 94213 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00269_source.html\n--rw-r--r-- 0 root (0) root (0) 8689 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00272.html\n--rw-r--r-- 0 root (0) root (0) 15574 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00272_source.html\n--rw-r--r-- 0 root (0) root (0) 8438 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00275.html\n--rw-r--r-- 0 root (0) root (0) 4365 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00278.html\n--rw-r--r-- 0 root (0) root (0) 5135 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00278_source.html\n--rw-r--r-- 0 root (0) root (0) 5604 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00281.html\n--rw-r--r-- 0 root (0) root (0) 9237 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00281_source.html\n--rw-r--r-- 0 root (0) root (0) 7355 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00284.html\n--rw-r--r-- 0 root (0) root (0) 9907 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00284_source.html\n--rw-r--r-- 0 root (0) root (0) 14429 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00287.html\n--rw-r--r-- 0 root (0) root (0) 51306 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00287_source.html\n--rw-r--r-- 0 root (0) root (0) 8833 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00290.html\n--rw-r--r-- 0 root (0) root (0) 15784 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00290_source.html\n--rw-r--r-- 0 root (0) root (0) 5274 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00293.html\n--rw-r--r-- 0 root (0) root (0) 11329 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00293_source.html\n--rw-r--r-- 0 root (0) root (0) 30299 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00296.html\n--rw-r--r-- 0 root (0) root (0) 192703 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00296_source.html\n--rw-r--r-- 0 root (0) root (0) 14827 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00299.html\n--rw-r--r-- 0 root (0) root (0) 23435 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00299_source.html\n--rw-r--r-- 0 root (0) root (0) 5114 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00302.html\n--rw-r--r-- 0 root (0) root (0) 9510 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00302_source.html\n--rw-r--r-- 0 root (0) root (0) 7493 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00305.html\n--rw-r--r-- 0 root (0) root (0) 31465 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00305_source.html\n--rw-r--r-- 0 root (0) root (0) 21234 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00308.html\n--rw-r--r-- 0 root (0) root (0) 71204 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00308_source.html\n--rw-r--r-- 0 root (0) root (0) 6661 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00311.html\n--rw-r--r-- 0 root (0) root (0) 52850 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00311_source.html\n--rw-r--r-- 0 root (0) root (0) 6924 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00314.html\n--rw-r--r-- 0 root (0) root (0) 7918 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00317.html\n--rw-r--r-- 0 root (0) root (0) 127860 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00317_source.html\n--rw-r--r-- 0 root (0) root (0) 17901 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00320.html\n--rw-r--r-- 0 root (0) root (0) 167128 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00320_source.html\n--rw-r--r-- 0 root (0) root (0) 4910 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00323.html\n--rw-r--r-- 0 root (0) root (0) 5048 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00326.html\n--rw-r--r-- 0 root (0) root (0) 23174 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00326_source.html\n--rw-r--r-- 0 root (0) root (0) 4654 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00329.html\n--rw-r--r-- 0 root (0) root (0) 7264 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00329_source.html\n--rw-r--r-- 0 root (0) root (0) 24240 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00332.html\n--rw-r--r-- 0 root (0) root (0) 39035 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00332_source.html\n--rw-r--r-- 0 root (0) root (0) 6855 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00335.html\n--rw-r--r-- 0 root (0) root (0) 112076 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00335_source.html\n--rw-r--r-- 0 root (0) root (0) 4309 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00338.html\n--rw-r--r-- 0 root (0) root (0) 17896 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00338_source.html\n--rw-r--r-- 0 root (0) root (0) 4393 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00341.html\n--rw-r--r-- 0 root (0) root (0) 7511 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00341_source.html\n--rw-r--r-- 0 root (0) root (0) 7123 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00344.html\n--rw-r--r-- 0 root (0) root (0) 23204 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00344_source.html\n--rw-r--r-- 0 root (0) root (0) 12793 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00347.html\n--rw-r--r-- 0 root (0) root (0) 124302 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00347_source.html\n--rw-r--r-- 0 root (0) root (0) 24717 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00350.html\n--rw-r--r-- 0 root (0) root (0) 122775 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00350_source.html\n--rw-r--r-- 0 root (0) root (0) 5766 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00353.html\n--rw-r--r-- 0 root (0) root (0) 16720 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00353_source.html\n--rw-r--r-- 0 root (0) root (0) 5059 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00356.html\n--rw-r--r-- 0 root (0) root (0) 23627 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00356_source.html\n--rw-r--r-- 0 root (0) root (0) 13604 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00359.html\n--rw-r--r-- 0 root (0) root (0) 28674 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00359_source.html\n--rw-r--r-- 0 root (0) root (0) 3948 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00362.html\n--rw-r--r-- 0 root (0) root (0) 5042 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00365.html\n--rw-r--r-- 0 root (0) root (0) 6949 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00365_source.html\n--rw-r--r-- 0 root (0) root (0) 60433 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00368.html\n--rw-r--r-- 0 root (0) root (0) 122588 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00368_source.html\n--rw-r--r-- 0 root (0) root (0) 10990 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00371.html\n--rw-r--r-- 0 root (0) root (0) 22882 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00371_source.html\n--rw-r--r-- 0 root (0) root (0) 3371 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00374.html\n--rw-r--r-- 0 root (0) root (0) 7706 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00374_source.html\n--rw-r--r-- 0 root (0) root (0) 14994 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00377.html\n--rw-r--r-- 0 root (0) root (0) 142940 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00377_source.html\n--rw-r--r-- 0 root (0) root (0) 5213 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00380.html\n--rw-r--r-- 0 root (0) root (0) 15231 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00380_source.html\n--rw-r--r-- 0 root (0) root (0) 5602 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00383.html\n--rw-r--r-- 0 root (0) root (0) 9345 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00383_source.html\n--rw-r--r-- 0 root (0) root (0) 11653 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00386.html\n--rw-r--r-- 0 root (0) root (0) 55283 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00386_source.html\n--rw-r--r-- 0 root (0) root (0) 20534 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00389.html\n--rw-r--r-- 0 root (0) root (0) 80039 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00389_source.html\n--rw-r--r-- 0 root (0) root (0) 4127 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00392.html\n--rw-r--r-- 0 root (0) root (0) 4958 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00395.html\n--rw-r--r-- 0 root (0) root (0) 6603 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00395_source.html\n--rw-r--r-- 0 root (0) root (0) 7264 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00398.html\n--rw-r--r-- 0 root (0) root (0) 14137 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00398_source.html\n--rw-r--r-- 0 root (0) root (0) 6806 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00401.html\n--rw-r--r-- 0 root (0) root (0) 12869 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00401_source.html\n--rw-r--r-- 0 root (0) root (0) 4978 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00404.html\n--rw-r--r-- 0 root (0) root (0) 5979 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00407.html\n--rw-r--r-- 0 root (0) root (0) 21113 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00407_source.html\n--rw-r--r-- 0 root (0) root (0) 6555 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00410.html\n--rw-r--r-- 0 root (0) root (0) 18101 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00410_source.html\n--rw-r--r-- 0 root (0) root (0) 7194 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00413.html\n--rw-r--r-- 0 root (0) root (0) 151467 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00413_source.html\n--rw-r--r-- 0 root (0) root (0) 3365 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00416.html\n--rw-r--r-- 0 root (0) root (0) 10369 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00416_source.html\n--rw-r--r-- 0 root (0) root (0) 3383 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00419.html\n--rw-r--r-- 0 root (0) root (0) 51919 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00419_source.html\n--rw-r--r-- 0 root (0) root (0) 5325 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00422.html\n--rw-r--r-- 0 root (0) root (0) 22981 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00422_source.html\n--rw-r--r-- 0 root (0) root (0) 10744 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00425.html\n--rw-r--r-- 0 root (0) root (0) 109175 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00425_source.html\n+-rw-r--r-- 0 root (0) root (0) 5325 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00008.html\n+-rw-r--r-- 0 root (0) root (0) 22981 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00008_source.html\n+-rw-r--r-- 0 root (0) root (0) 5346 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00011.html\n+-rw-r--r-- 0 root (0) root (0) 33491 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00011_source.html\n+-rw-r--r-- 0 root (0) root (0) 4393 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00014.html\n+-rw-r--r-- 0 root (0) root (0) 7511 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00014_source.html\n+-rw-r--r-- 0 root (0) root (0) 7355 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00017.html\n+-rw-r--r-- 0 root (0) root (0) 9907 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00017_source.html\n+-rw-r--r-- 0 root (0) root (0) 6818 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00020.html\n+-rw-r--r-- 0 root (0) root (0) 100135 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00020_source.html\n+-rw-r--r-- 0 root (0) root (0) 7123 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00023.html\n+-rw-r--r-- 0 root (0) root (0) 23204 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00023_source.html\n+-rw-r--r-- 0 root (0) root (0) 4978 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00026.html\n+-rw-r--r-- 0 root (0) root (0) 5766 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00029.html\n+-rw-r--r-- 0 root (0) root (0) 16720 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00029_source.html\n+-rw-r--r-- 0 root (0) root (0) 5114 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00032.html\n+-rw-r--r-- 0 root (0) root (0) 9510 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00032_source.html\n+-rw-r--r-- 0 root (0) root (0) 5246 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00035.html\n+-rw-r--r-- 0 root (0) root (0) 9924 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00035_source.html\n+-rw-r--r-- 0 root (0) root (0) 7591 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00038.html\n+-rw-r--r-- 0 root (0) root (0) 138694 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00038_source.html\n+-rw-r--r-- 0 root (0) root (0) 6031 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00041.html\n+-rw-r--r-- 0 root (0) root (0) 51849 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00041_source.html\n+-rw-r--r-- 0 root (0) root (0) 6914 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00044.html\n+-rw-r--r-- 0 root (0) root (0) 47730 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00044_source.html\n+-rw-r--r-- 0 root (0) root (0) 8504 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00047.html\n+-rw-r--r-- 0 root (0) root (0) 45745 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00047_source.html\n+-rw-r--r-- 0 root (0) root (0) 19994 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00050.html\n+-rw-r--r-- 0 root (0) root (0) 180715 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00050_source.html\n+-rw-r--r-- 0 root (0) root (0) 13224 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00053.html\n+-rw-r--r-- 0 root (0) root (0) 179116 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00053_source.html\n+-rw-r--r-- 0 root (0) root (0) 11466 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00056.html\n+-rw-r--r-- 0 root (0) root (0) 291478 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00056_source.html\n+-rw-r--r-- 0 root (0) root (0) 23464 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00059.html\n+-rw-r--r-- 0 root (0) root (0) 8765 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00062.html\n+-rw-r--r-- 0 root (0) root (0) 72000 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00062_source.html\n+-rw-r--r-- 0 root (0) root (0) 9111 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00065.html\n+-rw-r--r-- 0 root (0) root (0) 53122 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00065_source.html\n+-rw-r--r-- 0 root (0) root (0) 7456 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00068.html\n+-rw-r--r-- 0 root (0) root (0) 33695 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00068_source.html\n+-rw-r--r-- 0 root (0) root (0) 6490 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00071.html\n+-rw-r--r-- 0 root (0) root (0) 34021 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00071_source.html\n+-rw-r--r-- 0 root (0) root (0) 3471 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00074.html\n+-rw-r--r-- 0 root (0) root (0) 10170 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00074_source.html\n+-rw-r--r-- 0 root (0) root (0) 11615 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00077.html\n+-rw-r--r-- 0 root (0) root (0) 103142 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00077_source.html\n+-rw-r--r-- 0 root (0) root (0) 6676 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00080.html\n+-rw-r--r-- 0 root (0) root (0) 58446 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00080_source.html\n+-rw-r--r-- 0 root (0) root (0) 3648 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00083.html\n+-rw-r--r-- 0 root (0) root (0) 4981 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00083_source.html\n+-rw-r--r-- 0 root (0) root (0) 6822 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00086.html\n+-rw-r--r-- 0 root (0) root (0) 40313 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00086_source.html\n+-rw-r--r-- 0 root (0) root (0) 6611 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00089.html\n+-rw-r--r-- 0 root (0) root (0) 19944 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00089_source.html\n+-rw-r--r-- 0 root (0) root (0) 5637 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00092.html\n+-rw-r--r-- 0 root (0) root (0) 33707 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00092_source.html\n+-rw-r--r-- 0 root (0) root (0) 3657 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00095.html\n+-rw-r--r-- 0 root (0) root (0) 4978 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00095_source.html\n+-rw-r--r-- 0 root (0) root (0) 9140 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00098.html\n+-rw-r--r-- 0 root (0) root (0) 173678 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00098_source.html\n+-rw-r--r-- 0 root (0) root (0) 8730 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00104.html\n+-rw-r--r-- 0 root (0) root (0) 61448 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00104_source.html\n+-rw-r--r-- 0 root (0) root (0) 5204 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00107.html\n+-rw-r--r-- 0 root (0) root (0) 29990 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00107_source.html\n+-rw-r--r-- 0 root (0) root (0) 7264 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00110.html\n+-rw-r--r-- 0 root (0) root (0) 14137 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00110_source.html\n+-rw-r--r-- 0 root (0) root (0) 8195 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00113.html\n+-rw-r--r-- 0 root (0) root (0) 144459 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00113_source.html\n+-rw-r--r-- 0 root (0) root (0) 13584 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00116.html\n+-rw-r--r-- 0 root (0) root (0) 94213 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00116_source.html\n+-rw-r--r-- 0 root (0) root (0) 9498 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00119.html\n+-rw-r--r-- 0 root (0) root (0) 250587 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00119_source.html\n+-rw-r--r-- 0 root (0) root (0) 5081 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00122.html\n+-rw-r--r-- 0 root (0) root (0) 7897 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00122_source.html\n+-rw-r--r-- 0 root (0) root (0) 6585 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00125.html\n+-rw-r--r-- 0 root (0) root (0) 44036 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00125_source.html\n+-rw-r--r-- 0 root (0) root (0) 7344 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00128.html\n+-rw-r--r-- 0 root (0) root (0) 18649 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00128_source.html\n+-rw-r--r-- 0 root (0) root (0) 21360 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00131.html\n+-rw-r--r-- 0 root (0) root (0) 122172 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00131_source.html\n+-rw-r--r-- 0 root (0) root (0) 5653 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00134.html\n+-rw-r--r-- 0 root (0) root (0) 7232 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00134_source.html\n+-rw-r--r-- 0 root (0) root (0) 11653 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00137.html\n+-rw-r--r-- 0 root (0) root (0) 55283 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00137_source.html\n+-rw-r--r-- 0 root (0) root (0) 7720 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00140.html\n+-rw-r--r-- 0 root (0) root (0) 10467 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00140_source.html\n+-rw-r--r-- 0 root (0) root (0) 3371 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00143.html\n+-rw-r--r-- 0 root (0) root (0) 7706 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00143_source.html\n+-rw-r--r-- 0 root (0) root (0) 9720 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00146.html\n+-rw-r--r-- 0 root (0) root (0) 240953 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00146_source.html\n+-rw-r--r-- 0 root (0) root (0) 3898 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00149.html\n+-rw-r--r-- 0 root (0) root (0) 14827 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00152.html\n+-rw-r--r-- 0 root (0) root (0) 23435 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00152_source.html\n+-rw-r--r-- 0 root (0) root (0) 21234 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00155.html\n+-rw-r--r-- 0 root (0) root (0) 71204 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00155_source.html\n+-rw-r--r-- 0 root (0) root (0) 24717 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00158.html\n+-rw-r--r-- 0 root (0) root (0) 122775 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00158_source.html\n+-rw-r--r-- 0 root (0) root (0) 10744 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00161.html\n+-rw-r--r-- 0 root (0) root (0) 109175 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00161_source.html\n+-rw-r--r-- 0 root (0) root (0) 8169 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00164.html\n+-rw-r--r-- 0 root (0) root (0) 63827 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00164_source.html\n+-rw-r--r-- 0 root (0) root (0) 14004 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00167.html\n+-rw-r--r-- 0 root (0) root (0) 86151 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00167_source.html\n+-rw-r--r-- 0 root (0) root (0) 3817 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00170.html\n+-rw-r--r-- 0 root (0) root (0) 6524 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00170_source.html\n+-rw-r--r-- 0 root (0) root (0) 5324 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00173.html\n+-rw-r--r-- 0 root (0) root (0) 10218 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00173_source.html\n+-rw-r--r-- 0 root (0) root (0) 3371 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00176.html\n+-rw-r--r-- 0 root (0) root (0) 88030 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00176_source.html\n+-rw-r--r-- 0 root (0) root (0) 24240 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00179.html\n+-rw-r--r-- 0 root (0) root (0) 39035 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00179_source.html\n+-rw-r--r-- 0 root (0) root (0) 4654 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00182.html\n+-rw-r--r-- 0 root (0) root (0) 7264 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00182_source.html\n+-rw-r--r-- 0 root (0) root (0) 8438 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00185.html\n+-rw-r--r-- 0 root (0) root (0) 3383 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00188.html\n+-rw-r--r-- 0 root (0) root (0) 51919 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00188_source.html\n+-rw-r--r-- 0 root (0) root (0) 6855 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00191.html\n+-rw-r--r-- 0 root (0) root (0) 112076 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00191_source.html\n+-rw-r--r-- 0 root (0) root (0) 7782 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00194.html\n+-rw-r--r-- 0 root (0) root (0) 12395 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00194_source.html\n+-rw-r--r-- 0 root (0) root (0) 8835 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00197.html\n+-rw-r--r-- 0 root (0) root (0) 10531 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00197_source.html\n+-rw-r--r-- 0 root (0) root (0) 5979 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00200.html\n+-rw-r--r-- 0 root (0) root (0) 21113 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00200_source.html\n+-rw-r--r-- 0 root (0) root (0) 6383 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00203.html\n+-rw-r--r-- 0 root (0) root (0) 16095 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00203_source.html\n+-rw-r--r-- 0 root (0) root (0) 4958 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00206.html\n+-rw-r--r-- 0 root (0) root (0) 6603 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00206_source.html\n+-rw-r--r-- 0 root (0) root (0) 5602 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00209.html\n+-rw-r--r-- 0 root (0) root (0) 9345 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00209_source.html\n+-rw-r--r-- 0 root (0) root (0) 7773 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00212.html\n+-rw-r--r-- 0 root (0) root (0) 22676 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00212_source.html\n+-rw-r--r-- 0 root (0) root (0) 4365 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00215.html\n+-rw-r--r-- 0 root (0) root (0) 5135 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00215_source.html\n+-rw-r--r-- 0 root (0) root (0) 14994 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00218.html\n+-rw-r--r-- 0 root (0) root (0) 142940 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00218_source.html\n+-rw-r--r-- 0 root (0) root (0) 9164 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00221.html\n+-rw-r--r-- 0 root (0) root (0) 8322 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00224.html\n+-rw-r--r-- 0 root (0) root (0) 40739 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00224_source.html\n+-rw-r--r-- 0 root (0) root (0) 8833 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00227.html\n+-rw-r--r-- 0 root (0) root (0) 15784 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00227_source.html\n+-rw-r--r-- 0 root (0) root (0) 5213 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00230.html\n+-rw-r--r-- 0 root (0) root (0) 15231 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00230_source.html\n+-rw-r--r-- 0 root (0) root (0) 4309 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00233.html\n+-rw-r--r-- 0 root (0) root (0) 17896 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00233_source.html\n+-rw-r--r-- 0 root (0) root (0) 14429 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00236.html\n+-rw-r--r-- 0 root (0) root (0) 51306 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00236_source.html\n+-rw-r--r-- 0 root (0) root (0) 6286 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00239.html\n+-rw-r--r-- 0 root (0) root (0) 21544 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00239_source.html\n+-rw-r--r-- 0 root (0) root (0) 4910 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00242.html\n+-rw-r--r-- 0 root (0) root (0) 13604 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00245.html\n+-rw-r--r-- 0 root (0) root (0) 28674 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00245_source.html\n+-rw-r--r-- 0 root (0) root (0) 8193 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00248.html\n+-rw-r--r-- 0 root (0) root (0) 41652 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00248_source.html\n+-rw-r--r-- 0 root (0) root (0) 3948 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00251.html\n+-rw-r--r-- 0 root (0) root (0) 4992 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00254.html\n+-rw-r--r-- 0 root (0) root (0) 31443 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00254_source.html\n+-rw-r--r-- 0 root (0) root (0) 4124 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00257.html\n+-rw-r--r-- 0 root (0) root (0) 6157 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00260.html\n+-rw-r--r-- 0 root (0) root (0) 19958 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00260_source.html\n+-rw-r--r-- 0 root (0) root (0) 3365 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00263.html\n+-rw-r--r-- 0 root (0) root (0) 10369 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00263_source.html\n+-rw-r--r-- 0 root (0) root (0) 6186 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00266.html\n+-rw-r--r-- 0 root (0) root (0) 17740 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00266_source.html\n+-rw-r--r-- 0 root (0) root (0) 4127 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00269.html\n+-rw-r--r-- 0 root (0) root (0) 26302 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00272.html\n+-rw-r--r-- 0 root (0) root (0) 62033 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00272_source.html\n+-rw-r--r-- 0 root (0) root (0) 5604 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00275.html\n+-rw-r--r-- 0 root (0) root (0) 9237 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00275_source.html\n+-rw-r--r-- 0 root (0) root (0) 5274 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00278.html\n+-rw-r--r-- 0 root (0) root (0) 11329 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00278_source.html\n+-rw-r--r-- 0 root (0) root (0) 17901 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00281.html\n+-rw-r--r-- 0 root (0) root (0) 167128 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00281_source.html\n+-rw-r--r-- 0 root (0) root (0) 6661 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00284.html\n+-rw-r--r-- 0 root (0) root (0) 52850 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00284_source.html\n+-rw-r--r-- 0 root (0) root (0) 7918 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00287.html\n+-rw-r--r-- 0 root (0) root (0) 127860 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00287_source.html\n+-rw-r--r-- 0 root (0) root (0) 17881 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00290.html\n+-rw-r--r-- 0 root (0) root (0) 79928 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00290_source.html\n+-rw-r--r-- 0 root (0) root (0) 10468 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00293.html\n+-rw-r--r-- 0 root (0) root (0) 33173 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00293_source.html\n+-rw-r--r-- 0 root (0) root (0) 5059 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00296.html\n+-rw-r--r-- 0 root (0) root (0) 23627 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00296_source.html\n+-rw-r--r-- 0 root (0) root (0) 5048 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00299.html\n+-rw-r--r-- 0 root (0) root (0) 23174 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00299_source.html\n+-rw-r--r-- 0 root (0) root (0) 3473 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00302.html\n+-rw-r--r-- 0 root (0) root (0) 14821 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00302_source.html\n+-rw-r--r-- 0 root (0) root (0) 3471 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00305.html\n+-rw-r--r-- 0 root (0) root (0) 9186 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00305_source.html\n+-rw-r--r-- 0 root (0) root (0) 20534 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00308.html\n+-rw-r--r-- 0 root (0) root (0) 80039 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00308_source.html\n+-rw-r--r-- 0 root (0) root (0) 6555 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00311.html\n+-rw-r--r-- 0 root (0) root (0) 18101 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00311_source.html\n+-rw-r--r-- 0 root (0) root (0) 17515 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00314.html\n+-rw-r--r-- 0 root (0) root (0) 45457 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00314_source.html\n+-rw-r--r-- 0 root (0) root (0) 6924 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00317.html\n+-rw-r--r-- 0 root (0) root (0) 5355 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00320.html\n+-rw-r--r-- 0 root (0) root (0) 41537 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00320_source.html\n+-rw-r--r-- 0 root (0) root (0) 5042 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00323.html\n+-rw-r--r-- 0 root (0) root (0) 6949 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00323_source.html\n+-rw-r--r-- 0 root (0) root (0) 10990 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00326.html\n+-rw-r--r-- 0 root (0) root (0) 22882 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00326_source.html\n+-rw-r--r-- 0 root (0) root (0) 5621 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00329.html\n+-rw-r--r-- 0 root (0) root (0) 7109 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00329_source.html\n+-rw-r--r-- 0 root (0) root (0) 6780 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00332.html\n+-rw-r--r-- 0 root (0) root (0) 8262 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00332_source.html\n+-rw-r--r-- 0 root (0) root (0) 30299 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00335.html\n+-rw-r--r-- 0 root (0) root (0) 192703 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00335_source.html\n+-rw-r--r-- 0 root (0) root (0) 4767 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00338.html\n+-rw-r--r-- 0 root (0) root (0) 14347 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00338_source.html\n+-rw-r--r-- 0 root (0) root (0) 12793 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00341.html\n+-rw-r--r-- 0 root (0) root (0) 124302 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00341_source.html\n+-rw-r--r-- 0 root (0) root (0) 5124 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00344.html\n+-rw-r--r-- 0 root (0) root (0) 29705 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00344_source.html\n+-rw-r--r-- 0 root (0) root (0) 22052 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00347.html\n+-rw-r--r-- 0 root (0) root (0) 46229 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00347_source.html\n+-rw-r--r-- 0 root (0) root (0) 7493 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00350.html\n+-rw-r--r-- 0 root (0) root (0) 31465 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00350_source.html\n+-rw-r--r-- 0 root (0) root (0) 6806 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00353.html\n+-rw-r--r-- 0 root (0) root (0) 12869 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00353_source.html\n+-rw-r--r-- 0 root (0) root (0) 60433 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00356.html\n+-rw-r--r-- 0 root (0) root (0) 122588 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00356_source.html\n+-rw-r--r-- 0 root (0) root (0) 5660 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00359.html\n+-rw-r--r-- 0 root (0) root (0) 39763 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00359_source.html\n+-rw-r--r-- 0 root (0) root (0) 13246 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00362.html\n+-rw-r--r-- 0 root (0) root (0) 83988 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00362_source.html\n+-rw-r--r-- 0 root (0) root (0) 6400 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00365.html\n+-rw-r--r-- 0 root (0) root (0) 151816 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00365_source.html\n+-rw-r--r-- 0 root (0) root (0) 13174 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00368.html\n+-rw-r--r-- 0 root (0) root (0) 35626 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00368_source.html\n+-rw-r--r-- 0 root (0) root (0) 5881 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00371.html\n+-rw-r--r-- 0 root (0) root (0) 13121 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00371_source.html\n+-rw-r--r-- 0 root (0) root (0) 5662 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00374.html\n+-rw-r--r-- 0 root (0) root (0) 50072 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00374_source.html\n+-rw-r--r-- 0 root (0) root (0) 12424 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00377.html\n+-rw-r--r-- 0 root (0) root (0) 91584 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00377_source.html\n+-rw-r--r-- 0 root (0) root (0) 5397 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00380.html\n+-rw-r--r-- 0 root (0) root (0) 14949 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00380_source.html\n+-rw-r--r-- 0 root (0) root (0) 5441 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00383.html\n+-rw-r--r-- 0 root (0) root (0) 9255 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00383_source.html\n+-rw-r--r-- 0 root (0) root (0) 6997 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00386.html\n+-rw-r--r-- 0 root (0) root (0) 54427 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00386_source.html\n+-rw-r--r-- 0 root (0) root (0) 5664 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00389.html\n+-rw-r--r-- 0 root (0) root (0) 39917 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00389_source.html\n+-rw-r--r-- 0 root (0) root (0) 6381 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00392.html\n+-rw-r--r-- 0 root (0) root (0) 10393 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00392_source.html\n+-rw-r--r-- 0 root (0) root (0) 4899 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00395.html\n+-rw-r--r-- 0 root (0) root (0) 13459 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00395_source.html\n+-rw-r--r-- 0 root (0) root (0) 39912 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00398.html\n+-rw-r--r-- 0 root (0) root (0) 14840 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00398_source.html\n+-rw-r--r-- 0 root (0) root (0) 8689 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00401.html\n+-rw-r--r-- 0 root (0) root (0) 15574 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00401_source.html\n+-rw-r--r-- 0 root (0) root (0) 16770 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00404.html\n+-rw-r--r-- 0 root (0) root (0) 48541 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00404_source.html\n+-rw-r--r-- 0 root (0) root (0) 9860 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00407.html\n+-rw-r--r-- 0 root (0) root (0) 20795 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00407_source.html\n+-rw-r--r-- 0 root (0) root (0) 81299 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00410.html\n+-rw-r--r-- 0 root (0) root (0) 145525 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00410_source.html\n+-rw-r--r-- 0 root (0) root (0) 13870 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00413.html\n+-rw-r--r-- 0 root (0) root (0) 20197 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00413_source.html\n+-rw-r--r-- 0 root (0) root (0) 33482 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00416.html\n+-rw-r--r-- 0 root (0) root (0) 357624 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00416_source.html\n+-rw-r--r-- 0 root (0) root (0) 24038 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00419.html\n+-rw-r--r-- 0 root (0) root (0) 42062 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00419_source.html\n+-rw-r--r-- 0 root (0) root (0) 6712 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00422.html\n+-rw-r--r-- 0 root (0) root (0) 11002 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00422_source.html\n+-rw-r--r-- 0 root (0) root (0) 7194 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00425.html\n+-rw-r--r-- 0 root (0) root (0) 151467 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00425_source.html\n -rw-r--r-- 0 root (0) root (0) 5173 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00428.html\n -rw-r--r-- 0 root (0) root (0) 49335 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00428_source.html\n -rw-r--r-- 0 root (0) root (0) 7896 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00431.html\n -rw-r--r-- 0 root (0) root (0) 5292 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00432.html\n -rw-r--r-- 0 root (0) root (0) 262467 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00433.html\n -rw-r--r-- 0 root (0) root (0) 27946 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00433.png\n -rw-r--r-- 0 root (0) root (0) 39664 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00434.html\n@@ -1185,15 +1185,15 @@\n -rw-r--r-- 0 root (0) root (0) 2402 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/dir_be46aaae597ce098e36afa8d6ef4f49b_dep.png\n -rw-r--r-- 0 root (0) root (0) 4890 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/dir_cf308425303dd5c426fac7b7f2967d96.html\n -rw-r--r-- 0 root (0) root (0) 1621 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/dir_cf308425303dd5c426fac7b7f2967d96_dep.png\n -rw-r--r-- 0 root (0) root (0) 49658 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/dir_e151556194dc695299293609645e9437.html\n -rw-r--r-- 0 root (0) root (0) 11161 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/dir_e151556194dc695299293609645e9437_dep.png\n -rw-r--r-- 0 root (0) root (0) 3668 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/dir_e68e8157741866f444e17edd764ebbae.html\n -rw-r--r-- 0 root (0) root (0) 45631 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/doxygen.css\n--rw-r--r-- 0 root (0) root (0) 165883 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/dune-common.tag.gz\n+-rw-r--r-- 0 root (0) root (0) 165920 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/dune-common.tag.gz\n -rw-r--r-- 0 root (0) root (0) 7704 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/dynsections.js\n -rw-r--r-- 0 root (0) root (0) 56072 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/files.html\n -rw-r--r-- 0 root (0) root (0) 1145 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/form_0.png\n -rw-r--r-- 0 root (0) root (0) 1167 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/form_0_dark.png\n -rw-r--r-- 0 root (0) root (0) 1153 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/form_1.png\n -rw-r--r-- 0 root (0) root (0) 403 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/form_10.png\n -rw-r--r-- 0 root (0) root (0) 422 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/form_10_dark.png\n"}, {"source1": "./usr/share/doc/libdune-common-doc/doxygen/a00008.html", "source2": "./usr/share/doc/libdune-common-doc/doxygen/a00008.html", "unified_diff": "@@ -1,15 +1,15 @@\n \n \n \n \n \n \n \n-dune-common: keywords.hh File Reference\n+dune-common: alignedallocator.hh File Reference\n \n \n \n \n \n \n \n@@ -70,36 +70,39 @@\n
\n \n
\n \n
\n
\n-Macros
\n-
keywords.hh File Reference
\n+Classes |\n+Namespaces
\n+
alignedallocator.hh File Reference
\n \n
\n-\n-

Definitions of several macros that conditionally make C++ syntax available. \n-More...

\n-\n+
#include "mallocallocator.hh"
\n+#include <cstdlib>
\n+#include <type_traits>
\n+
\n

Go to the source code of this file.

\n \n-\n-\n-\n-\n-\n-\n-\n+\n+\n+\n+\n+\n+\n+

\n-Macros

#define DUNE_INLINE_VARIABLE
 Preprocessor macro used for marking variables inline on supported compilers.
 
#define DUNE_GENERALIZED_CONSTEXPR
 Preprocessor macro used for marking code as constexpr under the relaxed rules of C++14 if supported by the compiler.
 

\n+Classes

class  Dune::AlignedAllocator< T, Alignment >
 Allocators which guarantee alignment of the memory. More...
 
struct  Dune::AlignedAllocator< T, Alignment >::rebind< U >
 
\n+\n+\n+\n+\n

\n+Namespaces

namespace  Dune
 Dune namespace.
 
\n-

Detailed Description

\n-

Definitions of several macros that conditionally make C++ syntax available.

\n-

This header contains several macros that enable C++ features depending on your compiler. Most of these features are optional and provide additional functionality like making code constexpr.

\n-
\n+\n \n
\n Generated by \"doxygen\"/ 1.9.8\n
\n \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,28 +1,24 @@\n dune-common\u00a02.10\n Loading...\n Searching...\n No Matches\n * _\bd_\bu_\bn_\be\n * _\bc_\bo_\bm_\bm_\bo_\bn\n-_\bM_\ba_\bc_\br_\bo_\bs\n-keywords.hh File Reference\n-_\bC_\bo_\bm_\bm_\bo_\bn \u00bb _\bU_\bt_\bi_\bl_\bi_\bt_\bi_\be_\bs \u00bb _\bC_\b+_\b+_\b _\bu_\bt_\bi_\bl_\bi_\bt_\bi_\be_\bs_\b _\ba_\bn_\bd_\b _\bb_\ba_\bc_\bk_\bp_\bo_\br_\bt_\bs\n-Definitions of several macros that conditionally make C++ syntax available.\n-_\bM_\bo_\br_\be_\b._\b._\b.\n+_\bC_\bl_\ba_\bs_\bs_\be_\bs | _\bN_\ba_\bm_\be_\bs_\bp_\ba_\bc_\be_\bs\n+alignedallocator.hh File Reference\n+#include \"_\bm_\ba_\bl_\bl_\bo_\bc_\ba_\bl_\bl_\bo_\bc_\ba_\bt_\bo_\br_\b._\bh_\bh\"\n+#include \n+#include \n _\bG_\bo_\b _\bt_\bo_\b _\bt_\bh_\be_\b _\bs_\bo_\bu_\br_\bc_\be_\b _\bc_\bo_\bd_\be_\b _\bo_\bf_\b _\bt_\bh_\bi_\bs_\b _\bf_\bi_\bl_\be_\b.\n-M\bMa\bac\bcr\bro\bos\bs\n-#define\u00a0 _\bD_\bU_\bN_\bE_\b__\bI_\bN_\bL_\bI_\bN_\bE_\b__\bV_\bA_\bR_\bI_\bA_\bB_\bL_\bE\n-\u00a0 Preprocessor macro used for marking variables inline on supported\n- compilers.\n+C\bCl\bla\bas\bss\bse\bes\bs\n+ class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bl_\bi_\bg_\bn_\be_\bd_\bA_\bl_\bl_\bo_\bc_\ba_\bt_\bo_\br_\b<_\b _\bT_\b,_\b _\bA_\bl_\bi_\bg_\bn_\bm_\be_\bn_\bt_\b _\b>\n+\u00a0 Allocators which guarantee alignment of the memory. _\bM_\bo_\br_\be_\b._\b._\b.\n \u00a0\n-#define\u00a0 _\bD_\bU_\bN_\bE_\b__\bG_\bE_\bN_\bE_\bR_\bA_\bL_\bI_\bZ_\bE_\bD_\b__\bC_\bO_\bN_\bS_\bT_\bE_\bX_\bP_\bR\n-\u00a0 Preprocessor macro used for marking code as constexpr under the\n- relaxed rules of C++14 if supported by the compiler.\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bl_\bi_\bg_\bn_\be_\bd_\bA_\bl_\bl_\bo_\bc_\ba_\bt_\bo_\br_\b<_\b _\bT_\b,_\b _\bA_\bl_\bi_\bg_\bn_\bm_\be_\bn_\bt_\b _\b>_\b:_\b:_\br_\be_\bb_\bi_\bn_\bd_\b<_\b _\bU_\b _\b>\n+\u00a0\n+N\bNa\bam\bme\bes\bsp\bpa\bac\bce\bes\bs\n+namespace \u00a0 _\bD_\bu_\bn_\be\n+\u00a0 _\bD_\bu_\bn_\be namespace.\n \u00a0\n-*\b**\b**\b**\b**\b* D\bDe\bet\bta\bai\bil\ble\bed\bd D\bDe\bes\bsc\bcr\bri\bip\bpt\bti\bio\bon\bn *\b**\b**\b**\b**\b*\n-Definitions of several macros that conditionally make C++ syntax available.\n-This header contains several macros that enable C++ features depending on your\n-compiler. Most of these features are optional and provide additional\n-functionality like making code constexpr.\n ===============================================================================\n Generated by\u00a0_\b[_\bd_\bo_\bx_\by_\bg_\be_\bn_\b] 1.9.8\n"}]}, {"source1": "./usr/share/doc/libdune-common-doc/doxygen/a00008_source.html", "source2": "./usr/share/doc/libdune-common-doc/doxygen/a00008_source.html", "unified_diff": "@@ -1,15 +1,15 @@\n \n \n \n \n \n \n \n-dune-common: keywords.hh Source File\n+dune-common: alignedallocator.hh Source File\n \n \n \n \n \n \n \n@@ -74,41 +74,123 @@\n \n
\n \n
\n \n
\n-
keywords.hh
\n+
alignedallocator.hh
\n
\n
\n-Go to the documentation of this file.
1// SPDX-FileCopyrightInfo: Copyright \u00a9 DUNE Project contributors, see file LICENSE.md in module root
\n-
2// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception
\n-
3#ifndef DUNE_COMMON_KEYWORDS_HH
\n-
4#define DUNE_COMMON_KEYWORDS_HH
\n-
5
\n-
6#warning This header is deprecated and will be removed after Dune 2.10. All key words are supported by C++ 17.
\n+Go to the documentation of this file.
1// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
\n+
2// vi: set et ts=4 sw=2 sts=2:
\n+
3// SPDX-FileCopyrightInfo: Copyright \u00a9 DUNE Project contributors, see file LICENSE.md in module root
\n+
4// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception
\n+
5#ifndef DUNE_ALIGNED_ALLOCATOR_HH
\n+
6#define DUNE_ALIGNED_ALLOCATOR_HH
\n
7
\n-
20#if __cpp_inline_variables >= 201606
\n-
21#define DUNE_INLINE_VARIABLE inline
\n-
22#else
\n+
8#include "mallocallocator.hh"
\n+
9#include <cstdlib>
\n+
10#include <type_traits>
\n+
11
\n+
\n+
12namespace Dune
\n+
13{
\n+
14
\n+
22 template<class T, int Alignment = -1>
\n+
\n+\n
24
\n-
27#define DUNE_INLINE_VARIABLE
\n-
28#endif
\n-
29
\n-
30
\n-
31#if __cpp_constexpr >= 201304
\n-
32#define DUNE_GENERALIZED_CONSTEXPR constexpr
\n-
33#else
\n-
35
\n-
38#define DUNE_GENERALIZED_CONSTEXPR
\n-
39#endif
\n-
40
\n-
41
\n-
42#endif // DUNE_COMMON_KEYWORDS_HH
\n+
25#if __APPLE__
\n+
26
\n+
27 /*
\n+
28 * macOS has pretty draconian restrictions on the
\n+
29 * alignments that you may ask for: It has to be
\n+
30 *
\n+
31 * 1) a power of 2
\n+
32 * 2) at least as large as sizeof(void*)
\n+
33 *
\n+
34 * So here is a little constexpr function that calculates just that
\n+
35 * (together with the correct starting value for align fed in further down).
\n+
36 */
\n+
37 static constexpr int fixAlignment(int align)
\n+
38 {
\n+
39 return ((Alignment==-1) ? std::alignment_of<T>::value : Alignment) > align
\n+
40 ? fixAlignment(align << 1) : align;
\n+
41 }
\n+
42
\n+
43#else
\n+
44
\n+
45 /*
\n+
46 * Non-Apple platforms we just have to check whether an explicit alignment was
\n+
47 * restricted or fall back to the default alignment of T.
\n+
48 */
\n+
49 static constexpr int fixAlignment(int align)
\n+
50 {
\n+
51 return (Alignment==-1) ? std::alignment_of<T>::value : Alignment;
\n+
52 }
\n+
53
\n+
54#endif
\n+
55
\n+
56 public:
\n+\n+\n+
\n+
59 template <class U> struct rebind {
\n+\n+
61 };
\n+
\n+
62
\n+
63 static constexpr int alignment = fixAlignment(sizeof(void*));
\n+
64
\n+
\n+
66 pointer allocate(size_type n, [[maybe_unused]] const void* hint = 0)
\n+
67 {
\n+
68 if (n > this->max_size())
\n+
69 throw std::bad_alloc();
\n+
70
\n+
71#if __APPLE__
\n+
72 // Apple is also restrictive regarding the allocation size.
\n+
73 // size must be at least the alignment size.
\n+
74 size_type size = n * sizeof(T) >= alignment ? n * sizeof(T) : alignment;
\n+
75#else
\n+
76 size_type size = n * sizeof(T);
\n+
77#endif
\n+
78
\n+
79 /*
\n+
80 * Everybody else gets the standard treatment.
\n+
81 */
\n+
82 pointer ret = static_cast<pointer>(std::aligned_alloc(alignment, size));
\n+
83 if (!ret)
\n+
84 throw std::bad_alloc();
\n+
85
\n+
86 return ret;
\n+
87 }
\n+
\n+
88 };
\n+
\n+
89
\n+
90}
\n+
\n+
91
\n+
92#endif // DUNE_ALIGNED_ALLOCATOR_HH
\n+
Allocators that use malloc/free.
\n+
Dune namespace.
Definition alignedallocator.hh:13
\n+
constexpr std::integral_constant< std::size_t, sizeof...(II)> size(std::integer_sequence< T, II... >)
Return the size of the sequence.
Definition integersequence.hh:75
\n+
Allocators which guarantee alignment of the memory.
Definition alignedallocator.hh:23
\n+
typename MallocAllocator< T >::size_type size_type
Definition alignedallocator.hh:58
\n+
pointer allocate(size_type n, const void *hint=0)
allocate n objects of type T
Definition alignedallocator.hh:66
\n+
typename MallocAllocator< T >::pointer pointer
Definition alignedallocator.hh:57
\n+
static constexpr int alignment
Definition alignedallocator.hh:63
\n+
Definition alignedallocator.hh:59
\n+
AlignedAllocator< U, Alignment > other
Definition alignedallocator.hh:60
\n+
Allocators implementation which simply calls malloc/free.
Definition mallocallocator.hh:24
\n+
T * pointer
Definition mallocallocator.hh:28
\n+
std::size_t size_type
Definition mallocallocator.hh:26
\n+
size_type max_size() const noexcept
max size for allocate
Definition mallocallocator.hh:74
\n
\n \n
\n Generated by \"doxygen\"/ 1.9.8\n
\n \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,36 +1,140 @@\n dune-common\u00a02.10\n Loading...\n Searching...\n No Matches\n * _\bd_\bu_\bn_\be\n * _\bc_\bo_\bm_\bm_\bo_\bn\n-keywords.hh\n+alignedallocator.hh\n _\bG_\bo_\b _\bt_\bo_\b _\bt_\bh_\be_\b _\bd_\bo_\bc_\bu_\bm_\be_\bn_\bt_\ba_\bt_\bi_\bo_\bn_\b _\bo_\bf_\b _\bt_\bh_\bi_\bs_\b _\bf_\bi_\bl_\be_\b.\n-1// SPDX-FileCopyrightInfo: Copyright \u00c2\u00a9 DUNE Project contributors, see file\n+1// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-\n+2// vi: set et ts=4 sw=2 sts=2:\n+3// SPDX-FileCopyrightInfo: Copyright \u00c2\u00a9 DUNE Project contributors, see file\n LICENSE.md in module root\n-2// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception\n-3#ifndef DUNE_COMMON_KEYWORDS_HH\n-4#define DUNE_COMMON_KEYWORDS_HH\n-5\n-6#warning This header is deprecated and will be removed after Dune 2.10. All\n-key words are supported by C++ 17.\n+4// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception\n+5#ifndef DUNE_ALIGNED_ALLOCATOR_HH\n+6#define DUNE_ALIGNED_ALLOCATOR_HH\n 7\n-20#if __cpp_inline_variables >= 201606\n-21#define DUNE_INLINE_VARIABLE inline\n-22#else\n+8#include \"_\bm_\ba_\bl_\bl_\bo_\bc_\ba_\bl_\bl_\bo_\bc_\ba_\bt_\bo_\br_\b._\bh_\bh\"\n+9#include \n+10#include \n+11\n+_\b1_\b2namespace _\bD_\bu_\bn_\be\n+13{\n+14\n+22 template\n+_\b2_\b3 class _\bA_\bl_\bi_\bg_\bn_\be_\bd_\bA_\bl_\bl_\bo_\bc_\ba_\bt_\bo_\br : public _\bM_\ba_\bl_\bl_\bo_\bc_\bA_\bl_\bl_\bo_\bc_\ba_\bt_\bo_\br {\n 24\n-_\b2_\b7#define DUNE_INLINE_VARIABLE\n-28#endif\n-29\n-30\n-31#if __cpp_constexpr >= 201304\n-32#define DUNE_GENERALIZED_CONSTEXPR constexpr\n-33#else\n-35\n-_\b3_\b8#define DUNE_GENERALIZED_CONSTEXPR\n-39#endif\n-40\n-41\n-42#endif // DUNE_COMMON_KEYWORDS_HH\n+25#if __APPLE__\n+26\n+27 /*\n+28 * macOS has pretty draconian restrictions on the\n+29 * alignments that you may ask for: It has to be\n+30 *\n+31 * 1) a power of 2\n+32 * 2) at least as large as sizeof(void*)\n+33 *\n+34 * So here is a little constexpr function that calculates just that\n+35 * (together with the correct starting value for align fed in further down).\n+36 */\n+37 static constexpr int fixAlignment(int align)\n+38 {\n+39 return ((Alignment==-1) ? std::alignment_of::value : Alignment) > align\n+40 ? fixAlignment(align << 1) : align;\n+41 }\n+42\n+43#else\n+44\n+45 /*\n+46 * Non-Apple platforms we just have to check whether an explicit alignment\n+was\n+47 * restricted or fall back to the default alignment of T.\n+48 */\n+49 static constexpr int fixAlignment(int align)\n+50 {\n+51 return (Alignment==-1) ? std::alignment_of::value : Alignment;\n+52 }\n+53\n+54#endif\n+55\n+56 public:\n+_\b5_\b7 using _\bp_\bo_\bi_\bn_\bt_\be_\br = typename _\bM_\ba_\bl_\bl_\bo_\bc_\bA_\bl_\bl_\bo_\bc_\ba_\bt_\bo_\br_\b<_\bT_\b>_\b:_\b:_\bp_\bo_\bi_\bn_\bt_\be_\br;\n+_\b5_\b8 using _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be = typename _\bM_\ba_\bl_\bl_\bo_\bc_\bA_\bl_\bl_\bo_\bc_\ba_\bt_\bo_\br_\b<_\bT_\b>_\b:_\b:_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be;\n+_\b5_\b9 template struct _\br_\be_\bb_\bi_\bn_\bd {\n+_\b6_\b0 typedef _\bA_\bl_\bi_\bg_\bn_\be_\bd_\bA_\bl_\bl_\bo_\bc_\ba_\bt_\bo_\br_\b<_\bU_\b,_\bA_\bl_\bi_\bg_\bn_\bm_\be_\bn_\bt_\b> _\bo_\bt_\bh_\be_\br;\n+61 };\n+62\n+_\b6_\b3 static constexpr int _\ba_\bl_\bi_\bg_\bn_\bm_\be_\bn_\bt = fixAlignment(sizeof(void*));\n+64\n+_\b6_\b6 _\bp_\bo_\bi_\bn_\bt_\be_\br _\ba_\bl_\bl_\bo_\bc_\ba_\bt_\be(_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be n, [[maybe_unused]] const void* hint = 0)\n+67 {\n+68 if (n > this->_\bm_\ba_\bx_\b__\bs_\bi_\bz_\be())\n+69 throw std::bad_alloc();\n+70\n+71#if __APPLE__\n+72 // Apple is also restrictive regarding the allocation size.\n+73 // size must be at least the alignment size.\n+74 _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be _\bs_\bi_\bz_\be = n * sizeof(T) >= _\ba_\bl_\bi_\bg_\bn_\bm_\be_\bn_\bt ? n * sizeof(T) : _\ba_\bl_\bi_\bg_\bn_\bm_\be_\bn_\bt;\n+75#else\n+76 _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be _\bs_\bi_\bz_\be = n * sizeof(T);\n+77#endif\n+78\n+79 /*\n+80 * Everybody else gets the standard treatment.\n+81 */\n+82 _\bp_\bo_\bi_\bn_\bt_\be_\br ret = static_cast<_\bp_\bo_\bi_\bn_\bt_\be_\br>(std::aligned_alloc(_\ba_\bl_\bi_\bg_\bn_\bm_\be_\bn_\bt, _\bs_\bi_\bz_\be));\n+83 if (!ret)\n+84 throw std::bad_alloc();\n+85\n+86 return ret;\n+87 }\n+88 };\n+89\n+90}\n+91\n+92#endif // DUNE_ALIGNED_ALLOCATOR_HH\n+_\bm_\ba_\bl_\bl_\bo_\bc_\ba_\bl_\bl_\bo_\bc_\ba_\bt_\bo_\br_\b._\bh_\bh\n+Allocators that use malloc/free.\n+_\bD_\bu_\bn_\be\n+Dune namespace.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn alignedallocator.hh:13\n+_\bD_\bu_\bn_\be_\b:_\b:_\bs_\bi_\bz_\be\n+constexpr std::integral_constant< std::size_t, sizeof...(II)> size(std::\n+integer_sequence< T, II... >)\n+Return the size of the sequence.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn integersequence.hh:75\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bl_\bi_\bg_\bn_\be_\bd_\bA_\bl_\bl_\bo_\bc_\ba_\bt_\bo_\br\n+Allocators which guarantee alignment of the memory.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn alignedallocator.hh:23\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bl_\bi_\bg_\bn_\be_\bd_\bA_\bl_\bl_\bo_\bc_\ba_\bt_\bo_\br_\b:_\b:_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be\n+typename MallocAllocator< T >::size_type size_type\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn alignedallocator.hh:58\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bl_\bi_\bg_\bn_\be_\bd_\bA_\bl_\bl_\bo_\bc_\ba_\bt_\bo_\br_\b:_\b:_\ba_\bl_\bl_\bo_\bc_\ba_\bt_\be\n+pointer allocate(size_type n, const void *hint=0)\n+allocate n objects of type T\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn alignedallocator.hh:66\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bl_\bi_\bg_\bn_\be_\bd_\bA_\bl_\bl_\bo_\bc_\ba_\bt_\bo_\br_\b:_\b:_\bp_\bo_\bi_\bn_\bt_\be_\br\n+typename MallocAllocator< T >::pointer pointer\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn alignedallocator.hh:57\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bl_\bi_\bg_\bn_\be_\bd_\bA_\bl_\bl_\bo_\bc_\ba_\bt_\bo_\br_\b:_\b:_\ba_\bl_\bi_\bg_\bn_\bm_\be_\bn_\bt\n+static constexpr int alignment\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn alignedallocator.hh:63\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bl_\bi_\bg_\bn_\be_\bd_\bA_\bl_\bl_\bo_\bc_\ba_\bt_\bo_\br_\b:_\b:_\br_\be_\bb_\bi_\bn_\bd\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn alignedallocator.hh:59\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bl_\bi_\bg_\bn_\be_\bd_\bA_\bl_\bl_\bo_\bc_\ba_\bt_\bo_\br_\b:_\b:_\br_\be_\bb_\bi_\bn_\bd_\b:_\b:_\bo_\bt_\bh_\be_\br\n+AlignedAllocator< U, Alignment > other\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn alignedallocator.hh:60\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bl_\bl_\bo_\bc_\bA_\bl_\bl_\bo_\bc_\ba_\bt_\bo_\br\n+Allocators implementation which simply calls malloc/free.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mallocallocator.hh:24\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bl_\bl_\bo_\bc_\bA_\bl_\bl_\bo_\bc_\ba_\bt_\bo_\br_\b:_\b:_\bp_\bo_\bi_\bn_\bt_\be_\br\n+T * pointer\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mallocallocator.hh:28\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bl_\bl_\bo_\bc_\bA_\bl_\bl_\bo_\bc_\ba_\bt_\bo_\br_\b:_\b:_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be\n+std::size_t size_type\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mallocallocator.hh:26\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bl_\bl_\bo_\bc_\bA_\bl_\bl_\bo_\bc_\ba_\bt_\bo_\br_\b:_\b:_\bm_\ba_\bx_\b__\bs_\bi_\bz_\be\n+size_type max_size() const noexcept\n+max size for allocate\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mallocallocator.hh:74\n ===============================================================================\n Generated by\u00a0_\b[_\bd_\bo_\bx_\by_\bg_\be_\bn_\b] 1.9.8\n"}]}, {"source1": "./usr/share/doc/libdune-common-doc/doxygen/a00011.html", "source2": "./usr/share/doc/libdune-common-doc/doxygen/a00011.html", "unified_diff": "@@ -1,15 +1,15 @@\n \n \n \n \n \n \n \n-dune-common: visibility.hh File Reference\n+dune-common: scalarmatrixview.hh File Reference\n \n \n \n \n \n \n \n@@ -70,70 +70,41 @@\n
\n \n
\n
\n
\n
\n-Macros
\n-
visibility.hh File Reference
\n+Namespaces
\n+
scalarmatrixview.hh File Reference
\n \n
\n \n-

Definition of macros controlling symbol visibility at the ABI level. \n+

Implements a scalar matrix view wrapper around an existing scalar. \n More...

\n-\n+
#include <cstddef>
\n+#include <type_traits>
\n+#include <ostream>
\n+#include <dune/common/boundschecking.hh>
\n+#include <dune/common/typetraits.hh>
\n+#include <dune/common/matvectraits.hh>
\n+#include <dune/common/densematrix.hh>
\n+#include <dune/common/fmatrix.hh>
\n+#include <dune/common/scalarvectorview.hh>
\n+
\n

Go to the source code of this file.

\n \n-\n-\n-\n-\n-\n-\n-\n+\n+\n+\n+\n

\n-Macros

#define DUNE_EXPORT   implementation_defined
 Export a symbol as part of the public ABI.
 
#define DUNE_PRIVATE   implementation_defined
 Mark a symbol as being for internal use within the current DSO only.
 

\n+Namespaces

namespace  Dune
 Dune namespace.
 
\n

Detailed Description

\n-

Definition of macros controlling symbol visibility at the ABI level.

\n-

Macro Definition Documentation

\n-\n-

◆ DUNE_EXPORT

\n-\n-
\n-
\n- \n- \n- \n- \n-
#define DUNE_EXPORT   implementation_defined
\n-
\n-\n-

Export a symbol as part of the public ABI.

\n-

Mark a class, function or static variable as visible outside the current DSO. For now, this is mostly important for templated global variables and functions that contain static variables.

\n-\n-
\n-
\n-\n-

◆ DUNE_PRIVATE

\n-\n-
\n-
\n- \n- \n- \n- \n-
#define DUNE_PRIVATE   implementation_defined
\n-
\n-\n-

Mark a symbol as being for internal use within the current DSO only.

\n-

Mark a class, function or static variable as inaccessible from outside the current DSO. Doing so will decrease the size of the symbol table, but you have to be sure that the symbol will never have to be accessed from another library or the main executable!

\n-\n-
\n-
\n-
\n+

Implements a scalar matrix view wrapper around an existing scalar.

\n+
\n \n
\n Generated by \"doxygen\"/ 1.9.8\n
\n \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,35 +1,28 @@\n dune-common\u00a02.10\n Loading...\n Searching...\n No Matches\n * _\bd_\bu_\bn_\be\n * _\bc_\bo_\bm_\bm_\bo_\bn\n-_\bM_\ba_\bc_\br_\bo_\bs\n-visibility.hh File Reference\n-Definition of macros controlling symbol visibility at the ABI level. _\bM_\bo_\br_\be_\b._\b._\b.\n+_\bN_\ba_\bm_\be_\bs_\bp_\ba_\bc_\be_\bs\n+scalarmatrixview.hh File Reference\n+_\bC_\bo_\bm_\bm_\bo_\bn \u00bb _\bD_\be_\bn_\bs_\be_\b _\bM_\ba_\bt_\br_\bi_\bx_\b _\ba_\bn_\bd_\b _\bV_\be_\bc_\bt_\bo_\br_\b _\bT_\be_\bm_\bp_\bl_\ba_\bt_\be_\b _\bL_\bi_\bb_\br_\ba_\br_\by\n+Implements a scalar matrix view wrapper around an existing scalar. _\bM_\bo_\br_\be_\b._\b._\b.\n+#include \n+#include \n+#include \n+#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bb_\bo_\bu_\bn_\bd_\bs_\bc_\bh_\be_\bc_\bk_\bi_\bn_\bg_\b._\bh_\bh>\n+#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bt_\by_\bp_\be_\bt_\br_\ba_\bi_\bt_\bs_\b._\bh_\bh>\n+#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bm_\ba_\bt_\bv_\be_\bc_\bt_\br_\ba_\bi_\bt_\bs_\b._\bh_\bh>\n+#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bd_\be_\bn_\bs_\be_\bm_\ba_\bt_\br_\bi_\bx_\b._\bh_\bh>\n+#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bf_\bm_\ba_\bt_\br_\bi_\bx_\b._\bh_\bh>\n+#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bs_\bc_\ba_\bl_\ba_\br_\bv_\be_\bc_\bt_\bo_\br_\bv_\bi_\be_\bw_\b._\bh_\bh>\n _\bG_\bo_\b _\bt_\bo_\b _\bt_\bh_\be_\b _\bs_\bo_\bu_\br_\bc_\be_\b _\bc_\bo_\bd_\be_\b _\bo_\bf_\b _\bt_\bh_\bi_\bs_\b _\bf_\bi_\bl_\be_\b.\n-M\bMa\bac\bcr\bro\bos\bs\n-#define\u00a0 _\bD_\bU_\bN_\bE_\b__\bE_\bX_\bP_\bO_\bR_\bT\u00a0\u00a0\u00a0implementation_defined\n-\u00a0 Export a symbol as part of the public ABI.\n-\u00a0\n-#define\u00a0 _\bD_\bU_\bN_\bE_\b__\bP_\bR_\bI_\bV_\bA_\bT_\bE\u00a0\u00a0\u00a0implementation_defined\n-\u00a0 Mark a symbol as being for internal use within the current DSO only.\n+N\bNa\bam\bme\bes\bsp\bpa\bac\bce\bes\bs\n+namespace \u00a0 _\bD_\bu_\bn_\be\n+\u00a0 _\bD_\bu_\bn_\be namespace.\n \u00a0\n *\b**\b**\b**\b**\b* D\bDe\bet\bta\bai\bil\ble\bed\bd D\bDe\bes\bsc\bcr\bri\bip\bpt\bti\bio\bon\bn *\b**\b**\b**\b**\b*\n-Definition of macros controlling symbol visibility at the ABI level.\n-*\b**\b**\b**\b**\b* M\bMa\bac\bcr\bro\bo D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn D\bDo\boc\bcu\bum\bme\ben\bnt\bta\bat\bti\bio\bon\bn *\b**\b**\b**\b**\b*\n-*\b**\b**\b**\b**\b* _\b?\b\u25c6_\b?\b\u00a0D\bDU\bUN\bNE\bE_\b_E\bEX\bXP\bPO\bOR\bRT\bT *\b**\b**\b**\b**\b*\n-#define DUNE_EXPORT\u00a0\u00a0\u00a0implementation_defined\n-Export a symbol as part of the public ABI.\n-Mark a class, function or static variable as visible outside the current DSO.\n-For now, this is mostly important for templated global variables and functions\n-that contain static variables.\n-*\b**\b**\b**\b**\b* _\b?\b\u25c6_\b?\b\u00a0D\bDU\bUN\bNE\bE_\b_P\bPR\bRI\bIV\bVA\bAT\bTE\bE *\b**\b**\b**\b**\b*\n-#define DUNE_PRIVATE\u00a0\u00a0\u00a0implementation_defined\n-Mark a symbol as being for internal use within the current DSO only.\n-Mark a class, function or static variable as inaccessible from outside the\n-current DSO. Doing so will decrease the size of the symbol table, but you have\n-to be sure that the symbol will never have to be accessed from another library\n-or the main executable!\n+Implements a scalar matrix view wrapper around an existing scalar.\n ===============================================================================\n Generated by\u00a0_\b[_\bd_\bo_\bx_\by_\bg_\be_\bn_\b] 1.9.8\n"}]}, {"source1": "./usr/share/doc/libdune-common-doc/doxygen/a00011_source.html", "source2": "./usr/share/doc/libdune-common-doc/doxygen/a00011_source.html", "unified_diff": "@@ -1,15 +1,15 @@\n \n \n \n \n \n \n \n-dune-common: visibility.hh Source File\n+dune-common: scalarmatrixview.hh Source File\n \n \n \n \n \n \n \n@@ -74,48 +74,198 @@\n \n
\n \n
\n \n
\n-
visibility.hh
\n+
scalarmatrixview.hh
\n
\n
\n Go to the documentation of this file.
1// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
\n
2// vi: set et ts=4 sw=2 sts=2:
\n
3// SPDX-FileCopyrightInfo: Copyright \u00a9 DUNE Project contributors, see file LICENSE.md in module root
\n
4// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception
\n-
5#ifndef DUNE_COMMON_VISIBILITY_HH
\n-
6#define DUNE_COMMON_VISIBILITY_HH
\n+
5#ifndef DUNE_COMMON_SCALARMATRIXVIEW_HH
\n+
6#define DUNE_COMMON_SCALARMATRIXVIEW_HH
\n
7
\n-
12#ifdef DOXYGEN
\n-
13
\n-
15
\n-
20#define DUNE_EXPORT implementation_defined
\n+
8#include <cstddef>
\n+
9#include <type_traits>
\n+
10#include <ostream>
\n+
11
\n+\n+\n+\n+\n+\n+\n+
18
\n+
19
\n+
20namespace Dune {
\n
21
\n+
22namespace Impl {
\n
23
\n-
28#define DUNE_PRIVATE implementation_defined
\n-
29
\n-
30#else // DOXYGEN
\n-
31
\n-
32#if __GNUC__ >= 4
\n-
33// GCC and Clang both define __GNUC__ to 4 and they both support the visibility
\n-
34// attribute
\n-
35#define DUNE_EXPORT __attribute__((visibility("default")))
\n-
36#define DUNE_PRIVATE __attribute__((visibility("hidden")))
\n-
37#else
\n-
38// We don't know about the active compiler, so just turn the visibility macros to no-ops.
\n-
39#define DUNE_EXPORT
\n-
40#define DUNE_PRIVATE
\n-
41#endif
\n-
42
\n-
43#endif // DOXYGEN
\n-
44
\n-
45#endif // DUNE_COMMON_VISIBILITY
\n+
39 template<class K>
\n+
40 class ScalarMatrixView :
\n+
41 public DenseMatrix<ScalarMatrixView<K>>
\n+
42 {
\n+
43 ScalarVectorView<K> data_;
\n+
44 using Base = DenseMatrix<ScalarMatrixView<K>>;
\n+
45
\n+
46 template <class>
\n+
47 friend class ScalarMatrixView;
\n+
48 public:
\n+
49
\n+
50 //===== type definitions and constants
\n+
51
\n+
54 constexpr static int blocklevel = 1;
\n+
55
\n+
56 using size_type = typename Base::size_type;
\n+
57 using row_type = typename Base::row_type;
\n+
58 using row_reference = typename Base::row_reference;
\n+\n+
60
\n+
63 constexpr static int rows = 1;
\n+
66 constexpr static int cols = 1;
\n+
67
\n+
68 //===== constructors
\n+
71 constexpr ScalarMatrixView ()
\n+
72 : data_()
\n+
73 {}
\n+
74
\n+
76 ScalarMatrixView (K* p) :
\n+
77 data_(p)
\n+
78 {}
\n+
79
\n+
81 ScalarMatrixView (const ScalarMatrixView &other) :
\n+
82 Base(),
\n+
83 data_(other.data_)
\n+
84 {}
\n+
85
\n+
87 ScalarMatrixView (ScalarMatrixView &&other) :
\n+
88 Base(),
\n+
89 data_( other.data_ )
\n+
90 {}
\n+
91
\n+
93 ScalarMatrixView& operator= (const ScalarMatrixView& other)
\n+
94 {
\n+
95 data_ = other.data_;
\n+
96 return *this;
\n+
97 }
\n+
98
\n+
99 template<class KK>
\n+
100 ScalarMatrixView& operator= (const ScalarMatrixView<KK>& other)
\n+
101 {
\n+
102 data_ = other.data_;
\n+
103 return *this;
\n+
104 }
\n+
105
\n+
107 template<typename T,
\n+
108 std::enable_if_t<std::is_convertible<T, K>::value, int> = 0>
\n+
109 inline ScalarMatrixView& operator= (const T& k)
\n+
110 {
\n+
111 data_ = k;
\n+
112 return *this;
\n+
113 }
\n+
114
\n+
115 // make this thing a matrix
\n+
116 static constexpr size_type mat_rows() { return 1; }
\n+
117 static constexpr size_type mat_cols() { return 1; }
\n+
118
\n+
119 row_reference mat_access ([[maybe_unused]] size_type i)
\n+
120 {
\n+
121 DUNE_ASSERT_BOUNDS(i == 0);
\n+
122 return data_;
\n+
123 }
\n+
124
\n+
125 const_row_reference mat_access ([[maybe_unused]] size_type i) const
\n+
126 {
\n+
127 DUNE_ASSERT_BOUNDS(i == 0);
\n+
128 return data_;
\n+
129 }
\n+
130 }; // class ScalarMatrixView
\n+
131
\n+
133 template<typename K>
\n+
134 std::ostream& operator<< (std::ostream& s, const ScalarMatrixView<K>& a)
\n+
135 {
\n+
136 s << a[0][0];
\n+
137 return s;
\n+
138 }
\n+
139
\n+
141 template<class T,
\n+
142 std::enable_if_t<IsNumber<T>::value, int> = 0>
\n+
143 auto asMatrix(T& t)
\n+
144 {
\n+
145 return ScalarMatrixView<T>{&t};
\n+
146 }
\n+
147
\n+
149 template<class T,
\n+
150 std::enable_if_t<IsNumber<T>::value, int> = 0>
\n+
151 auto asMatrix(const T& t)
\n+
152 {
\n+
153 return ScalarMatrixView<const T>{&t};
\n+
154 }
\n+
155
\n+
157 template<class T,
\n+
158 std::enable_if_t<not IsNumber<T>::value, int> = 0>
\n+
159 T& asMatrix(T& t)
\n+
160 {
\n+
161 return t;
\n+
162 }
\n+
163
\n+
165 template<class T,
\n+
166 std::enable_if_t<not IsNumber<T>::value, int> = 0>
\n+
167 const T& asMatrix(const T& t)
\n+
168 {
\n+
169 return t;
\n+
170 }
\n+
171
\n+
174} // end namespace Impl
\n+
175
\n+
176 template<class K>
\n+
177 struct FieldTraits<Impl::ScalarMatrixView<K>> : public FieldTraits<std::remove_const_t<K>> {};
\n+
178
\n+
179 template<class K>
\n+
180 struct DenseMatVecTraits<Impl::ScalarMatrixView<K>>
\n+
181 {
\n+
182 using derived_type = Impl::ScalarMatrixView<K>;
\n+
183 using row_type = Impl::ScalarVectorView<K>;
\n+
184 using row_reference = row_type&;
\n+
185 using const_row_reference = const row_type&;
\n+
186 using value_type = std::remove_const_t<K>;
\n+
187 using size_type = std::size_t;
\n+
188 };
\n+
189
\n+
190
\n+
191 template<class K>
\n+
192 struct AutonomousValueType<Impl::ScalarMatrixView<K>>
\n+
193 {
\n+
194 using type = FieldMatrix<std::remove_const_t<K>,1,1>;
\n+
195 };
\n+
196
\n+
197
\n+
198} // end namespace Dune
\n+
199
\n+
200#endif // DUNE_COMMON_SCALARMATRIXVIEW_HH
\n+
Implements a matrix constructed from a given type representing a field and a compile-time given numbe...
\n+
Traits for type conversions and type information.
\n+
Macro for wrapping boundary checks.
\n+
Documentation of the traits classes you need to write for each implementation of DenseVector or Dense...
\n+
Implements a matrix constructed from a given type representing a field and compile-time given number ...
\n+
Implements a scalar vector view wrapper around an existing scalar.
\n+
#define DUNE_ASSERT_BOUNDS(cond)
If DUNE_CHECK_BOUNDS is defined: check if condition cond holds; otherwise, do nothing.
Definition boundschecking.hh:30
\n+
Dune namespace.
Definition alignedallocator.hh:13
\n+
constexpr size_type cols() const
number of columns
Definition densematrix.hh:715
\n+
constexpr size_type rows() const
number of rows
Definition densematrix.hh:709
\n+
static constexpr int blocklevel
The number of block levels we contain. This is the leaf, that is, 1.
Definition densematrix.hh:178
\n+
Traits::row_type row_type
The type used to represent a row (must fulfill the Dune::DenseVector interface)
Definition densematrix.hh:169
\n+
Traits::size_type size_type
The type used for the index access and size operation.
Definition densematrix.hh:166
\n+
Traits::const_row_reference const_row_reference
The type used to represent a reference to a constant row (usually const row_type &)
Definition densematrix.hh:175
\n+
Traits::row_reference row_reference
The type used to represent a reference to a row (usually row_type &)
Definition densematrix.hh:172
\n+
T type
Definition typetraits.hh:531
\n
\n \n
\n Generated by \"doxygen\"/ 1.9.8\n
\n \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,44 +1,232 @@\n dune-common\u00a02.10\n Loading...\n Searching...\n No Matches\n * _\bd_\bu_\bn_\be\n * _\bc_\bo_\bm_\bm_\bo_\bn\n-visibility.hh\n+scalarmatrixview.hh\n _\bG_\bo_\b _\bt_\bo_\b _\bt_\bh_\be_\b _\bd_\bo_\bc_\bu_\bm_\be_\bn_\bt_\ba_\bt_\bi_\bo_\bn_\b _\bo_\bf_\b _\bt_\bh_\bi_\bs_\b _\bf_\bi_\bl_\be_\b.\n 1// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-\n 2// vi: set et ts=4 sw=2 sts=2:\n 3// SPDX-FileCopyrightInfo: Copyright \u00c2\u00a9 DUNE Project contributors, see file\n LICENSE.md in module root\n 4// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception\n-5#ifndef DUNE_COMMON_VISIBILITY_HH\n-6#define DUNE_COMMON_VISIBILITY_HH\n+5#ifndef DUNE_COMMON_SCALARMATRIXVIEW_HH\n+6#define DUNE_COMMON_SCALARMATRIXVIEW_HH\n 7\n-12#ifdef DOXYGEN\n-13\n-15\n-_\b2_\b0#define DUNE_EXPORT implementation_defined\n+8#include \n+9#include \n+10#include \n+11\n+12#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bb_\bo_\bu_\bn_\bd_\bs_\bc_\bh_\be_\bc_\bk_\bi_\bn_\bg_\b._\bh_\bh>\n+13#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bt_\by_\bp_\be_\bt_\br_\ba_\bi_\bt_\bs_\b._\bh_\bh>\n+14#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bm_\ba_\bt_\bv_\be_\bc_\bt_\br_\ba_\bi_\bt_\bs_\b._\bh_\bh>\n+15#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bd_\be_\bn_\bs_\be_\bm_\ba_\bt_\br_\bi_\bx_\b._\bh_\bh>\n+16#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bf_\bm_\ba_\bt_\br_\bi_\bx_\b._\bh_\bh>\n+17#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bs_\bc_\ba_\bl_\ba_\br_\bv_\be_\bc_\bt_\bo_\br_\bv_\bi_\be_\bw_\b._\bh_\bh>\n+18\n+19\n+20namespace _\bD_\bu_\bn_\be {\n 21\n+22namespace Impl {\n 23\n-_\b2_\b8#define DUNE_PRIVATE implementation_defined\n-29\n-30#else // DOXYGEN\n-31\n-32#if __GNUC__ >= 4\n-33// GCC and Clang both define __GNUC__ to 4 and they both support the\n-visibility\n-34// attribute\n-35#define DUNE_EXPORT __attribute__((visibility(\"default\")))\n-36#define DUNE_PRIVATE __attribute__((visibility(\"hidden\")))\n-37#else\n-38// We don't know about the active compiler, so just turn the visibility\n-macros to no-ops.\n-39#define DUNE_EXPORT\n-40#define DUNE_PRIVATE\n-41#endif\n-42\n-43#endif // DOXYGEN\n-44\n-45#endif // DUNE_COMMON_VISIBILITY\n+39 template\n+40 class ScalarMatrixView :\n+41 public DenseMatrix>\n+42 {\n+43 ScalarVectorView data_;\n+44 using Base = DenseMatrix>;\n+45\n+46 template \n+47 friend class ScalarMatrixView;\n+48 public:\n+49\n+50 //===== type definitions and constants\n+51\n+54 constexpr static int _\bb_\bl_\bo_\bc_\bk_\bl_\be_\bv_\be_\bl = 1;\n+55\n+56 using _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be = typename _\bB_\ba_\bs_\be_\b:_\b:_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be;\n+57 using _\br_\bo_\bw_\b__\bt_\by_\bp_\be = typename _\bB_\ba_\bs_\be_\b:_\b:_\br_\bo_\bw_\b__\bt_\by_\bp_\be;\n+58 using _\br_\bo_\bw_\b__\br_\be_\bf_\be_\br_\be_\bn_\bc_\be = typename _\bB_\ba_\bs_\be_\b:_\b:_\br_\bo_\bw_\b__\br_\be_\bf_\be_\br_\be_\bn_\bc_\be;\n+59 using _\bc_\bo_\bn_\bs_\bt_\b__\br_\bo_\bw_\b__\br_\be_\bf_\be_\br_\be_\bn_\bc_\be = typename _\bB_\ba_\bs_\be_\b:_\b:_\bc_\bo_\bn_\bs_\bt_\b__\br_\bo_\bw_\b__\br_\be_\bf_\be_\br_\be_\bn_\bc_\be;\n+60\n+63 constexpr static int _\br_\bo_\bw_\bs = 1;\n+66 constexpr static int _\bc_\bo_\bl_\bs = 1;\n+67\n+68 //===== constructors\n+71 constexpr ScalarMatrixView ()\n+72 : data_()\n+73 {}\n+74\n+76 ScalarMatrixView (K* p) :\n+77 data_(p)\n+78 {}\n+79\n+81 ScalarMatrixView (const ScalarMatrixView &other) :\n+82 Base(),\n+83 data_(other.data_)\n+84 {}\n+85\n+87 ScalarMatrixView (ScalarMatrixView &&other) :\n+88 Base(),\n+89 data_( other.data_ )\n+90 {}\n+91\n+93 ScalarMatrixView& operator= (const ScalarMatrixView& other)\n+94 {\n+95 data_ = other.data_;\n+96 return *this;\n+97 }\n+98\n+99 template\n+100 ScalarMatrixView& operator= (const ScalarMatrixView& other)\n+101 {\n+102 data_ = other.data_;\n+103 return *this;\n+104 }\n+105\n+107 template::value, int> = 0>\n+109 inline ScalarMatrixView& operator= (const T& k)\n+110 {\n+111 data_ = k;\n+112 return *this;\n+113 }\n+114\n+115 // make this thing a matrix\n+116 static constexpr _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be mat_rows() { return 1; }\n+117 static constexpr _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be mat_cols() { return 1; }\n+118\n+119 _\br_\bo_\bw_\b__\br_\be_\bf_\be_\br_\be_\bn_\bc_\be mat_access ([[maybe_unused]] size_type i)\n+120 {\n+121 _\bD_\bU_\bN_\bE_\b__\bA_\bS_\bS_\bE_\bR_\bT_\b__\bB_\bO_\bU_\bN_\bD_\bS(i == 0);\n+122 return data_;\n+123 }\n+124\n+125 _\bc_\bo_\bn_\bs_\bt_\b__\br_\bo_\bw_\b__\br_\be_\bf_\be_\br_\be_\bn_\bc_\be mat_access ([[maybe_unused]] size_type i) const\n+126 {\n+127 _\bD_\bU_\bN_\bE_\b__\bA_\bS_\bS_\bE_\bR_\bT_\b__\bB_\bO_\bU_\bN_\bD_\bS(i == 0);\n+128 return data_;\n+129 }\n+130 }; // class ScalarMatrixView\n+131\n+133 template\n+134 std::ostream& operator<< (std::ostream& s, const ScalarMatrixView& a)\n+135 {\n+136 s << a[0][0];\n+137 return s;\n+138 }\n+139\n+141 template::value, int> = 0>\n+143 auto asMatrix(T& t)\n+144 {\n+145 return ScalarMatrixView{&t};\n+146 }\n+147\n+149 template::value, int> = 0>\n+151 auto asMatrix(const T& t)\n+152 {\n+153 return ScalarMatrixView{&t};\n+154 }\n+155\n+157 template::value, int> = 0>\n+159 T& asMatrix(T& t)\n+160 {\n+161 return t;\n+162 }\n+163\n+165 template::value, int> = 0>\n+167 const T& asMatrix(const T& t)\n+168 {\n+169 return t;\n+170 }\n+171\n+174} // end namespace Impl\n+175\n+176 template\n+177 struct FieldTraits> : public FieldTraits> {};\n+178\n+179 template\n+180 struct DenseMatVecTraits>\n+181 {\n+182 using derived_type = Impl::ScalarMatrixView;\n+183 using row_type = Impl::ScalarVectorView;\n+184 using row_reference = row_type&;\n+185 using const_row_reference = const row_type&;\n+186 using value_type = std::remove_const_t;\n+187 using size_type = std::size_t;\n+188 };\n+189\n+190\n+191 template\n+192 struct AutonomousValueType>\n+193 {\n+194 using _\bt_\by_\bp_\be = FieldMatrix,1,1>;\n+195 };\n+196\n+197\n+198} // end namespace Dune\n+199\n+200#endif // DUNE_COMMON_SCALARMATRIXVIEW_HH\n+_\bd_\be_\bn_\bs_\be_\bm_\ba_\bt_\br_\bi_\bx_\b._\bh_\bh\n+Implements a matrix constructed from a given type representing a field and a\n+compile-time given numbe...\n+_\bt_\by_\bp_\be_\bt_\br_\ba_\bi_\bt_\bs_\b._\bh_\bh\n+Traits for type conversions and type information.\n+_\bb_\bo_\bu_\bn_\bd_\bs_\bc_\bh_\be_\bc_\bk_\bi_\bn_\bg_\b._\bh_\bh\n+Macro for wrapping boundary checks.\n+_\bm_\ba_\bt_\bv_\be_\bc_\bt_\br_\ba_\bi_\bt_\bs_\b._\bh_\bh\n+Documentation of the traits classes you need to write for each implementation\n+of DenseVector or Dense...\n+_\bf_\bm_\ba_\bt_\br_\bi_\bx_\b._\bh_\bh\n+Implements a matrix constructed from a given type representing a field and\n+compile-time given number ...\n+_\bs_\bc_\ba_\bl_\ba_\br_\bv_\be_\bc_\bt_\bo_\br_\bv_\bi_\be_\bw_\b._\bh_\bh\n+Implements a scalar vector view wrapper around an existing scalar.\n+_\bD_\bU_\bN_\bE_\b__\bA_\bS_\bS_\bE_\bR_\bT_\b__\bB_\bO_\bU_\bN_\bD_\bS\n+#define DUNE_ASSERT_BOUNDS(cond)\n+If DUNE_CHECK_BOUNDS is defined: check if condition cond holds; otherwise, do\n+nothing.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn boundschecking.hh:30\n+_\bD_\bu_\bn_\be\n+Dune namespace.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn alignedallocator.hh:13\n+_\bD_\bu_\bn_\be_\b:_\b:_\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bS_\bc_\ba_\bl_\ba_\br_\bM_\ba_\bt_\br_\bi_\bx_\bV_\bi_\be_\bw_\b<_\b _\bK_\b _\b>_\b _\b>_\b:_\b:_\bc_\bo_\bl_\bs\n+constexpr size_type cols() const\n+number of columns\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn densematrix.hh:715\n+_\bD_\bu_\bn_\be_\b:_\b:_\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bS_\bc_\ba_\bl_\ba_\br_\bM_\ba_\bt_\br_\bi_\bx_\bV_\bi_\be_\bw_\b<_\b _\bK_\b _\b>_\b _\b>_\b:_\b:_\br_\bo_\bw_\bs\n+constexpr size_type rows() const\n+number of rows\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn densematrix.hh:709\n+_\bD_\bu_\bn_\be_\b:_\b:_\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bS_\bc_\ba_\bl_\ba_\br_\bM_\ba_\bt_\br_\bi_\bx_\bV_\bi_\be_\bw_\b<_\b _\bK_\b _\b>_\b _\b>_\b:_\b:_\bb_\bl_\bo_\bc_\bk_\bl_\be_\bv_\be_\bl\n+static constexpr int blocklevel\n+The number of block levels we contain. This is the leaf, that is, 1.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn densematrix.hh:178\n+_\bD_\bu_\bn_\be_\b:_\b:_\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bS_\bc_\ba_\bl_\ba_\br_\bM_\ba_\bt_\br_\bi_\bx_\bV_\bi_\be_\bw_\b<_\b _\bK_\b _\b>_\b _\b>_\b:_\b:_\br_\bo_\bw_\b__\bt_\by_\bp_\be\n+Traits::row_type row_type\n+The type used to represent a row (must fulfill the Dune::DenseVector interface)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn densematrix.hh:169\n+_\bD_\bu_\bn_\be_\b:_\b:_\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bS_\bc_\ba_\bl_\ba_\br_\bM_\ba_\bt_\br_\bi_\bx_\bV_\bi_\be_\bw_\b<_\b _\bK_\b _\b>_\b _\b>_\b:_\b:_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be\n+Traits::size_type size_type\n+The type used for the index access and size operation.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn densematrix.hh:166\n+_\bD_\bu_\bn_\be_\b:_\b:_\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bS_\bc_\ba_\bl_\ba_\br_\bM_\ba_\bt_\br_\bi_\bx_\bV_\bi_\be_\bw_\b<_\b _\bK_\b _\b>_\b _\b>_\b:_\b:_\bc_\bo_\bn_\bs_\bt_\b__\br_\bo_\bw_\b__\br_\be_\bf_\be_\br_\be_\bn_\bc_\be\n+Traits::const_row_reference const_row_reference\n+The type used to represent a reference to a constant row (usually const\n+row_type &)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn densematrix.hh:175\n+_\bD_\bu_\bn_\be_\b:_\b:_\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bS_\bc_\ba_\bl_\ba_\br_\bM_\ba_\bt_\br_\bi_\bx_\bV_\bi_\be_\bw_\b<_\b _\bK_\b _\b>_\b _\b>_\b:_\b:_\br_\bo_\bw_\b__\br_\be_\bf_\be_\br_\be_\bn_\bc_\be\n+Traits::row_reference row_reference\n+The type used to represent a reference to a row (usually row_type &)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn densematrix.hh:172\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bu_\bt_\bo_\bn_\bo_\bm_\bo_\bu_\bs_\bV_\ba_\bl_\bu_\be_\bT_\by_\bp_\be_\b:_\b:_\bt_\by_\bp_\be\n+T type\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn typetraits.hh:531\n ===============================================================================\n Generated by\u00a0_\b[_\bd_\bo_\bx_\by_\bg_\be_\bn_\b] 1.9.8\n"}]}, {"source1": "./usr/share/doc/libdune-common-doc/doxygen/a00014.html", "source2": "./usr/share/doc/libdune-common-doc/doxygen/a00014.html", "unified_diff": "@@ -1,15 +1,15 @@\n \n \n \n \n \n \n \n-dune-common: simd.hh File Reference\n+dune-common: assertandreturn.hh File Reference\n \n \n \n \n \n \n \n@@ -70,96 +70,28 @@\n
\n \n
\n \n
\n \n-
simd.hh File Reference
\n+Macros
\n+
assertandreturn.hh File Reference
\n \n
\n-\n-

Abstractions for support of dedicated SIMD data types. \n-More...

\n
#include <cassert>
\n-#include <cstddef>
\n-#include <type_traits>
\n-#include <utility>
\n-#include <dune/common/conditional.hh>
\n-#include <dune/common/debugalign.hh>
\n-#include <dune/common/rangeutilities.hh>
\n-#include <dune/common/typetraits.hh>
\n-#include <dune/common/vc.hh>
\n
\n

Go to the source code of this file.

\n \n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-

\n-Classes

struct  Dune::SimdScalarTypeTraits< T >
 
struct  Dune::SimdScalarTypeTraits< AlignedNumber< T, align > >
 deduce the underlying scalar data type of an AlignedNumber More...
 
struct  Dune::SimdIndexTypeTraits< V, typename >
 
struct  Dune::SimdMaskTypeTraits< V, typename >
 
\n-\n-\n-\n-\n-

\n-Namespaces

namespace  Dune
 Dune namespace.
 
\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-

\n-Typedefs

template<typename T >
using Dune::SimdScalar = typename SimdScalarTypeTraits< T >::type
 
template<typename V >
using Dune::SimdIndex = typename SimdIndexTypeTraits< V >::type
 An simd vector of indices corresponding to a simd vector V.
 
template<typename V >
using Dune::SimdMask = typename SimdMaskTypeTraits< V >::type
 A simd vector of truth values corresponding to a simd vector V.
 
\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n+\n+\n+\n+\n

\n-Functions

template<class T >
std::size_t Dune::lanes (const T &)
 get the number of lanes of a simd vector (scalar version)
 
template<class T >
Dune::lane (std::size_t l, const T &v)
 access a lane of a simd vector (scalar version)
 
template<class T >
T & Dune::lane (std::size_t l, T &v)
 access a lane of a simd vector (scalar version)
 
template<class T >
void Dune::assign (T &dst, const T &src, bool mask)
 masked Simd assignment (scalar version)
 
template<class T >
void Dune::swap (T &v1, T &v2, bool mask)
 

\n+Macros

#define DUNE_ASSERT_AND_RETURN(C, X)   (!(C) ? throw [&](){assert(!#C);return 0;}() : 0), X
 Asserts a condition and return on success in constexpr context.
 
\n-

Detailed Description

\n-

Abstractions for support of dedicated SIMD data types.

\n-

Libraries like Vc (https://github.com/VcDevel/Vc) add high-level data types for SIMD (or vectorization) support in C++. Most of these operations mimic the behavior of a numerical data type. Some boolean operations can not be implemented in a compatible way to trivial data types.

\n-

This header contains additional abstractions to help writing code that works with trivial numerical data types (like double) and Vc vectorization data types.

\n-

See also the conditional.hh and range_utils.hh headers.

\n-
Deprecated:
Use the newer simd architecture from dune/common/simd/simd.hh instead.
\n-
\n+\n \n
\n Generated by \"doxygen\"/ 1.9.8\n
\n \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,79 +1,17 @@\n dune-common\u00a02.10\n Loading...\n Searching...\n No Matches\n * _\bd_\bu_\bn_\be\n * _\bc_\bo_\bm_\bm_\bo_\bn\n-_\bC_\bl_\ba_\bs_\bs_\be_\bs | _\bN_\ba_\bm_\be_\bs_\bp_\ba_\bc_\be_\bs | _\bT_\by_\bp_\be_\bd_\be_\bf_\bs | _\bF_\bu_\bn_\bc_\bt_\bi_\bo_\bn_\bs\n-simd.hh File Reference\n-Abstractions for support of dedicated SIMD data types. _\bM_\bo_\br_\be_\b._\b._\b.\n+_\bM_\ba_\bc_\br_\bo_\bs\n+assertandreturn.hh File Reference\n #include \n-#include \n-#include \n-#include \n-#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\ba_\bl_\b._\bh_\bh>\n-#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bd_\be_\bb_\bu_\bg_\ba_\bl_\bi_\bg_\bn_\b._\bh_\bh>\n-#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\br_\ba_\bn_\bg_\be_\bu_\bt_\bi_\bl_\bi_\bt_\bi_\be_\bs_\b._\bh_\bh>\n-#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bt_\by_\bp_\be_\bt_\br_\ba_\bi_\bt_\bs_\b._\bh_\bh>\n-#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bv_\bc_\b._\bh_\bh>\n _\bG_\bo_\b _\bt_\bo_\b _\bt_\bh_\be_\b _\bs_\bo_\bu_\br_\bc_\be_\b _\bc_\bo_\bd_\be_\b _\bo_\bf_\b _\bt_\bh_\bi_\bs_\b _\bf_\bi_\bl_\be_\b.\n-C\bCl\bla\bas\bss\bse\bes\bs\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bS_\bi_\bm_\bd_\bS_\bc_\ba_\bl_\ba_\br_\bT_\by_\bp_\be_\bT_\br_\ba_\bi_\bt_\bs_\b<_\b _\bT_\b _\b>\n+M\bMa\bac\bcr\bro\bos\bs\n+#define\u00a0 _\bD_\bU_\bN_\bE_\b__\bA_\bS_\bS_\bE_\bR_\bT_\b__\bA_\bN_\bD_\b__\bR_\bE_\bT_\bU_\bR_\bN(C, X)\u00a0\u00a0\u00a0(!(C) ? throw [&](){assert(!#C);return\n+ 0;}() : 0), X\n+\u00a0 Asserts a condition and return on success in constexpr context.\n \u00a0\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bS_\bi_\bm_\bd_\bS_\bc_\ba_\bl_\ba_\br_\bT_\by_\bp_\be_\bT_\br_\ba_\bi_\bt_\bs_\b<_\b _\bA_\bl_\bi_\bg_\bn_\be_\bd_\bN_\bu_\bm_\bb_\be_\br_\b<_\b _\bT_\b,_\b _\ba_\bl_\bi_\bg_\bn_\b _\b>_\b _\b>\n-\u00a0 deduce the underlying scalar data type of an AlignedNumber _\bM_\bo_\br_\be_\b._\b._\b.\n-\u00a0\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bS_\bi_\bm_\bd_\bI_\bn_\bd_\be_\bx_\bT_\by_\bp_\be_\bT_\br_\ba_\bi_\bt_\bs_\b<_\b _\bV_\b,_\b _\bt_\by_\bp_\be_\bn_\ba_\bm_\be_\b _\b>\n-\u00a0\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bS_\bi_\bm_\bd_\bM_\ba_\bs_\bk_\bT_\by_\bp_\be_\bT_\br_\ba_\bi_\bt_\bs_\b<_\b _\bV_\b,_\b _\bt_\by_\bp_\be_\bn_\ba_\bm_\be_\b _\b>\n-\u00a0\n-N\bNa\bam\bme\bes\bsp\bpa\bac\bce\bes\bs\n-namespace \u00a0 _\bD_\bu_\bn_\be\n-\u00a0 _\bD_\bu_\bn_\be namespace.\n-\u00a0\n-T\bTy\byp\bpe\bed\bde\bef\bfs\bs\n-template\n-using\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bS_\bi_\bm_\bd_\bS_\bc_\ba_\bl_\ba_\br = typename _\bS_\bi_\bm_\bd_\bS_\bc_\ba_\bl_\ba_\br_\bT_\by_\bp_\be_\bT_\br_\ba_\bi_\bt_\bs< T >::type\n-\u00a0\n-template\n-using\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bS_\bi_\bm_\bd_\bI_\bn_\bd_\be_\bx = typename _\bS_\bi_\bm_\bd_\bI_\bn_\bd_\be_\bx_\bT_\by_\bp_\be_\bT_\br_\ba_\bi_\bt_\bs< V >::type\n-\u00a0 An simd vector of indices corresponding to a simd vector V.\n-\u00a0\n-template\n-using\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bS_\bi_\bm_\bd_\bM_\ba_\bs_\bk = typename _\bS_\bi_\bm_\bd_\bM_\ba_\bs_\bk_\bT_\by_\bp_\be_\bT_\br_\ba_\bi_\bt_\bs< V >::type\n-\u00a0 A simd vector of truth values corresponding to a simd vector V.\n-\u00a0\n-F\bFu\bun\bnc\bct\bti\bio\bon\bns\bs\n-template\n-std::size_t\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bl_\ba_\bn_\be_\bs (const T &)\n-\u00a0 get the number of lanes of a simd vector (scalar version)\n-\u00a0\n-template\n- T\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bl_\ba_\bn_\be (std::size_t l, const T &v)\n-\u00a0 access a lane of a simd vector (scalar version)\n-\u00a0\n-template\n- T &\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bl_\ba_\bn_\be (std::size_t l, T &v)\n-\u00a0 access a lane of a simd vector (scalar version)\n-\u00a0\n-template\n- void\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\ba_\bs_\bs_\bi_\bg_\bn (T &dst, const T &src, bool mask)\n-\u00a0 masked _\bS_\bi_\bm_\bd assignment (scalar version)\n-\u00a0\n-template\n- void\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bs_\bw_\ba_\bp (T &v1, T &v2, bool mask)\n-\u00a0\n-*\b**\b**\b**\b**\b* D\bDe\bet\bta\bai\bil\ble\bed\bd D\bDe\bes\bsc\bcr\bri\bip\bpt\bti\bio\bon\bn *\b**\b**\b**\b**\b*\n-Abstractions for support of dedicated SIMD data types.\n-Libraries like Vc (_\bh_\bt_\bt_\bp_\bs_\b:_\b/_\b/_\bg_\bi_\bt_\bh_\bu_\bb_\b._\bc_\bo_\bm_\b/_\bV_\bc_\bD_\be_\bv_\be_\bl_\b/_\bV_\bc) add high-level data types for\n-SIMD (or vectorization) support in C++. Most of these operations mimic the\n-behavior of a numerical data type. Some boolean operations can not be\n-implemented in a compatible way to trivial data types.\n-This header contains additional abstractions to help writing code that works\n-with trivial numerical data types (like double) and Vc vectorization data\n-types.\n-See also the _\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\ba_\bl_\b._\bh_\bh and range_utils.hh headers.\n- _\bD\bD_\be\be_\bp\bp_\br\br_\be\be_\bc\bc_\ba\ba_\bt\bt_\be\be_\bd\bd_\b:\b:\n- Use the newer simd architecture from _\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bs_\bi_\bm_\bd_\b/_\bs_\bi_\bm_\bd_\b._\bh_\bh instead.\n ===============================================================================\n Generated by\u00a0_\b[_\bd_\bo_\bx_\by_\bg_\be_\bn_\b] 1.9.8\n"}]}, {"source1": "./usr/share/doc/libdune-common-doc/doxygen/a00014_source.html", "source2": "./usr/share/doc/libdune-common-doc/doxygen/a00014_source.html", "unified_diff": "@@ -1,15 +1,15 @@\n \n \n \n \n \n \n \n-dune-common: simd.hh Source File\n+dune-common: assertandreturn.hh Source File\n \n \n \n \n \n \n \n@@ -74,518 +74,42 @@\n \n
\n \n
\n \n
\n-
simd.hh
\n+
assertandreturn.hh
\n
\n
\n-Go to the documentation of this file.
1// SPDX-FileCopyrightInfo: Copyright \u00a9 DUNE Project contributors, see file LICENSE.md in module root
\n-
2// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception
\n-
3#ifndef DUNE_COMMON_SIMD_HH
\n-
4#define DUNE_COMMON_SIMD_HH
\n-
5
\n-
6#warning dune/common/simd.hh is deprecated.
\n-
7#warning Use the new infrastructure from dune/common/simd/simd.h instead.
\n-
8
\n-
30#include <cassert>
\n-
31#include <cstddef>
\n-
32#include <type_traits>
\n-
33#include <utility>
\n-
34
\n-\n-\n-\n-
38#if HAVE_VC
\n-
39// include Vc part of new simd interface to provide compatibility for
\n-
40// functionality that has been switched over.
\n-\n-
42#endif
\n-\n-
44#include <dune/common/vc.hh>
\n-
45
\n-
46namespace Dune
\n-
47{
\n-
48
\n-
49#if HAVE_VC
\n-
50 namespace VcImpl {
\n-
52
\n-
61 template<class V>
\n-
62 class Proxy
\n-
63 {
\n-
64 static_assert(std::is_same<V, std::decay_t<V> >::value, "Class Proxy "
\n-
65 "may only be instantiated with unqualified types");
\n-
66 public:
\n-
67 using value_type = typename V::value_type;
\n-
68
\n-
69 private:
\n-
70 static_assert(std::is_arithmetic<value_type>::value,
\n-
71 "Only arithmetic types are supported");
\n-
72 V &vec_;
\n-
73 std::size_t idx_;
\n-
74
\n-
75 public:
\n-
76 Proxy(std::size_t idx, V &vec)
\n-
77 : vec_(vec), idx_(idx)
\n-
78 { }
\n-
79
\n-
80 operator value_type() const { return vec_[idx_]; }
\n-
81
\n-
82 // postfix operators
\n-
83
\n-
84 template<class T = value_type,
\n-
85 class = std::enable_if_t<!std::is_same<T, bool>::value> >
\n-
86 value_type operator++(int) { return vec_[idx_]++; }
\n-
87 template<class T = value_type,
\n-
88 class = std::enable_if_t<!std::is_same<T, bool>::value> >
\n-
89 value_type operator--(int) { return vec_[idx_]--; }
\n-
90
\n-
91 // unary (prefix) operators
\n-
92 template<class T = value_type,
\n-
93 class = std::enable_if_t<!std::is_same<T, bool>::value> >
\n-
94 Proxy &operator++() { ++(vec_[idx_]); return *this; }
\n-
95 template<class T = value_type,
\n-
96 class = std::enable_if_t<!std::is_same<T, bool>::value> >
\n-
97 Proxy &operator--() { --(vec_[idx_]); return *this; }
\n-
98 decltype(auto) operator!() const { return !(vec_[idx_]); }
\n-
99 decltype(auto) operator+() const { return +(vec_[idx_]); }
\n-
100 decltype(auto) operator-() const { return -(vec_[idx_]); }
\n-
101 template<class T = value_type,
\n-
102 class = std::enable_if_t<std::is_integral<T>::value> >
\n-
103 decltype(auto) operator~() const { return ~(vec_[idx_]); }
\n-
104
\n-
105 // binary operators
\n-
106#define DUNE_SIMD_VC_BINARY_OP(OP) \\
\n-
107 template<class T> \\
\n-
108 auto operator OP(T &&o) const \\
\n-
109 -> decltype(vec_[idx_] OP valueCast(std::forward<T>(o))) \\
\n-
110 { \\
\n-
111 return vec_[idx_] OP valueCast(std::forward<T>(o)); \\
\n-
112 } \\
\n-
113 static_assert(true, "Require semicolon to unconfuse editors")
\n-
114
\n-
115 DUNE_SIMD_VC_BINARY_OP(*);
\n-
116 DUNE_SIMD_VC_BINARY_OP(/);
\n-
117 DUNE_SIMD_VC_BINARY_OP(%);
\n-
118
\n-
119 DUNE_SIMD_VC_BINARY_OP(+);
\n-
120 DUNE_SIMD_VC_BINARY_OP(-);
\n-
121
\n-
122 DUNE_SIMD_VC_BINARY_OP(<<);
\n-
123 DUNE_SIMD_VC_BINARY_OP(>>);
\n-
124
\n-
125 DUNE_SIMD_VC_BINARY_OP(<);
\n-
126 DUNE_SIMD_VC_BINARY_OP(>);
\n-
127 DUNE_SIMD_VC_BINARY_OP(<=);
\n-
128 DUNE_SIMD_VC_BINARY_OP(>=);
\n-
129
\n-
130 DUNE_SIMD_VC_BINARY_OP(==);
\n-
131 DUNE_SIMD_VC_BINARY_OP(!=);
\n-
132
\n-
133 DUNE_SIMD_VC_BINARY_OP(&);
\n-
134 DUNE_SIMD_VC_BINARY_OP(^);
\n-
135 DUNE_SIMD_VC_BINARY_OP(|);
\n-
136
\n-
137 DUNE_SIMD_VC_BINARY_OP(&&);
\n-
138 DUNE_SIMD_VC_BINARY_OP(||);
\n-
139#undef DUNE_SIMD_VC_BINARY_OP
\n-
140
\n-
141#define DUNE_SIMD_VC_ASSIGNMENT(OP) \\
\n-
142 template<class T> \\
\n-
143 auto operator OP(T &&o) \\
\n-
144 -> std::enable_if_t<AlwaysTrue<decltype( \\
\n-
145 vec_[idx_] OP valueCast(std::forward<T>(o)) \\
\n-
146 )>::value, Proxy&> \\
\n-
147 { \\
\n-
148 vec_[idx_] OP valueCast(std::forward<T>(o)); \\
\n-
149 return *this; \\
\n-
150 } \\
\n-
151 static_assert(true, "Require semicolon to unconfuse editors")
\n-
152
\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-
164#undef DUNE_SIMD_VC_ASSIGNMENT
\n-
165
\n-
166 // swap on proxies swaps the proxied vector entries. As such, it
\n-
167 // applies to rvalues of proxies too, not just lvalues
\n-
168 template<class V1, class V2>
\n-
169 friend void swap(Proxy<V1>, Proxy<V2>);
\n-
170
\n-
171 template<class T>
\n-
172 friend void swap(Proxy p1, T& s2)
\n-
173 {
\n-
174 // don't use swap() ourselves -- not supported by Vc 1.3.0 (but is
\n-
175 // supported by Vc 1.3.2)
\n-
176 T tmp = p1.vec_[p1.idx_];
\n-
177 p1.vec_[p1.idx_] = s2;
\n-
178 s2 = tmp;
\n-
179 }
\n-
180
\n-
181 template<class T>
\n-
182 friend void swap(T& s1, Proxy p2)
\n-
183 {
\n-
184 T tmp = s1;
\n-
185 s1 = p2.vec_[p2.idx_];
\n-
186 p2.vec_[p2.idx_] = tmp;
\n-
187 }
\n-
188 };
\n-
189
\n-
190 template<class V1, class V2>
\n-
191 void swap(Proxy<V1> p1, Proxy<V2> p2)
\n-
192 {
\n-
193 typename V1::value_type tmp = p1.vec_[p1.idx_];
\n-
194 p1.vec_[p1.idx_] = p2.vec_[p2.idx_];
\n-
195 p2.vec_[p2.idx_] = tmp;
\n-
196 }
\n-
197 } // namespace VcImpl
\n-
198#endif // HAVE_VC
\n-
199
\n-
200 template<typename T>
\n-
\n-\n-
202 {
\n-
203 using type = T;
\n-
204 };
\n-
\n-
205
\n-
206 template<typename T>
\n-\n-
208
\n-
209#if HAVE_VC
\n-
210 /*
\n-
211 Add Vc specializations for the SimdScalarTypeTraits trais class
\n-
212 */
\n-
213 template<typename T, typename A>
\n-
214 struct SimdScalarTypeTraits< Vc::Vector<T,A> >
\n-
215 {
\n-
216 using type = T;
\n-
217 };
\n-
218
\n-
219 template<typename T, std::size_t N, typename V, std::size_t M>
\n-
220 struct SimdScalarTypeTraits< Vc::SimdArray<T,N,V,M> >
\n-
221 {
\n-
222 using type = T;
\n-
223 };
\n-
224#endif // HAVE_VC
\n-
225
\n-
227 template<typename T, std::size_t align>
\n-
\n-\n-
229 {
\n-
230 using type = T;
\n-
231 };
\n-
\n-
232
\n-
233 template<typename V, typename = void>
\n-
\n-\n-
235 using type = std::size_t;
\n-
236 };
\n-
\n-
237
\n-
239
\n-
245 template<typename V>
\n-\n-
247
\n-
248#if HAVE_VC
\n-
249 template<typename T, typename A>
\n-
250 struct SimdIndexTypeTraits<Vc::Vector<T, A> > {
\n-
251 using type = typename Vc::Vector<T, A>::index_type;
\n-
252 };
\n-
253
\n-
254 template<typename T, std::size_t n, typename V>
\n-
255 struct SimdIndexTypeTraits<Vc::SimdArray<T, n, V> > {
\n-
256 using type = typename Vc::SimdArray<T, n, V>::index_type;
\n-
257 };
\n-
258#endif // HAVE_VC
\n-
259
\n-
260 template<typename V, typename = void>
\n-
\n-\n-
262 using type = bool;
\n-
263 };
\n-
\n-
264
\n-
266
\n-
269 template<typename V>
\n-\n-
271
\n-
272#if HAVE_VC
\n-
273 template<typename T, typename A>
\n-
274 struct SimdMaskTypeTraits<Vc::Vector<T, A> > {
\n-
275 using type = typename Vc::Vector<T, A>::mask_type;
\n-
276 };
\n-
277
\n-
278 template<typename T, std::size_t n, typename V>
\n-
279 struct SimdMaskTypeTraits<Vc::SimdArray<T, n, V> > {
\n-
280 using type = typename Vc::SimdArray<T, n, V>::mask_type;
\n-
281 };
\n-
282#endif // HAVE_VC
\n-
283
\n-
284#if HAVE_VC
\n-
285 /*
\n-
286 Add Vc specializations for cond(), see conditional.hh
\n-
287 */
\n-
288 template<typename T, typename A>
\n-
289 Vc::Vector<T,A> cond(const Vc::Mask<T,A> & b,
\n-
290 const Vc::Vector<T,A> & v1,
\n-
291 const Vc::Vector<T,A> & v2)
\n-
292 {
\n-
293 return std::move(Vc::iif(b, v1, v2));
\n-
294 }
\n-
295
\n-
296 template<typename T, std::size_t N, typename V, std::size_t M>
\n-
297 Vc::SimdArray<T,N,V,M> cond(const typename Vc::SimdArray<T,N,V,M>::mask_type & b,
\n-
298 const Vc::SimdArray<T,N,V,M> & v1,
\n-
299 const Vc::SimdArray<T,N,V,M> & v2)
\n-
300 {
\n-
301 return std::move(Vc::iif(b, v1, v2));
\n-
302 }
\n-
303#endif // HAVE_VC
\n-
304
\n-
305#if HAVE_VC
\n-
306 /*
\n-
307 Add Vc specializations for several boolean operations, see rangeutitlities.hh:
\n-
308
\n-
309 max_value, min_value, any_true, all_true
\n-
310 */
\n-
311 template<typename T, typename A>
\n-
312 T max_value(const Vc::Vector<T,A> & v)
\n-
313 {
\n-
314 return v.max();
\n-
315 }
\n-
316
\n-
317 template<typename T, std::size_t N, typename V, std::size_t M>
\n-
318 double max_value(const Vc::SimdArray<T,N,V,M> & v)
\n-
319 {
\n-
320 return v.max();
\n-
321 }
\n-
322
\n-
323 template<typename T, typename A>
\n-
324 T min_value(const Vc::Vector<T,A> & v)
\n-
325 {
\n-
326 return v.min();
\n-
327 }
\n-
328
\n-
329 template<typename T, std::size_t N, typename V, std::size_t M>
\n-
330 double min_value(const Vc::SimdArray<T,N,V,M> & v)
\n-
331 {
\n-
332 return v.min();
\n-
333 }
\n-
334
\n-
335 template<typename T, typename A>
\n-
336 bool any_true(const Vc::Mask<T,A> & v)
\n-
337 {
\n-
338 return Vc::any_of(v);
\n-
339 }
\n-
340
\n-
341 template<typename T, std::size_t N, typename V, std::size_t M>
\n-
342 bool any_true(const Vc::SimdMaskArray<T,N,V,M> & v)
\n-
343 {
\n-
344 return Vc::any_of(v);
\n-
345 }
\n-
346
\n-
347 template<typename T, typename A>
\n-
348 bool all_true(const Vc::Mask<T,A> & v)
\n-
349 {
\n-
350 return Vc::all_of(v);
\n-
351 }
\n-
352
\n-
353 template<typename T, std::size_t N, typename V, std::size_t M>
\n-
354 bool all_true(const Vc::SimdMaskArray<T,N,V,M> & v)
\n-
355 {
\n-
356 return Vc::all_of(v);
\n-
357 }
\n-
358#endif // HAVE_VC
\n-
359
\n-
361 template<class T>
\n-
362 std::size_t lanes(const T &) { return 1; }
\n-
363
\n-
365 template<class T>
\n-
\n-
366 T lane(std::size_t l, const T &v)
\n-
367 {
\n-
368 assert(l == 0);
\n-
369 return v;
\n-
370 }
\n-
\n-
371
\n-
373 template<class T>
\n-
\n-
374 T &lane(std::size_t l, T &v)
\n-
375 {
\n-
376 assert(l == 0);
\n-
377 return v;
\n-
378 }
\n-
\n-
379
\n-
380#if HAVE_VC
\n-
381 template<class T, class A>
\n-
382 std::size_t lanes(const Vc::Vector<T, A> &)
\n-
383 {
\n-
384 return Vc::Vector<T, A>::size();
\n-
385 }
\n-
386
\n-
387 template<class T, class A>
\n-
388 T lane(std::size_t l, const Vc::Vector<T, A> &v)
\n-
389 {
\n-
390 assert(l < lanes(v));
\n-
391 return v[l];
\n-
392 }
\n-
393
\n-
394 template<class T, class A>
\n-
395 auto lane(std::size_t l, Vc::Vector<T, A> &v)
\n-
396 {
\n-
397 assert(l < lanes(v));
\n-
398 return VcImpl::Proxy<Vc::Vector<T, A> >{l, v};
\n-
399 }
\n-
400
\n-
401 template<class T, std::size_t n, class V>
\n-
402 std::size_t lanes(const Vc::SimdArray<T, n, V> &)
\n-
403 {
\n-
404 return n;
\n-
405 }
\n-
406
\n-
407 template<class T, std::size_t n, class V>
\n-
408 T lane(std::size_t l, const Vc::SimdArray<T, n, V> &v)
\n-
409 {
\n-
410 assert(l < n);
\n-
411 return v[l];
\n-
412 }
\n-
413
\n-
414 template<class T, std::size_t n, class V>
\n-
415 auto lane(std::size_t l, Vc::SimdArray<T, n, V> &v)
\n-
416 {
\n-
417 assert(l < n);
\n-
418 return VcImpl::Proxy<Vc::SimdArray<T, n, V> >{l, v};
\n-
419 }
\n-
420
\n-
421 template<class T, std::size_t n, class V>
\n-
422 std::size_t lanes(const Vc::SimdMaskArray<T, n, V> &)
\n-
423 {
\n-
424 return n;
\n-
425 }
\n-
426
\n-
427 template<class T, std::size_t n, class V>
\n-
428 bool lane(std::size_t l, const Vc::SimdMaskArray<T, n, V> &v)
\n-
429 {
\n-
430 assert(l < n);
\n-
431 return v[l];
\n-
432 }
\n-
433
\n-
434 template<class T, std::size_t n, class V>
\n-
435 auto lane(std::size_t l, Vc::SimdMaskArray<T, n, V> &v)
\n-
436 {
\n-
437 assert(l < n);
\n-
438 return VcImpl::Proxy<Vc::SimdMaskArray<T, n, V> >{l, v};
\n-
439 }
\n-
440#endif // HAVE_VC
\n-
441
\n-
443
\n-
446 template<class T>
\n-
\n-
447 void assign(T &dst, const T &src, bool mask)
\n-
448 {
\n-
449 if(mask) dst = src;
\n-
450 }
\n-
\n-
451
\n-
452#if HAVE_VC
\n-
453 /*
\n-
454 Add Vc specializations for masked assignment
\n-
455 */
\n-
456 template<class T, class A>
\n-
457 void assign(Vc::Vector<T, A> &dst, const Vc::Vector<T, A> &src,
\n-
458 typename Vc::Vector<T, A>::mask_type mask)
\n-
459 {
\n-
460 dst(mask) = src;
\n-
461 }
\n-
462
\n-
463 template<class T, std::size_t n, class V>
\n-
464 void assign(Vc::SimdArray<T, n, V> &dst, const Vc::SimdArray<T, n, V> &src,
\n-
465 typename Vc::SimdArray<T, n, V>::mask_type mask)
\n-
466 {
\n-
467 dst(mask) = src;
\n-
468 }
\n-
469#endif // HAVE_VC
\n-
470
\n-
471 template<class T>
\n-
\n-
472 void swap(T &v1, T &v2, bool mask)
\n-
473 {
\n-
474 using std::swap;
\n-
475 if(mask) swap(v1, v2);
\n-
476 }
\n-
\n-
477
\n-
478#if HAVE_VC
\n-
479 /*
\n-
480 Add Vc specializations for masked swap
\n-
481 */
\n-
482 template<class T, class A>
\n-
483 void swap(Vc::Vector<T, A> &v1, Vc::Vector<T, A> &v2,
\n-
484 typename Vc::Vector<T, A>::mask_type mask)
\n-
485 {
\n-
486 auto tmp = v1;
\n-
487 v1(mask) = v2;
\n-
488 v2(mask) = tmp;
\n-
489 }
\n-
490
\n-
491 template<class T, std::size_t n, class V>
\n-
492 void swap(Vc::SimdArray<T, n, V> &v1, Vc::SimdArray<T, n, V> &v2,
\n-
493 typename Vc::SimdArray<T, n, V>::mask_type mask)
\n-
494 {
\n-
495 auto tmp = v1;
\n-
496 v1(mask) = v2;
\n-
497 v2(mask) = tmp;
\n-
498 }
\n-
499#endif // HAVE_VC
\n-
500
\n-
501} // end namespace Dune
\n-
502
\n-
503#endif // DUNE_COMMON_SIMD_HH
\n-
Compatibility header for including <Vc/Vc>
\n-
Utilities for reduction like operations on ranges.
\n-
Traits for type conversions and type information.
\n-\n-\n-
Dune namespace.
Definition alignedallocator.hh:13
\n-
bool any_true(const AlignedNumber< bool, align > &val)
Definition debugalign.hh:506
\n-
bool all_true(const AlignedNumber< bool, align > &val)
Definition debugalign.hh:512
\n-
typename SimdIndexTypeTraits< V >::type SimdIndex
An simd vector of indices corresponding to a simd vector V.
Definition simd.hh:246
\n-
typename SimdScalarTypeTraits< T >::type SimdScalar
Definition simd.hh:207
\n-
typename SimdMaskTypeTraits< V >::type SimdMask
A simd vector of truth values corresponding to a simd vector V.
Definition simd.hh:270
\n-
T lane(std::size_t l, const T &v)
access a lane of a simd vector (scalar version)
Definition simd.hh:366
\n-
void swap(T &v1, T &v2, bool mask)
Definition simd.hh:472
\n-
void assign(T &dst, const T &src, bool mask)
masked Simd assignment (scalar version)
Definition simd.hh:447
\n-
const T1 cond(bool b, const T1 &v1, const T2 &v2)
conditional evaluate
Definition conditional.hh:28
\n-
T max_value(const AlignedNumber< T, align > &val)
Definition debugalign.hh:494
\n-
T min_value(const AlignedNumber< T, align > &val)
Definition debugalign.hh:500
\n-
std::size_t lanes(const T &)
get the number of lanes of a simd vector (scalar version)
Definition simd.hh:362
\n-
aligned wrappers for arithmetic types
Definition debugalign.hh:128
\n-
Definition simd.hh:202
\n-
T type
Definition simd.hh:203
\n-\n-
Definition simd.hh:234
\n-
std::size_t type
Definition simd.hh:235
\n-
Definition simd.hh:261
\n-
bool type
Definition simd.hh:262
\n-
SIMD abstractions for Vc.
\n-
#define DUNE_SIMD_VC_ASSIGNMENT(OP)
Definition simd/vc.hh:224
\n+Go to the documentation of this file.
1// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
\n+
2// vi: set et ts=4 sw=2 sts=2:
\n+
3// SPDX-FileCopyrightInfo: Copyright \u00a9 DUNE Project contributors, see file LICENSE.md in module root
\n+
4// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception
\n+
5#ifndef DUNE_COMMON_ASSERTANDRETURN_HH
\n+
6#define DUNE_COMMON_ASSERTANDRETURN_HH
\n+
7
\n+
8#ifndef DUNE_DISABLE_DEPRECATION_WARNING_ASSERT_AND_RETURN
\n+
9#warning "The file assertandreturn.hh is deprecated. Since c++14 constexpr functions allow more \\
\n+
10than a single return statement and thus this utility is useless. Will be removed after \\
\n+
11Dune 2.10 release."
\n+
12#endif // DUNE_DISABLE_DEPRECATION_WARNING_ASSERT_AND_RETURN
\n+
13
\n+
14#include <cassert>
\n+
15
\n+
17
\n+
26#ifdef NDEBUG
\n+
27 #define DUNE_ASSERT_AND_RETURN(C,X) X
\n+
28#else
\n+
29 #define DUNE_ASSERT_AND_RETURN(C,X) (!(C) ? throw [&](){assert(!#C);return 0;}() : 0), X
\n+
30#endif
\n+
31
\n+
32
\n+
33
\n+
34#endif // DUNE_COMMON_ASSERTANDRETURN_HH
\n
\n \n
\n Generated by \"doxygen\"/ 1.9.8\n
\n \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,549 +1,39 @@\n dune-common\u00a02.10\n Loading...\n Searching...\n No Matches\n * _\bd_\bu_\bn_\be\n * _\bc_\bo_\bm_\bm_\bo_\bn\n-simd.hh\n+assertandreturn.hh\n _\bG_\bo_\b _\bt_\bo_\b _\bt_\bh_\be_\b _\bd_\bo_\bc_\bu_\bm_\be_\bn_\bt_\ba_\bt_\bi_\bo_\bn_\b _\bo_\bf_\b _\bt_\bh_\bi_\bs_\b _\bf_\bi_\bl_\be_\b.\n-1// SPDX-FileCopyrightInfo: Copyright \u00c2\u00a9 DUNE Project contributors, see file\n+1// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-\n+2// vi: set et ts=4 sw=2 sts=2:\n+3// SPDX-FileCopyrightInfo: Copyright \u00c2\u00a9 DUNE Project contributors, see file\n LICENSE.md in module root\n-2// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception\n-3#ifndef DUNE_COMMON_SIMD_HH\n-4#define DUNE_COMMON_SIMD_HH\n-5\n-6#warning dune/common/simd.hh is deprecated.\n-7#warning Use the new infrastructure from dune/common/simd/simd.h instead.\n-8\n-30#include \n-31#include \n-32#include \n-33#include \n-34\n-35#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\ba_\bl_\b._\bh_\bh>\n-36#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bd_\be_\bb_\bu_\bg_\ba_\bl_\bi_\bg_\bn_\b._\bh_\bh>\n-37#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\br_\ba_\bn_\bg_\be_\bu_\bt_\bi_\bl_\bi_\bt_\bi_\be_\bs_\b._\bh_\bh>\n-38#if HAVE_VC\n-39// include Vc part of new simd interface to provide compatibility for\n-40// functionality that has been switched over.\n-41#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bs_\bi_\bm_\bd_\b/_\bv_\bc_\b._\bh_\bh>\n-42#endif\n-43#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bt_\by_\bp_\be_\bt_\br_\ba_\bi_\bt_\bs_\b._\bh_\bh>\n-44#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bv_\bc_\b._\bh_\bh>\n-45\n-46namespace _\bD_\bu_\bn_\be\n-47{\n-48\n-49#if HAVE_VC\n-50 namespace VcImpl {\n-52\n-61 template\n-62 class Proxy\n-63 {\n-64 static_assert(std::is_same >::value, \"Class Proxy \"\n-65 \"may only be instantiated with unqualified types\");\n-66 public:\n-67 using value_type = typename V::value_type;\n-68\n-69 private:\n-70 static_assert(std::is_arithmetic::value,\n-71 \"Only arithmetic types are supported\");\n-72 V &vec_;\n-73 std::size_t idx_;\n-74\n-75 public:\n-76 Proxy(std::size_t idx, V &vec)\n-77 : vec_(vec), idx_(idx)\n-78 { }\n-79\n-80 operator value_type() const { return vec_[idx_]; }\n-81\n-82 // postfix operators\n-83\n-84 template::value> >\n-86 value_type operator++(int) { return vec_[idx_]++; }\n-87 template::value> >\n-89 value_type operator--(int) { return vec_[idx_]--; }\n-90\n-91 // unary (prefix) operators\n-92 template::value> >\n-94 Proxy &operator++() { ++(vec_[idx_]); return *this; }\n-95 template::value> >\n-97 Proxy &operator--() { --(vec_[idx_]); return *this; }\n-98 decltype(auto) operator!() const { return !(vec_[idx_]); }\n-99 decltype(auto) operator+() const { return +(vec_[idx_]); }\n-100 decltype(auto) operator-() const { return -(vec_[idx_]); }\n-101 template::value> >\n-103 decltype(auto) operator~() const { return ~(vec_[idx_]); }\n-104\n-105 // binary operators\n-106#define DUNE_SIMD_VC_BINARY_OP(OP) \\\n-107 template \\\n-108 auto operator OP(T &&o) const \\\n-109 -> decltype(vec_[idx_] OP valueCast(std::forward(o))) \\\n-110 { \\\n-111 return vec_[idx_] OP valueCast(std::forward(o)); \\\n-112 } \\\n-113 static_assert(true, \"Require semicolon to unconfuse editors\")\n-114\n-115 DUNE_SIMD_VC_BINARY_OP(*);\n-116 DUNE_SIMD_VC_BINARY_OP(/);\n-117 DUNE_SIMD_VC_BINARY_OP(%);\n-118\n-119 DUNE_SIMD_VC_BINARY_OP(+);\n-120 DUNE_SIMD_VC_BINARY_OP(-);\n-121\n-122 DUNE_SIMD_VC_BINARY_OP(<<);\n-123 DUNE_SIMD_VC_BINARY_OP(>>);\n-124\n-125 DUNE_SIMD_VC_BINARY_OP(<);\n-126 DUNE_SIMD_VC_BINARY_OP(>);\n-127 DUNE_SIMD_VC_BINARY_OP(<=);\n-128 DUNE_SIMD_VC_BINARY_OP(>=);\n-129\n-130 DUNE_SIMD_VC_BINARY_OP(==);\n-131 DUNE_SIMD_VC_BINARY_OP(!=);\n-132\n-133 DUNE_SIMD_VC_BINARY_OP(&);\n-134 DUNE_SIMD_VC_BINARY_OP(^);\n-135 DUNE_SIMD_VC_BINARY_OP(|);\n-136\n-137 DUNE_SIMD_VC_BINARY_OP(&&);\n-138 DUNE_SIMD_VC_BINARY_OP(||);\n-139#undef DUNE_SIMD_VC_BINARY_OP\n-140\n-141#define DUNE_SIMD_VC_ASSIGNMENT(OP) \\\n-142 template \\\n-143 auto operator OP(T &&o) \\\n-144 -> std::enable_if_t(o)) \\\n-146 )>::value, Proxy&> \\\n-147 { \\\n-148 vec_[idx_] OP valueCast(std::forward(o)); \\\n-149 return *this; \\\n-150 } \\\n-151 static_assert(true, \"Require semicolon to unconfuse editors\")\n-152\n-153 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bV_\bC_\b__\bA_\bS_\bS_\bI_\bG_\bN_\bM_\bE_\bN_\bT(=);\n-154 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bV_\bC_\b__\bA_\bS_\bS_\bI_\bG_\bN_\bM_\bE_\bN_\bT(*=);\n-155 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bV_\bC_\b__\bA_\bS_\bS_\bI_\bG_\bN_\bM_\bE_\bN_\bT(/=);\n-156 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bV_\bC_\b__\bA_\bS_\bS_\bI_\bG_\bN_\bM_\bE_\bN_\bT(%=);\n-157 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bV_\bC_\b__\bA_\bS_\bS_\bI_\bG_\bN_\bM_\bE_\bN_\bT(+=);\n-158 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bV_\bC_\b__\bA_\bS_\bS_\bI_\bG_\bN_\bM_\bE_\bN_\bT(-=);\n-159 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bV_\bC_\b__\bA_\bS_\bS_\bI_\bG_\bN_\bM_\bE_\bN_\bT(<<=);\n-160 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bV_\bC_\b__\bA_\bS_\bS_\bI_\bG_\bN_\bM_\bE_\bN_\bT(>>=);\n-161 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bV_\bC_\b__\bA_\bS_\bS_\bI_\bG_\bN_\bM_\bE_\bN_\bT(&=);\n-162 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bV_\bC_\b__\bA_\bS_\bS_\bI_\bG_\bN_\bM_\bE_\bN_\bT(^=);\n-163 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bV_\bC_\b__\bA_\bS_\bS_\bI_\bG_\bN_\bM_\bE_\bN_\bT(|=);\n-164#undef DUNE_SIMD_VC_ASSIGNMENT\n-165\n-166 // swap on proxies swaps the proxied vector entries. As such, it\n-167 // applies to rvalues of proxies too, not just lvalues\n-168 template\n-169 friend void _\bs_\bw_\ba_\bp(Proxy, Proxy);\n-170\n-171 template\n-172 friend void _\bs_\bw_\ba_\bp(Proxy p1, T& s2)\n-173 {\n-174 // don't use swap() ourselves -- not supported by Vc 1.3.0 (but is\n-175 // supported by Vc 1.3.2)\n-176 T tmp = p1.vec_[p1.idx_];\n-177 p1.vec_[p1.idx_] = s2;\n-178 s2 = tmp;\n-179 }\n-180\n-181 template\n-182 friend void _\bs_\bw_\ba_\bp(T& s1, Proxy p2)\n-183 {\n-184 T tmp = s1;\n-185 s1 = p2.vec_[p2.idx_];\n-186 p2.vec_[p2.idx_] = tmp;\n-187 }\n-188 };\n-189\n-190 template\n-191 void _\bs_\bw_\ba_\bp(Proxy p1, Proxy p2)\n-192 {\n-193 typename V1::value_type tmp = p1.vec_[p1.idx_];\n-194 p1.vec_[p1.idx_] = p2.vec_[p2.idx_];\n-195 p2.vec_[p2.idx_] = tmp;\n-196 }\n-197 } // namespace VcImpl\n-198#endif // HAVE_VC\n-199\n-200 template\n-_\b2_\b0_\b1 struct _\bS_\bi_\bm_\bd_\bS_\bc_\ba_\bl_\ba_\br_\bT_\by_\bp_\be_\bT_\br_\ba_\bi_\bt_\bs\n-202 {\n-_\b2_\b0_\b3 using _\bt_\by_\bp_\be = T;\n-204 };\n-205\n-206 template\n-_\b2_\b0_\b7 using _\bS_\bi_\bm_\bd_\bS_\bc_\ba_\bl_\ba_\br = typename _\bS_\bi_\bm_\bd_\bS_\bc_\ba_\bl_\ba_\br_\bT_\by_\bp_\be_\bT_\br_\ba_\bi_\bt_\bs_\b<_\bT_\b>_\b:_\b:_\bt_\by_\bp_\be;\n-208\n-209#if HAVE_VC\n-210 /*\n-211 Add Vc specializations for the SimdScalarTypeTraits trais class\n-212 */\n-213 template\n-214 struct _\bS_\bi_\bm_\bd_\bS_\bc_\ba_\bl_\ba_\br_\bT_\by_\bp_\be_\bT_\br_\ba_\bi_\bt_\bs< Vc::Vector >\n-215 {\n-216 using _\bt_\by_\bp_\be = T;\n-217 };\n-218\n-219 template\n-220 struct SimdScalarTypeTraits< Vc::SimdArray >\n-221 {\n-222 using _\bt_\by_\bp_\be = T;\n-223 };\n-224#endif // HAVE_VC\n-225\n-227 template\n-_\b2_\b2_\b8 struct _\bS_\bi_\bm_\bd_\bS_\bc_\ba_\bl_\ba_\br_\bT_\by_\bp_\be_\bT_\br_\ba_\bi_\bt_\bs< _\bA_\bl_\bi_\bg_\bn_\be_\bd_\bN_\bu_\bm_\bb_\be_\br >\n-229 {\n-_\b2_\b3_\b0 using _\bt_\by_\bp_\be = T;\n-231 };\n-232\n-233 template\n-_\b2_\b3_\b4 struct _\bS_\bi_\bm_\bd_\bI_\bn_\bd_\be_\bx_\bT_\by_\bp_\be_\bT_\br_\ba_\bi_\bt_\bs {\n-_\b2_\b3_\b5 using _\bt_\by_\bp_\be = std::size_t;\n-236 };\n-237\n-239\n-245 template\n-_\b2_\b4_\b6 using _\bS_\bi_\bm_\bd_\bI_\bn_\bd_\be_\bx = typename _\bS_\bi_\bm_\bd_\bI_\bn_\bd_\be_\bx_\bT_\by_\bp_\be_\bT_\br_\ba_\bi_\bt_\bs_\b<_\bV_\b>_\b:_\b:_\bt_\by_\bp_\be;\n-247\n-248#if HAVE_VC\n-249 template\n-250 struct _\bS_\bi_\bm_\bd_\bI_\bn_\bd_\be_\bx_\bT_\by_\bp_\be_\bT_\br_\ba_\bi_\bt_\bs > {\n-251 using _\bt_\by_\bp_\be = typename Vc::Vector::index_type;\n-252 };\n-253\n-254 template\n-255 struct SimdIndexTypeTraits > {\n-256 using _\bt_\by_\bp_\be = typename Vc::SimdArray::index_type;\n-257 };\n-258#endif // HAVE_VC\n-259\n-260 template\n-_\b2_\b6_\b1 struct _\bS_\bi_\bm_\bd_\bM_\ba_\bs_\bk_\bT_\by_\bp_\be_\bT_\br_\ba_\bi_\bt_\bs {\n-_\b2_\b6_\b2 using _\bt_\by_\bp_\be = bool;\n-263 };\n-264\n-266\n-269 template\n-_\b2_\b7_\b0 using _\bS_\bi_\bm_\bd_\bM_\ba_\bs_\bk = typename _\bS_\bi_\bm_\bd_\bM_\ba_\bs_\bk_\bT_\by_\bp_\be_\bT_\br_\ba_\bi_\bt_\bs_\b<_\bV_\b>_\b:_\b:_\bt_\by_\bp_\be;\n-271\n-272#if HAVE_VC\n-273 template\n-274 struct _\bS_\bi_\bm_\bd_\bM_\ba_\bs_\bk_\bT_\by_\bp_\be_\bT_\br_\ba_\bi_\bt_\bs > {\n-275 using _\bt_\by_\bp_\be = typename Vc::Vector::mask_type;\n-276 };\n-277\n-278 template\n-279 struct SimdMaskTypeTraits > {\n-280 using _\bt_\by_\bp_\be = typename Vc::SimdArray::mask_type;\n-281 };\n-282#endif // HAVE_VC\n-283\n-284#if HAVE_VC\n-285 /*\n-286 Add Vc specializations for cond(), see conditional.hh\n-287 */\n-288 template\n-289 Vc::Vector _\bc_\bo_\bn_\bd(const Vc::Mask & b,\n-290 const Vc::Vector & v1,\n-291 const Vc::Vector & v2)\n-292 {\n-293 return std::move(Vc::iif(b, v1, v2));\n-294 }\n-295\n-296 template\n-297 Vc::SimdArray _\bc_\bo_\bn_\bd(const typename Vc::SimdArray::\n-mask_type & b,\n-298 const Vc::SimdArray & v1,\n-299 const Vc::SimdArray & v2)\n-300 {\n-301 return std::move(Vc::iif(b, v1, v2));\n-302 }\n-303#endif // HAVE_VC\n-304\n-305#if HAVE_VC\n-306 /*\n-307 Add Vc specializations for several boolean operations, see\n-rangeutitlities.hh:\n-308\n-309 max_value, min_value, any_true, all_true\n-310 */\n-311 template\n-312 T _\bm_\ba_\bx_\b__\bv_\ba_\bl_\bu_\be(const Vc::Vector & v)\n-313 {\n-314 return v.max();\n-315 }\n-316\n-317 template\n-318 double _\bm_\ba_\bx_\b__\bv_\ba_\bl_\bu_\be(const Vc::SimdArray & v)\n-319 {\n-320 return v.max();\n-321 }\n-322\n-323 template\n-324 T _\bm_\bi_\bn_\b__\bv_\ba_\bl_\bu_\be(const Vc::Vector & v)\n-325 {\n-326 return v.min();\n-327 }\n-328\n-329 template\n-330 double _\bm_\bi_\bn_\b__\bv_\ba_\bl_\bu_\be(const Vc::SimdArray & v)\n-331 {\n-332 return v.min();\n-333 }\n-334\n-335 template\n-336 bool _\ba_\bn_\by_\b__\bt_\br_\bu_\be(const Vc::Mask & v)\n-337 {\n-338 return Vc::any_of(v);\n-339 }\n-340\n-341 template\n-342 bool _\ba_\bn_\by_\b__\bt_\br_\bu_\be(const Vc::SimdMaskArray & v)\n-343 {\n-344 return Vc::any_of(v);\n-345 }\n-346\n-347 template\n-348 bool _\ba_\bl_\bl_\b__\bt_\br_\bu_\be(const Vc::Mask & v)\n-349 {\n-350 return Vc::all_of(v);\n-351 }\n-352\n-353 template\n-354 bool _\ba_\bl_\bl_\b__\bt_\br_\bu_\be(const Vc::SimdMaskArray & v)\n-355 {\n-356 return Vc::all_of(v);\n-357 }\n-358#endif // HAVE_VC\n-359\n-361 template\n-_\b3_\b6_\b2 std::size_t _\bl_\ba_\bn_\be_\bs(const T &) { return 1; }\n-363\n-365 template\n-_\b3_\b6_\b6 T _\bl_\ba_\bn_\be(std::size_t l, const T &v)\n-367 {\n-368 assert(l == 0);\n-369 return v;\n-370 }\n-371\n-373 template\n-_\b3_\b7_\b4 T &_\bl_\ba_\bn_\be(std::size_t l, T &v)\n-375 {\n-376 assert(l == 0);\n-377 return v;\n-378 }\n-379\n-380#if HAVE_VC\n-381 template\n-382 std::size_t _\bl_\ba_\bn_\be_\bs(const Vc::Vector &)\n-383 {\n-384 return Vc::Vector::size();\n-385 }\n-386\n-387 template\n-388 T _\bl_\ba_\bn_\be(std::size_t l, const Vc::Vector &v)\n-389 {\n-390 assert(l < _\bl_\ba_\bn_\be_\bs(v));\n-391 return v[l];\n-392 }\n-393\n-394 template\n-395 auto _\bl_\ba_\bn_\be(std::size_t l, Vc::Vector &v)\n-396 {\n-397 assert(l < _\bl_\ba_\bn_\be_\bs(v));\n-398 return VcImpl::Proxy >{l, v};\n-399 }\n-400\n-401 template\n-402 std::size_t _\bl_\ba_\bn_\be_\bs(const Vc::SimdArray &)\n-403 {\n-404 return n;\n-405 }\n-406\n-407 template\n-408 T _\bl_\ba_\bn_\be(std::size_t l, const Vc::SimdArray &v)\n-409 {\n-410 assert(l < n);\n-411 return v[l];\n-412 }\n-413\n-414 template\n-415 auto _\bl_\ba_\bn_\be(std::size_t l, Vc::SimdArray &v)\n-416 {\n-417 assert(l < n);\n-418 return VcImpl::Proxy >{l, v};\n-419 }\n-420\n-421 template\n-422 std::size_t _\bl_\ba_\bn_\be_\bs(const Vc::SimdMaskArray &)\n-423 {\n-424 return n;\n-425 }\n-426\n-427 template\n-428 bool _\bl_\ba_\bn_\be(std::size_t l, const Vc::SimdMaskArray &v)\n-429 {\n-430 assert(l < n);\n-431 return v[l];\n-432 }\n-433\n-434 template\n-435 auto _\bl_\ba_\bn_\be(std::size_t l, Vc::SimdMaskArray &v)\n-436 {\n-437 assert(l < n);\n-438 return VcImpl::Proxy >{l, v};\n-439 }\n-440#endif // HAVE_VC\n-441\n-443\n-446 template\n-_\b4_\b4_\b7 void _\ba_\bs_\bs_\bi_\bg_\bn(T &dst, const T &src, bool mask)\n-448 {\n-449 if(mask) dst = src;\n-450 }\n-451\n-452#if HAVE_VC\n-453 /*\n-454 Add Vc specializations for masked assignment\n-455 */\n-456 template\n-457 void _\ba_\bs_\bs_\bi_\bg_\bn(Vc::Vector &dst, const Vc::Vector &src,\n-458 typename Vc::Vector::mask_type mask)\n-459 {\n-460 dst(mask) = src;\n-461 }\n-462\n-463 template\n-464 void _\ba_\bs_\bs_\bi_\bg_\bn(Vc::SimdArray &dst, const Vc::SimdArray &src,\n-465 typename Vc::SimdArray::mask_type mask)\n-466 {\n-467 dst(mask) = src;\n-468 }\n-469#endif // HAVE_VC\n-470\n-471 template\n-_\b4_\b7_\b2 void _\bs_\bw_\ba_\bp(T &v1, T &v2, bool mask)\n-473 {\n-474 using std::swap;\n-475 if(mask) _\bs_\bw_\ba_\bp(v1, v2);\n-476 }\n-477\n-478#if HAVE_VC\n-479 /*\n-480 Add Vc specializations for masked swap\n-481 */\n-482 template\n-483 void _\bs_\bw_\ba_\bp(Vc::Vector &v1, Vc::Vector &v2,\n-484 typename Vc::Vector::mask_type mask)\n-485 {\n-486 auto tmp = v1;\n-487 v1(mask) = v2;\n-488 v2(mask) = tmp;\n-489 }\n-490\n-491 template\n-492 void _\bs_\bw_\ba_\bp(Vc::SimdArray &v1, Vc::SimdArray &v2,\n-493 typename Vc::SimdArray::mask_type mask)\n-494 {\n-495 auto tmp = v1;\n-496 v1(mask) = v2;\n-497 v2(mask) = tmp;\n-498 }\n-499#endif // HAVE_VC\n-500\n-501} // end namespace Dune\n-502\n-503#endif // DUNE_COMMON_SIMD_HH\n-_\bv_\bc_\b._\bh_\bh\n-Compatibility header for including \n-_\br_\ba_\bn_\bg_\be_\bu_\bt_\bi_\bl_\bi_\bt_\bi_\be_\bs_\b._\bh_\bh\n-Utilities for reduction like operations on ranges.\n-_\bt_\by_\bp_\be_\bt_\br_\ba_\bi_\bt_\bs_\b._\bh_\bh\n-Traits for type conversions and type information.\n-_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\ba_\bl_\b._\bh_\bh\n-_\bd_\be_\bb_\bu_\bg_\ba_\bl_\bi_\bg_\bn_\b._\bh_\bh\n-_\bD_\bu_\bn_\be\n-Dune namespace.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn alignedallocator.hh:13\n-_\bD_\bu_\bn_\be_\b:_\b:_\ba_\bn_\by_\b__\bt_\br_\bu_\be\n-bool any_true(const AlignedNumber< bool, align > &val)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn debugalign.hh:506\n-_\bD_\bu_\bn_\be_\b:_\b:_\ba_\bl_\bl_\b__\bt_\br_\bu_\be\n-bool all_true(const AlignedNumber< bool, align > &val)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn debugalign.hh:512\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bi_\bm_\bd_\bI_\bn_\bd_\be_\bx\n-typename SimdIndexTypeTraits< V >::type SimdIndex\n-An simd vector of indices corresponding to a simd vector V.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn simd.hh:246\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bi_\bm_\bd_\bS_\bc_\ba_\bl_\ba_\br\n-typename SimdScalarTypeTraits< T >::type SimdScalar\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn simd.hh:207\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bi_\bm_\bd_\bM_\ba_\bs_\bk\n-typename SimdMaskTypeTraits< V >::type SimdMask\n-A simd vector of truth values corresponding to a simd vector V.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn simd.hh:270\n-_\bD_\bu_\bn_\be_\b:_\b:_\bl_\ba_\bn_\be\n-T lane(std::size_t l, const T &v)\n-access a lane of a simd vector (scalar version)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn simd.hh:366\n-_\bD_\bu_\bn_\be_\b:_\b:_\bs_\bw_\ba_\bp\n-void swap(T &v1, T &v2, bool mask)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn simd.hh:472\n-_\bD_\bu_\bn_\be_\b:_\b:_\ba_\bs_\bs_\bi_\bg_\bn\n-void assign(T &dst, const T &src, bool mask)\n-masked Simd assignment (scalar version)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn simd.hh:447\n-_\bD_\bu_\bn_\be_\b:_\b:_\bc_\bo_\bn_\bd\n-const T1 cond(bool b, const T1 &v1, const T2 &v2)\n-conditional evaluate\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn conditional.hh:28\n-_\bD_\bu_\bn_\be_\b:_\b:_\bm_\ba_\bx_\b__\bv_\ba_\bl_\bu_\be\n-T max_value(const AlignedNumber< T, align > &val)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn debugalign.hh:494\n-_\bD_\bu_\bn_\be_\b:_\b:_\bm_\bi_\bn_\b__\bv_\ba_\bl_\bu_\be\n-T min_value(const AlignedNumber< T, align > &val)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn debugalign.hh:500\n-_\bD_\bu_\bn_\be_\b:_\b:_\bl_\ba_\bn_\be_\bs\n-std::size_t lanes(const T &)\n-get the number of lanes of a simd vector (scalar version)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn simd.hh:362\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bl_\bi_\bg_\bn_\be_\bd_\bN_\bu_\bm_\bb_\be_\br_\bI_\bm_\bp_\bl_\b:_\b:_\bA_\bl_\bi_\bg_\bn_\be_\bd_\bN_\bu_\bm_\bb_\be_\br\n-aligned wrappers for arithmetic types\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn debugalign.hh:128\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bi_\bm_\bd_\bS_\bc_\ba_\bl_\ba_\br_\bT_\by_\bp_\be_\bT_\br_\ba_\bi_\bt_\bs\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn simd.hh:202\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bi_\bm_\bd_\bS_\bc_\ba_\bl_\ba_\br_\bT_\by_\bp_\be_\bT_\br_\ba_\bi_\bt_\bs_\b:_\b:_\bt_\by_\bp_\be\n-T type\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn simd.hh:203\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bi_\bm_\bd_\bS_\bc_\ba_\bl_\ba_\br_\bT_\by_\bp_\be_\bT_\br_\ba_\bi_\bt_\bs_\b<_\b _\bA_\bl_\bi_\bg_\bn_\be_\bd_\bN_\bu_\bm_\bb_\be_\br_\b<_\b _\bT_\b,_\b _\ba_\bl_\bi_\bg_\bn_\b _\b>_\b _\b>_\b:_\b:_\bt_\by_\bp_\be\n-T type\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn simd.hh:230\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bi_\bm_\bd_\bI_\bn_\bd_\be_\bx_\bT_\by_\bp_\be_\bT_\br_\ba_\bi_\bt_\bs\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn simd.hh:234\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bi_\bm_\bd_\bI_\bn_\bd_\be_\bx_\bT_\by_\bp_\be_\bT_\br_\ba_\bi_\bt_\bs_\b:_\b:_\bt_\by_\bp_\be\n-std::size_t type\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn simd.hh:235\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bi_\bm_\bd_\bM_\ba_\bs_\bk_\bT_\by_\bp_\be_\bT_\br_\ba_\bi_\bt_\bs\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn simd.hh:261\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bi_\bm_\bd_\bM_\ba_\bs_\bk_\bT_\by_\bp_\be_\bT_\br_\ba_\bi_\bt_\bs_\b:_\b:_\bt_\by_\bp_\be\n-bool type\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn simd.hh:262\n-_\bv_\bc_\b._\bh_\bh\n-SIMD abstractions for Vc.\n-_\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bV_\bC_\b__\bA_\bS_\bS_\bI_\bG_\bN_\bM_\bE_\bN_\bT\n-#define DUNE_SIMD_VC_ASSIGNMENT(OP)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn simd/vc.hh:224\n+4// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception\n+5#ifndef DUNE_COMMON_ASSERTANDRETURN_HH\n+6#define DUNE_COMMON_ASSERTANDRETURN_HH\n+7\n+8#ifndef DUNE_DISABLE_DEPRECATION_WARNING_ASSERT_AND_RETURN\n+9#warning \"The file assertandreturn.hh is deprecated. Since c++14 constexpr\n+functions allow more \\\n+10than a single return statement and thus this utility is useless. Will be\n+removed after \\\n+11Dune 2.10 release.\"\n+12#endif // DUNE_DISABLE_DEPRECATION_WARNING_ASSERT_AND_RETURN\n+13\n+14#include \n+15\n+17\n+26#ifdef NDEBUG\n+27 #define DUNE_ASSERT_AND_RETURN(C,X) X\n+28#else\n+_\b2_\b9 #define DUNE_ASSERT_AND_RETURN(C,X) (!(C) ? throw [&](){assert(!#C);return\n+0;}() : 0), X\n+30#endif\n+31\n+32\n+33\n+34#endif // DUNE_COMMON_ASSERTANDRETURN_HH\n ===============================================================================\n Generated by\u00a0_\b[_\bd_\bo_\bx_\by_\bg_\be_\bn_\b] 1.9.8\n"}]}, {"source1": "./usr/share/doc/libdune-common-doc/doxygen/a00017.html", "source2": "./usr/share/doc/libdune-common-doc/doxygen/a00017.html", "unified_diff": "@@ -1,15 +1,15 @@\n \n \n \n \n \n \n \n-dune-common: dynmatrix.hh File Reference\n+dune-common: stdthread.hh File Reference\n \n \n \n \n \n \n \n@@ -70,52 +70,64 @@\n
\n \n
\n
\n
\n \n-
dynmatrix.hh File Reference
\n+Namespaces |\n+Macros |\n+Functions
\n+
stdthread.hh File Reference
\n \n
\n \n-

This file implements a dense matrix with dynamic numbers of rows and columns. \n-More...

\n-
#include <cmath>
\n-#include <cstddef>
\n-#include <iostream>
\n-#include <initializer_list>
\n-#include <dune/common/boundschecking.hh>
\n-#include <dune/common/exceptions.hh>
\n-#include <dune/common/dynvector.hh>
\n-#include <dune/common/densematrix.hh>
\n-#include <dune/common/typetraits.hh>
\n-
\n

Go to the source code of this file.

\n \n-\n-\n-\n-\n-\n-\n-\n-\n-

\n-Classes

struct  Dune::DenseMatVecTraits< DynamicMatrix< K > >
 
struct  Dune::FieldTraits< DynamicMatrix< K > >
 
class  Dune::DynamicMatrix< K >
 Construct a matrix with a dynamic size. More...
 
\n \n \n \n \n+

\n Namespaces

namespace  Dune
 Dune namespace.
 
\n+\n+\n+\n+\n+

\n+Macros

#define DUNE_ASSERT_CALL_ONCE()    ::Dune::assertCallOnce(__FILE__, __LINE__, __func__)
 Make sure call_once() works and provide a helpful error message otherwise.
 
\n+\n+\n+\n+\n+\n+\n

\n+Functions

void Dune::doAssertCallOnce (const char *file, int line, const char *function)
 
void Dune::assertCallOnce (const char *file=nullptr, int line=-1, const char *function=nullptr)
 Make sure call_once() works and provide a helpful error message otherwise.
 
\n-

Detailed Description

\n-

This file implements a dense matrix with dynamic numbers of rows and columns.

\n-
\n+

Macro Definition Documentation

\n+\n+

◆ DUNE_ASSERT_CALL_ONCE

\n+\n+
\n+
\n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+
#define DUNE_ASSERT_CALL_ONCE()    ::Dune::assertCallOnce(__FILE__, __LINE__, __func__)
\n+
\n+\n+

Make sure call_once() works and provide a helpful error message otherwise.

\n+

This calls assertCallOnce() and automatically provides information about the caller in the error message.

\n+\n+
\n+
\n+\n \n
\n Generated by \"doxygen\"/ 1.9.8\n
\n \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,37 +1,36 @@\n dune-common\u00a02.10\n Loading...\n Searching...\n No Matches\n * _\bd_\bu_\bn_\be\n * _\bc_\bo_\bm_\bm_\bo_\bn\n-_\bC_\bl_\ba_\bs_\bs_\be_\bs | _\bN_\ba_\bm_\be_\bs_\bp_\ba_\bc_\be_\bs\n-dynmatrix.hh File Reference\n-_\bC_\bo_\bm_\bm_\bo_\bn \u00bb _\bD_\be_\bn_\bs_\be_\b _\bM_\ba_\bt_\br_\bi_\bx_\b _\ba_\bn_\bd_\b _\bV_\be_\bc_\bt_\bo_\br_\b _\bT_\be_\bm_\bp_\bl_\ba_\bt_\be_\b _\bL_\bi_\bb_\br_\ba_\br_\by\n-This file implements a dense matrix with dynamic numbers of rows and columns.\n-_\bM_\bo_\br_\be_\b._\b._\b.\n-#include \n-#include \n-#include \n-#include \n-#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bb_\bo_\bu_\bn_\bd_\bs_\bc_\bh_\be_\bc_\bk_\bi_\bn_\bg_\b._\bh_\bh>\n-#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\be_\bx_\bc_\be_\bp_\bt_\bi_\bo_\bn_\bs_\b._\bh_\bh>\n-#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bd_\by_\bn_\bv_\be_\bc_\bt_\bo_\br_\b._\bh_\bh>\n-#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bd_\be_\bn_\bs_\be_\bm_\ba_\bt_\br_\bi_\bx_\b._\bh_\bh>\n-#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bt_\by_\bp_\be_\bt_\br_\ba_\bi_\bt_\bs_\b._\bh_\bh>\n+_\bN_\ba_\bm_\be_\bs_\bp_\ba_\bc_\be_\bs | _\bM_\ba_\bc_\br_\bo_\bs | _\bF_\bu_\bn_\bc_\bt_\bi_\bo_\bn_\bs\n+stdthread.hh File Reference\n _\bG_\bo_\b _\bt_\bo_\b _\bt_\bh_\be_\b _\bs_\bo_\bu_\br_\bc_\be_\b _\bc_\bo_\bd_\be_\b _\bo_\bf_\b _\bt_\bh_\bi_\bs_\b _\bf_\bi_\bl_\be_\b.\n-C\bCl\bla\bas\bss\bse\bes\bs\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\bV_\be_\bc_\bT_\br_\ba_\bi_\bt_\bs_\b<_\b _\bD_\by_\bn_\ba_\bm_\bi_\bc_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bK_\b _\b>_\b _\b>\n-\u00a0\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bF_\bi_\be_\bl_\bd_\bT_\br_\ba_\bi_\bt_\bs_\b<_\b _\bD_\by_\bn_\ba_\bm_\bi_\bc_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bK_\b _\b>_\b _\b>\n-\u00a0\n- class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bD_\by_\bn_\ba_\bm_\bi_\bc_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bK_\b _\b>\n-\u00a0 Construct a matrix with a dynamic size. _\bM_\bo_\br_\be_\b._\b._\b.\n-\u00a0\n N\bNa\bam\bme\bes\bsp\bpa\bac\bce\bes\bs\n namespace \u00a0 _\bD_\bu_\bn_\be\n \u00a0 _\bD_\bu_\bn_\be namespace.\n \u00a0\n-*\b**\b**\b**\b**\b* D\bDe\bet\bta\bai\bil\ble\bed\bd D\bDe\bes\bsc\bcr\bri\bip\bpt\bti\bio\bon\bn *\b**\b**\b**\b**\b*\n-This file implements a dense matrix with dynamic numbers of rows and columns.\n+M\bMa\bac\bcr\bro\bos\bs\n+#define\u00a0 _\bD_\bU_\bN_\bE_\b__\bA_\bS_\bS_\bE_\bR_\bT_\b__\bC_\bA_\bL_\bL_\b__\bO_\bN_\bC_\bE()\u00a0\u00a0\u00a0 _\b:_\b:_\bD_\bu_\bn_\be_\b:_\b:_\ba_\bs_\bs_\be_\br_\bt_\bC_\ba_\bl_\bl_\bO_\bn_\bc_\be(__FILE__, __LINE__,\n+ __func__)\n+\u00a0 Make sure call_once() works and provide a helpful error message\n+ otherwise.\n+\u00a0\n+F\bFu\bun\bnc\bct\bti\bio\bon\bns\bs\n+void\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bd_\bo_\bA_\bs_\bs_\be_\br_\bt_\bC_\ba_\bl_\bl_\bO_\bn_\bc_\be (const char *file, int line, const char *function)\n+\u00a0\n+void\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\ba_\bs_\bs_\be_\br_\bt_\bC_\ba_\bl_\bl_\bO_\bn_\bc_\be (const char *file=nullptr, int line=-1, const char\n+ *function=nullptr)\n+\u00a0 Make sure call_once() works and provide a helpful error message\n+ otherwise.\n+\u00a0\n+*\b**\b**\b**\b**\b* M\bMa\bac\bcr\bro\bo D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn D\bDo\boc\bcu\bum\bme\ben\bnt\bta\bat\bti\bio\bon\bn *\b**\b**\b**\b**\b*\n+*\b**\b**\b**\b**\b* _\b?\b\u25c6_\b?\b\u00a0D\bDU\bUN\bNE\bE_\b_A\bAS\bSS\bSE\bER\bRT\bT_\b_C\bCA\bAL\bLL\bL_\b_O\bON\bNC\bCE\bE *\b**\b**\b**\b**\b*\n+#define DUNE_ASSERT_CALL_ONCE ( ) \u00a0\u00a0\u00a0 _\b:_\b:_\bD_\bu_\bn_\be_\b:_\b:_\ba_\bs_\bs_\be_\br_\bt_\bC_\ba_\bl_\bl_\bO_\bn_\bc_\be(__FILE__,\n+ __LINE__, __func__)\n+Make sure call_once() works and provide a helpful error message otherwise.\n+This calls assertCallOnce() and automatically provides information about the\n+caller in the error message.\n ===============================================================================\n Generated by\u00a0_\b[_\bd_\bo_\bx_\by_\bg_\be_\bn_\b] 1.9.8\n"}]}, {"source1": "./usr/share/doc/libdune-common-doc/doxygen/a00017_source.html", "source2": "./usr/share/doc/libdune-common-doc/doxygen/a00017_source.html", "unified_diff": "@@ -1,15 +1,15 @@\n \n \n \n \n \n \n \n-dune-common: dynmatrix.hh Source File\n+dune-common: stdthread.hh Source File\n \n \n \n \n \n \n \n@@ -74,215 +74,54 @@\n \n
\n \n
\n \n
\n-
dynmatrix.hh
\n+
stdthread.hh
\n
\n
\n Go to the documentation of this file.
1// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
\n
2// vi: set et ts=4 sw=2 sts=2:
\n
3// SPDX-FileCopyrightInfo: Copyright \u00a9 DUNE Project contributors, see file LICENSE.md in module root
\n
4// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception
\n-
5#ifndef DUNE_DYNMATRIX_HH
\n-
6#define DUNE_DYNMATRIX_HH
\n-
7
\n-
8#include <cmath>
\n-
9#include <cstddef>
\n-
10#include <iostream>
\n-
11#include <initializer_list>
\n-
12
\n-\n-\n-\n-\n-\n-
18
\n-
19namespace Dune
\n-
20{
\n-
21
\n-
31 template< class K > class DynamicMatrix;
\n-
32
\n-
33 template< class K >
\n-
\n-\n-
35 {
\n-\n-
37
\n-\n-
39
\n-\n-\n-
42
\n-
43 typedef std::vector<K> container_type;
\n-
44 typedef K value_type;
\n-
45 typedef typename container_type::size_type size_type;
\n-
46 };
\n-
\n-
47
\n-
48 template< class K >
\n-
\n-\n-
50 {
\n-\n-\n-
53 };
\n-
\n-
54
\n-
59 template<class K>
\n-
\n-
60 class DynamicMatrix : public DenseMatrix< DynamicMatrix<K> >
\n-
61 {
\n-
62 std::vector< DynamicVector<K> > _data;
\n-\n-
64 public:
\n-
65 typedef typename Base::size_type size_type;
\n-
66 typedef typename Base::value_type value_type;
\n-
67 typedef typename Base::row_type row_type;
\n-
68
\n-
69 //===== constructors
\n-\n-
72
\n-
\n-\n-
75 _data(r, row_type(c, v) )
\n-
76 {}
\n-
\n-
77
\n-
\n-
80 DynamicMatrix (std::initializer_list<DynamicVector<K>> const &ll)
\n-
81 : _data(ll)
\n-
82 {}
\n-
\n-
83
\n-
84
\n-
85 template <class T,
\n-
86 typename = std::enable_if_t<!Dune::IsNumber<T>::value && HasDenseMatrixAssigner<DynamicMatrix, T>::value>>
\n-
\n-
87 DynamicMatrix(T const& rhs)
\n-
88 {
\n-
89 *this = rhs;
\n-
90 }
\n-
\n-
91
\n-
92 //==== resize related methods
\n-
\n-\n-
107 {
\n-
108 _data.resize(0);
\n-
109 _data.resize(r, row_type(c, v) );
\n-
110 }
\n-
\n-
111
\n-
112 //===== assignment
\n-
113 // General assignment with resizing
\n-
114 template <typename T,
\n-
115 typename = std::enable_if_t<!Dune::IsNumber<T>::value>>
\n-
\n-
116 DynamicMatrix& operator=(T const& rhs) {
\n-
117 _data.resize(rhs.N());
\n-
118 std::fill(_data.begin(), _data.end(), row_type(rhs.M(), K(0)));
\n-
119 Base::operator=(rhs);
\n-
120 return *this;
\n-
121 }
\n+
5
\n+
6#ifndef DUNE_COMMON_STDTHREAD_HH
\n+
7#define DUNE_COMMON_STDTHREAD_HH
\n+
8
\n+
9namespace Dune
\n+
10{
\n+
11
\n+
12 // used internally by assertCallOnce for the actual check
\n+
13 void doAssertCallOnce(const char *file, int line, const char *function);
\n+
14
\n+
17
\n+
\n+
35 inline void assertCallOnce(const char *file = nullptr, int line = -1,
\n+
36 const char *function = nullptr)
\n+
37 {
\n+
38 // make sure to call this only the first time this function is invoked
\n+
39 [[maybe_unused]] static const bool works
\n+
40 = (doAssertCallOnce(file, line, function), true);
\n+
41 }
\n
\n-
122
\n-
123 // Specialisation: scalar assignment (no resizing)
\n-
124 template <typename T,
\n-
125 typename = std::enable_if_t<Dune::IsNumber<T>::value>>
\n-
\n-\n-
127 std::fill(_data.begin(), _data.end(), scalar);
\n-
128 return *this;
\n-
129 }
\n-
\n-
130
\n-
\n-\n-
133 {
\n-
134 DynamicMatrix AT(this->M(), this->N());
\n-
135 for( size_type i = 0; i < this->N(); ++i )
\n-
136 for( size_type j = 0; j < this->M(); ++j )
\n-
137 AT[j][i] = (*this)[i][j];
\n-
138 return AT;
\n-
139 }
\n-
\n-
140
\n-
141 // make this thing a matrix
\n-
142 size_type mat_rows() const { return _data.size(); }
\n-
\n-\n-
144 assert(this->rows());
\n-
145 return _data.front().size();
\n-
146 }
\n-
\n-
\n-\n-
148 DUNE_ASSERT_BOUNDS(i < _data.size());
\n-
149 return _data[i];
\n-
150 }
\n-
\n-
\n-
151 const row_type & mat_access(size_type i) const {
\n-
152 DUNE_ASSERT_BOUNDS(i < _data.size());
\n-
153 return _data[i];
\n-
154 }
\n-
\n-
155 };
\n-
\n-
156
\n-
159} // end namespace
\n-
160
\n-
161#endif
\n-
Implements a matrix constructed from a given type representing a field and a compile-time given numbe...
\n-
Traits for type conversions and type information.
\n-
This file implements a dense vector with a dynamic size.
\n-
Macro for wrapping boundary checks.
\n-
A few common exception classes.
\n-
#define DUNE_ASSERT_BOUNDS(cond)
If DUNE_CHECK_BOUNDS is defined: check if condition cond holds; otherwise, do nothing.
Definition boundschecking.hh:30
\n+
42
\n+
45
\n+
\n+
49#define DUNE_ASSERT_CALL_ONCE() \\
\n+
50 ::Dune::assertCallOnce(__FILE__, __LINE__, __func__)
\n+
\n+
51
\n+
52} // namespace Dune
\n+
53
\n+
54#endif // DUNE_COMMON_STDTHREAD_HH
\n
Dune namespace.
Definition alignedallocator.hh:13
\n-
A dense n x m matrix.
Definition densematrix.hh:140
\n-
derived_type & operator=(const RHS &rhs)
Definition densematrix.hh:279
\n-
constexpr size_type M() const
number of columns
Definition densematrix.hh:703
\n-
Traits::value_type value_type
export the type representing the field
Definition densematrix.hh:157
\n-
constexpr size_type rows() const
number of rows
Definition densematrix.hh:709
\n-
constexpr size_type N() const
number of rows
Definition densematrix.hh:697
\n-
Traits::size_type size_type
The type used for the index access and size operation.
Definition densematrix.hh:166
\n-
Construct a matrix with a dynamic size.
Definition dynmatrix.hh:61
\n-
size_type mat_cols() const
Definition dynmatrix.hh:143
\n-
DynamicMatrix(std::initializer_list< DynamicVector< K > > const &ll)
Constructor initializing the matrix from a list of vector.
Definition dynmatrix.hh:80
\n-
Base::row_type row_type
Definition dynmatrix.hh:67
\n-
DynamicMatrix transposed() const
Return transposed of the matrix as DynamicMatrix.
Definition dynmatrix.hh:132
\n-
Base::value_type value_type
Definition dynmatrix.hh:66
\n-
row_type & mat_access(size_type i)
Definition dynmatrix.hh:147
\n-
Base::size_type size_type
Definition dynmatrix.hh:65
\n-
size_type mat_rows() const
Definition dynmatrix.hh:142
\n-
DynamicMatrix(T const &rhs)
Definition dynmatrix.hh:87
\n-
const row_type & mat_access(size_type i) const
Definition dynmatrix.hh:151
\n-
void resize(size_type r, size_type c, value_type v=value_type())
resize matrix to r \u00d7 c
Definition dynmatrix.hh:106
\n-
DynamicMatrix & operator=(T const &rhs)
Definition dynmatrix.hh:116
\n-
DynamicMatrix()
Default constructor.
Definition dynmatrix.hh:71
\n-
DynamicMatrix(size_type r, size_type c, value_type v=value_type())
Constructor initializing the whole matrix with a scalar.
Definition dynmatrix.hh:74
\n-
DynamicMatrix & operator=(T scalar)
Definition dynmatrix.hh:126
\n-
container_type::size_type size_type
Definition dynmatrix.hh:45
\n-
DynamicVector< K > row_type
Definition dynmatrix.hh:38
\n-
row_type & row_reference
Definition dynmatrix.hh:40
\n-
K value_type
Definition dynmatrix.hh:44
\n-
DynamicMatrix< K > derived_type
Definition dynmatrix.hh:36
\n-
const row_type & const_row_reference
Definition dynmatrix.hh:41
\n-
std::vector< K > container_type
Definition dynmatrix.hh:43
\n-
FieldTraits< K >::real_type real_type
Definition dynmatrix.hh:52
\n-
FieldTraits< K >::field_type field_type
Definition dynmatrix.hh:51
\n-
Construct a vector with a dynamic size.
Definition dynvector.hh:59
\n-
Definition ftraits.hh:26
\n-
T field_type
export the type representing the field
Definition ftraits.hh:28
\n-
T real_type
export the type representing the real type of the field
Definition ftraits.hh:30
\n-
Definition matvectraits.hh:31
\n+
void assertCallOnce(const char *file=nullptr, int line=-1, const char *function=nullptr)
Make sure call_once() works and provide a helpful error message otherwise.
Definition stdthread.hh:35
\n+
void doAssertCallOnce(const char *file, int line, const char *function)
Definition stdthread.cc:38
\n
\n \n
\n Generated by \"doxygen\"/ 1.9.8\n
\n \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,280 +1,52 @@\n dune-common\u00a02.10\n Loading...\n Searching...\n No Matches\n * _\bd_\bu_\bn_\be\n * _\bc_\bo_\bm_\bm_\bo_\bn\n-dynmatrix.hh\n+stdthread.hh\n _\bG_\bo_\b _\bt_\bo_\b _\bt_\bh_\be_\b _\bd_\bo_\bc_\bu_\bm_\be_\bn_\bt_\ba_\bt_\bi_\bo_\bn_\b _\bo_\bf_\b _\bt_\bh_\bi_\bs_\b _\bf_\bi_\bl_\be_\b.\n 1// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-\n 2// vi: set et ts=4 sw=2 sts=2:\n 3// SPDX-FileCopyrightInfo: Copyright \u00c2\u00a9 DUNE Project contributors, see file\n LICENSE.md in module root\n 4// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception\n-5#ifndef DUNE_DYNMATRIX_HH\n-6#define DUNE_DYNMATRIX_HH\n-7\n-8#include \n-9#include \n-10#include \n-11#include \n-12\n-13#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bb_\bo_\bu_\bn_\bd_\bs_\bc_\bh_\be_\bc_\bk_\bi_\bn_\bg_\b._\bh_\bh>\n-14#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\be_\bx_\bc_\be_\bp_\bt_\bi_\bo_\bn_\bs_\b._\bh_\bh>\n-15#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bd_\by_\bn_\bv_\be_\bc_\bt_\bo_\br_\b._\bh_\bh>\n-16#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bd_\be_\bn_\bs_\be_\bm_\ba_\bt_\br_\bi_\bx_\b._\bh_\bh>\n-17#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bt_\by_\bp_\be_\bt_\br_\ba_\bi_\bt_\bs_\b._\bh_\bh>\n-18\n-19namespace _\bD_\bu_\bn_\be\n-20{\n-21\n-31 template< class K > class DynamicMatrix;\n-32\n-33 template< class K >\n-_\b3_\b4 struct _\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\bV_\be_\bc_\bT_\br_\ba_\bi_\bt_\bs< _\bD_\by_\bn_\ba_\bm_\bi_\bc_\bM_\ba_\bt_\br_\bi_\bx >\n-35 {\n-_\b3_\b6 typedef _\bD_\by_\bn_\ba_\bm_\bi_\bc_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bK_\b> _\bd_\be_\br_\bi_\bv_\be_\bd_\b__\bt_\by_\bp_\be;\n-37\n-_\b3_\b8 typedef _\bD_\by_\bn_\ba_\bm_\bi_\bc_\bV_\be_\bc_\bt_\bo_\br_\b<_\bK_\b> _\br_\bo_\bw_\b__\bt_\by_\bp_\be;\n-39\n-_\b4_\b0 typedef _\br_\bo_\bw_\b__\bt_\by_\bp_\be &_\br_\bo_\bw_\b__\br_\be_\bf_\be_\br_\be_\bn_\bc_\be;\n-_\b4_\b1 typedef const _\br_\bo_\bw_\b__\bt_\by_\bp_\be &_\bc_\bo_\bn_\bs_\bt_\b__\br_\bo_\bw_\b__\br_\be_\bf_\be_\br_\be_\bn_\bc_\be;\n+5\n+6#ifndef DUNE_COMMON_STDTHREAD_HH\n+7#define DUNE_COMMON_STDTHREAD_HH\n+8\n+9namespace _\bD_\bu_\bn_\be\n+10{\n+11\n+12 // used internally by assertCallOnce for the actual check\n+13 void _\bd_\bo_\bA_\bs_\bs_\be_\br_\bt_\bC_\ba_\bl_\bl_\bO_\bn_\bc_\be(const char *file, int line, const char *function);\n+14\n+17\n+_\b3_\b5 inline void _\ba_\bs_\bs_\be_\br_\bt_\bC_\ba_\bl_\bl_\bO_\bn_\bc_\be(const char *file = nullptr, int line = -1,\n+36 const char *function = nullptr)\n+37 {\n+38 // make sure to call this only the first time this function is invoked\n+39 [[maybe_unused]] static const bool works\n+40 = (_\bd_\bo_\bA_\bs_\bs_\be_\br_\bt_\bC_\ba_\bl_\bl_\bO_\bn_\bc_\be(file, line, function), true);\n+41 }\n 42\n-_\b4_\b3 typedef std::vector _\bc_\bo_\bn_\bt_\ba_\bi_\bn_\be_\br_\b__\bt_\by_\bp_\be;\n-_\b4_\b4 typedef K _\bv_\ba_\bl_\bu_\be_\b__\bt_\by_\bp_\be;\n-_\b4_\b5 typedef typename container_type::size_type _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be;\n-46 };\n-47\n-48 template< class K >\n-_\b4_\b9 struct _\bF_\bi_\be_\bl_\bd_\bT_\br_\ba_\bi_\bt_\bs< _\bD_\by_\bn_\ba_\bm_\bi_\bc_\bM_\ba_\bt_\br_\bi_\bx >\n-50 {\n-_\b5_\b1 typedef typename _\bF_\bi_\be_\bl_\bd_\bT_\br_\ba_\bi_\bt_\bs_\b<_\bK_\b>_\b:_\b:_\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be _\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be;\n-_\b5_\b2 typedef typename _\bF_\bi_\be_\bl_\bd_\bT_\br_\ba_\bi_\bt_\bs_\b<_\bK_\b>_\b:_\b:_\br_\be_\ba_\bl_\b__\bt_\by_\bp_\be _\br_\be_\ba_\bl_\b__\bt_\by_\bp_\be;\n-53 };\n-54\n-59 template\n-_\b6_\b0 class _\bD_\by_\bn_\ba_\bm_\bi_\bc_\bM_\ba_\bt_\br_\bi_\bx : public _\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx< DynamicMatrix >\n-61 {\n-62 std::vector< DynamicVector > _data;\n-63 typedef _\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bD_\by_\bn_\ba_\bm_\bi_\bc_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bK_\b> > _\bB_\ba_\bs_\be;\n-64 public:\n-_\b6_\b5 typedef typename _\bB_\ba_\bs_\be_\b:_\b:_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be;\n-_\b6_\b6 typedef typename _\bB_\ba_\bs_\be_\b:_\b:_\bv_\ba_\bl_\bu_\be_\b__\bt_\by_\bp_\be _\bv_\ba_\bl_\bu_\be_\b__\bt_\by_\bp_\be;\n-_\b6_\b7 typedef typename _\bB_\ba_\bs_\be_\b:_\b:_\br_\bo_\bw_\b__\bt_\by_\bp_\be _\br_\bo_\bw_\b__\bt_\by_\bp_\be;\n-68\n-69 //===== constructors\n-_\b7_\b1 _\bD_\by_\bn_\ba_\bm_\bi_\bc_\bM_\ba_\bt_\br_\bi_\bx () {}\n-72\n-_\b7_\b4 _\bD_\by_\bn_\ba_\bm_\bi_\bc_\bM_\ba_\bt_\br_\bi_\bx (_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be r, _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be c, _\bv_\ba_\bl_\bu_\be_\b__\bt_\by_\bp_\be v = _\bv_\ba_\bl_\bu_\be_\b__\bt_\by_\bp_\be() ) :\n-75 _data(r, _\br_\bo_\bw_\b__\bt_\by_\bp_\be(c, v) )\n-76 {}\n-77\n-_\b8_\b0 _\bD_\by_\bn_\ba_\bm_\bi_\bc_\bM_\ba_\bt_\br_\bi_\bx (std::initializer_list<_\bD_\by_\bn_\ba_\bm_\bi_\bc_\bV_\be_\bc_\bt_\bo_\br_\b<_\bK_\b>> const &ll)\n-81 : _data(ll)\n-82 {}\n-83\n-84\n-85 template ::value &&\n-HasDenseMatrixAssigner::value>>\n-_\b8_\b7 _\bD_\by_\bn_\ba_\bm_\bi_\bc_\bM_\ba_\bt_\br_\bi_\bx(T const& rhs)\n-88 {\n-89 *this = rhs;\n-90 }\n-91\n-92 //==== resize related methods\n-_\b1_\b0_\b6 void _\br_\be_\bs_\bi_\bz_\be (_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be r, _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be c, _\bv_\ba_\bl_\bu_\be_\b__\bt_\by_\bp_\be v = _\bv_\ba_\bl_\bu_\be_\b__\bt_\by_\bp_\be() )\n-107 {\n-108 _data.resize(0);\n-109 _data.resize(r, _\br_\bo_\bw_\b__\bt_\by_\bp_\be(c, v) );\n-110 }\n-111\n-112 //===== assignment\n-113 // General assignment with resizing\n-114 template ::value>>\n-_\b1_\b1_\b6 _\bD_\by_\bn_\ba_\bm_\bi_\bc_\bM_\ba_\bt_\br_\bi_\bx& _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b=(T const& rhs) {\n-117 _data._\br_\be_\bs_\bi_\bz_\be(rhs.N());\n-118 std::fill(_data.begin(), _data.end(), _\br_\bo_\bw_\b__\bt_\by_\bp_\be(rhs.M(), K(0)));\n-119 _\bB_\ba_\bs_\be_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b=(rhs);\n-120 return *this;\n-121 }\n-122\n-123 // Specialisation: scalar assignment (no resizing)\n-124 template ::value>>\n-_\b1_\b2_\b6 _\bD_\by_\bn_\ba_\bm_\bi_\bc_\bM_\ba_\bt_\br_\bi_\bx& _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b=(T scalar) {\n-127 std::fill(_data.begin(), _data.end(), scalar);\n-128 return *this;\n-129 }\n-130\n-_\b1_\b3_\b2 _\bD_\by_\bn_\ba_\bm_\bi_\bc_\bM_\ba_\bt_\br_\bi_\bx _\bt_\br_\ba_\bn_\bs_\bp_\bo_\bs_\be_\bd() const\n-133 {\n-134 _\bD_\by_\bn_\ba_\bm_\bi_\bc_\bM_\ba_\bt_\br_\bi_\bx AT(this->_\bM(), this->_\bN());\n-135 for( size_type i = 0; i < this->_\bN(); ++i )\n-136 for( _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be j = 0; j < this->_\bM(); ++j )\n-137 AT[j][i] = (*this)[i][j];\n-138 return AT;\n-139 }\n-140\n-141 // make this thing a matrix\n-_\b1_\b4_\b2 _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be _\bm_\ba_\bt_\b__\br_\bo_\bw_\bs() const { return _data.size(); }\n-_\b1_\b4_\b3 _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be _\bm_\ba_\bt_\b__\bc_\bo_\bl_\bs() const {\n-144 assert(this->_\br_\bo_\bw_\bs());\n-145 return _data.front().size();\n-146 }\n-_\b1_\b4_\b7 _\br_\bo_\bw_\b__\bt_\by_\bp_\be & _\bm_\ba_\bt_\b__\ba_\bc_\bc_\be_\bs_\bs(_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be i) {\n-148 _\bD_\bU_\bN_\bE_\b__\bA_\bS_\bS_\bE_\bR_\bT_\b__\bB_\bO_\bU_\bN_\bD_\bS(i < _data.size());\n-149 return _data[i];\n-150 }\n-_\b1_\b5_\b1 const _\br_\bo_\bw_\b__\bt_\by_\bp_\be & _\bm_\ba_\bt_\b__\ba_\bc_\bc_\be_\bs_\bs(_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be i) const {\n-152 _\bD_\bU_\bN_\bE_\b__\bA_\bS_\bS_\bE_\bR_\bT_\b__\bB_\bO_\bU_\bN_\bD_\bS(i < _data.size());\n-153 return _data[i];\n-154 }\n-155 };\n-156\n-159} // end namespace\n-160\n-161#endif\n-_\bd_\be_\bn_\bs_\be_\bm_\ba_\bt_\br_\bi_\bx_\b._\bh_\bh\n-Implements a matrix constructed from a given type representing a field and a\n-compile-time given numbe...\n-_\bt_\by_\bp_\be_\bt_\br_\ba_\bi_\bt_\bs_\b._\bh_\bh\n-Traits for type conversions and type information.\n-_\bd_\by_\bn_\bv_\be_\bc_\bt_\bo_\br_\b._\bh_\bh\n-This file implements a dense vector with a dynamic size.\n-_\bb_\bo_\bu_\bn_\bd_\bs_\bc_\bh_\be_\bc_\bk_\bi_\bn_\bg_\b._\bh_\bh\n-Macro for wrapping boundary checks.\n-_\be_\bx_\bc_\be_\bp_\bt_\bi_\bo_\bn_\bs_\b._\bh_\bh\n-A few common exception classes.\n-_\bD_\bU_\bN_\bE_\b__\bA_\bS_\bS_\bE_\bR_\bT_\b__\bB_\bO_\bU_\bN_\bD_\bS\n-#define DUNE_ASSERT_BOUNDS(cond)\n-If DUNE_CHECK_BOUNDS is defined: check if condition cond holds; otherwise, do\n-nothing.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn boundschecking.hh:30\n+45\n+_\b4_\b9#define DUNE_ASSERT_CALL_ONCE() \\\n+50 ::Dune::assertCallOnce(__FILE__, __LINE__, __func__)\n+51\n+52} // namespace Dune\n+53\n+54#endif // DUNE_COMMON_STDTHREAD_HH\n _\bD_\bu_\bn_\be\n Dune namespace.\n D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn alignedallocator.hh:13\n-_\bD_\bu_\bn_\be_\b:_\b:_\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx\n-A dense n x m matrix.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn densematrix.hh:140\n-_\bD_\bu_\bn_\be_\b:_\b:_\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bD_\by_\bn_\ba_\bm_\bi_\bc_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bK_\b _\b>_\b _\b>_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b=\n-derived_type & operator=(const RHS &rhs)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn densematrix.hh:279\n-_\bD_\bu_\bn_\be_\b:_\b:_\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bD_\by_\bn_\ba_\bm_\bi_\bc_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bK_\b _\b>_\b _\b>_\b:_\b:_\bM\n-constexpr size_type M() const\n-number of columns\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn densematrix.hh:703\n-_\bD_\bu_\bn_\be_\b:_\b:_\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bD_\by_\bn_\ba_\bm_\bi_\bc_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bK_\b _\b>_\b _\b>_\b:_\b:_\bv_\ba_\bl_\bu_\be_\b__\bt_\by_\bp_\be\n-Traits::value_type value_type\n-export the type representing the field\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn densematrix.hh:157\n-_\bD_\bu_\bn_\be_\b:_\b:_\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bD_\by_\bn_\ba_\bm_\bi_\bc_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bK_\b _\b>_\b _\b>_\b:_\b:_\br_\bo_\bw_\bs\n-constexpr size_type rows() const\n-number of rows\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn densematrix.hh:709\n-_\bD_\bu_\bn_\be_\b:_\b:_\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bD_\by_\bn_\ba_\bm_\bi_\bc_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bK_\b _\b>_\b _\b>_\b:_\b:_\bN\n-constexpr size_type N() const\n-number of rows\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn densematrix.hh:697\n-_\bD_\bu_\bn_\be_\b:_\b:_\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bD_\by_\bn_\ba_\bm_\bi_\bc_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bK_\b _\b>_\b _\b>_\b:_\b:_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be\n-Traits::size_type size_type\n-The type used for the index access and size operation.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn densematrix.hh:166\n-_\bD_\bu_\bn_\be_\b:_\b:_\bD_\by_\bn_\ba_\bm_\bi_\bc_\bM_\ba_\bt_\br_\bi_\bx\n-Construct a matrix with a dynamic size.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn dynmatrix.hh:61\n-_\bD_\bu_\bn_\be_\b:_\b:_\bD_\by_\bn_\ba_\bm_\bi_\bc_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bm_\ba_\bt_\b__\bc_\bo_\bl_\bs\n-size_type mat_cols() const\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn dynmatrix.hh:143\n-_\bD_\bu_\bn_\be_\b:_\b:_\bD_\by_\bn_\ba_\bm_\bi_\bc_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bD_\by_\bn_\ba_\bm_\bi_\bc_\bM_\ba_\bt_\br_\bi_\bx\n-DynamicMatrix(std::initializer_list< DynamicVector< K > > const &ll)\n-Constructor initializing the matrix from a list of vector.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn dynmatrix.hh:80\n-_\bD_\bu_\bn_\be_\b:_\b:_\bD_\by_\bn_\ba_\bm_\bi_\bc_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\br_\bo_\bw_\b__\bt_\by_\bp_\be\n-Base::row_type row_type\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn dynmatrix.hh:67\n-_\bD_\bu_\bn_\be_\b:_\b:_\bD_\by_\bn_\ba_\bm_\bi_\bc_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bt_\br_\ba_\bn_\bs_\bp_\bo_\bs_\be_\bd\n-DynamicMatrix transposed() const\n-Return transposed of the matrix as DynamicMatrix.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn dynmatrix.hh:132\n-_\bD_\bu_\bn_\be_\b:_\b:_\bD_\by_\bn_\ba_\bm_\bi_\bc_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bv_\ba_\bl_\bu_\be_\b__\bt_\by_\bp_\be\n-Base::value_type value_type\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn dynmatrix.hh:66\n-_\bD_\bu_\bn_\be_\b:_\b:_\bD_\by_\bn_\ba_\bm_\bi_\bc_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bm_\ba_\bt_\b__\ba_\bc_\bc_\be_\bs_\bs\n-row_type & mat_access(size_type i)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn dynmatrix.hh:147\n-_\bD_\bu_\bn_\be_\b:_\b:_\bD_\by_\bn_\ba_\bm_\bi_\bc_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be\n-Base::size_type size_type\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn dynmatrix.hh:65\n-_\bD_\bu_\bn_\be_\b:_\b:_\bD_\by_\bn_\ba_\bm_\bi_\bc_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bm_\ba_\bt_\b__\br_\bo_\bw_\bs\n-size_type mat_rows() const\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn dynmatrix.hh:142\n-_\bD_\bu_\bn_\be_\b:_\b:_\bD_\by_\bn_\ba_\bm_\bi_\bc_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bD_\by_\bn_\ba_\bm_\bi_\bc_\bM_\ba_\bt_\br_\bi_\bx\n-DynamicMatrix(T const &rhs)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn dynmatrix.hh:87\n-_\bD_\bu_\bn_\be_\b:_\b:_\bD_\by_\bn_\ba_\bm_\bi_\bc_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bm_\ba_\bt_\b__\ba_\bc_\bc_\be_\bs_\bs\n-const row_type & mat_access(size_type i) const\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn dynmatrix.hh:151\n-_\bD_\bu_\bn_\be_\b:_\b:_\bD_\by_\bn_\ba_\bm_\bi_\bc_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\br_\be_\bs_\bi_\bz_\be\n-void resize(size_type r, size_type c, value_type v=value_type())\n-resize matrix to r \u00c3\u0097 c\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn dynmatrix.hh:106\n-_\bD_\bu_\bn_\be_\b:_\b:_\bD_\by_\bn_\ba_\bm_\bi_\bc_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b=\n-DynamicMatrix & operator=(T const &rhs)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn dynmatrix.hh:116\n-_\bD_\bu_\bn_\be_\b:_\b:_\bD_\by_\bn_\ba_\bm_\bi_\bc_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bD_\by_\bn_\ba_\bm_\bi_\bc_\bM_\ba_\bt_\br_\bi_\bx\n-DynamicMatrix()\n-Default constructor.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn dynmatrix.hh:71\n-_\bD_\bu_\bn_\be_\b:_\b:_\bD_\by_\bn_\ba_\bm_\bi_\bc_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bD_\by_\bn_\ba_\bm_\bi_\bc_\bM_\ba_\bt_\br_\bi_\bx\n-DynamicMatrix(size_type r, size_type c, value_type v=value_type())\n-Constructor initializing the whole matrix with a scalar.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn dynmatrix.hh:74\n-_\bD_\bu_\bn_\be_\b:_\b:_\bD_\by_\bn_\ba_\bm_\bi_\bc_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b=\n-DynamicMatrix & operator=(T scalar)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn dynmatrix.hh:126\n-_\bD_\bu_\bn_\be_\b:_\b:_\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\bV_\be_\bc_\bT_\br_\ba_\bi_\bt_\bs_\b<_\b _\bD_\by_\bn_\ba_\bm_\bi_\bc_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bK_\b _\b>_\b _\b>_\b:_\b:_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be\n-container_type::size_type size_type\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn dynmatrix.hh:45\n-_\bD_\bu_\bn_\be_\b:_\b:_\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\bV_\be_\bc_\bT_\br_\ba_\bi_\bt_\bs_\b<_\b _\bD_\by_\bn_\ba_\bm_\bi_\bc_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bK_\b _\b>_\b _\b>_\b:_\b:_\br_\bo_\bw_\b__\bt_\by_\bp_\be\n-DynamicVector< K > row_type\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn dynmatrix.hh:38\n-_\bD_\bu_\bn_\be_\b:_\b:_\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\bV_\be_\bc_\bT_\br_\ba_\bi_\bt_\bs_\b<_\b _\bD_\by_\bn_\ba_\bm_\bi_\bc_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bK_\b _\b>_\b _\b>_\b:_\b:_\br_\bo_\bw_\b__\br_\be_\bf_\be_\br_\be_\bn_\bc_\be\n-row_type & row_reference\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn dynmatrix.hh:40\n-_\bD_\bu_\bn_\be_\b:_\b:_\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\bV_\be_\bc_\bT_\br_\ba_\bi_\bt_\bs_\b<_\b _\bD_\by_\bn_\ba_\bm_\bi_\bc_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bK_\b _\b>_\b _\b>_\b:_\b:_\bv_\ba_\bl_\bu_\be_\b__\bt_\by_\bp_\be\n-K value_type\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn dynmatrix.hh:44\n-_\bD_\bu_\bn_\be_\b:_\b:_\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\bV_\be_\bc_\bT_\br_\ba_\bi_\bt_\bs_\b<_\b _\bD_\by_\bn_\ba_\bm_\bi_\bc_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bK_\b _\b>_\b _\b>_\b:_\b:_\bd_\be_\br_\bi_\bv_\be_\bd_\b__\bt_\by_\bp_\be\n-DynamicMatrix< K > derived_type\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn dynmatrix.hh:36\n-_\bD_\bu_\bn_\be_\b:_\b:_\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\bV_\be_\bc_\bT_\br_\ba_\bi_\bt_\bs_\b<_\b _\bD_\by_\bn_\ba_\bm_\bi_\bc_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bK_\b _\b>_\b _\b>_\b:_\b:_\bc_\bo_\bn_\bs_\bt_\b__\br_\bo_\bw_\b__\br_\be_\bf_\be_\br_\be_\bn_\bc_\be\n-const row_type & const_row_reference\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn dynmatrix.hh:41\n-_\bD_\bu_\bn_\be_\b:_\b:_\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\bV_\be_\bc_\bT_\br_\ba_\bi_\bt_\bs_\b<_\b _\bD_\by_\bn_\ba_\bm_\bi_\bc_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bK_\b _\b>_\b _\b>_\b:_\b:_\bc_\bo_\bn_\bt_\ba_\bi_\bn_\be_\br_\b__\bt_\by_\bp_\be\n-std::vector< K > container_type\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn dynmatrix.hh:43\n-_\bD_\bu_\bn_\be_\b:_\b:_\bF_\bi_\be_\bl_\bd_\bT_\br_\ba_\bi_\bt_\bs_\b<_\b _\bD_\by_\bn_\ba_\bm_\bi_\bc_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bK_\b _\b>_\b _\b>_\b:_\b:_\br_\be_\ba_\bl_\b__\bt_\by_\bp_\be\n-FieldTraits< K >::real_type real_type\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn dynmatrix.hh:52\n-_\bD_\bu_\bn_\be_\b:_\b:_\bF_\bi_\be_\bl_\bd_\bT_\br_\ba_\bi_\bt_\bs_\b<_\b _\bD_\by_\bn_\ba_\bm_\bi_\bc_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bK_\b _\b>_\b _\b>_\b:_\b:_\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be\n-FieldTraits< K >::field_type field_type\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn dynmatrix.hh:51\n-_\bD_\bu_\bn_\be_\b:_\b:_\bD_\by_\bn_\ba_\bm_\bi_\bc_\bV_\be_\bc_\bt_\bo_\br\n-Construct a vector with a dynamic size.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn dynvector.hh:59\n-_\bD_\bu_\bn_\be_\b:_\b:_\bF_\bi_\be_\bl_\bd_\bT_\br_\ba_\bi_\bt_\bs\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn ftraits.hh:26\n-_\bD_\bu_\bn_\be_\b:_\b:_\bF_\bi_\be_\bl_\bd_\bT_\br_\ba_\bi_\bt_\bs_\b:_\b:_\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be\n-T field_type\n-export the type representing the field\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn ftraits.hh:28\n-_\bD_\bu_\bn_\be_\b:_\b:_\bF_\bi_\be_\bl_\bd_\bT_\br_\ba_\bi_\bt_\bs_\b:_\b:_\br_\be_\ba_\bl_\b__\bt_\by_\bp_\be\n-T real_type\n-export the type representing the real type of the field\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn ftraits.hh:30\n-_\bD_\bu_\bn_\be_\b:_\b:_\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\bV_\be_\bc_\bT_\br_\ba_\bi_\bt_\bs\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matvectraits.hh:31\n+_\bD_\bu_\bn_\be_\b:_\b:_\ba_\bs_\bs_\be_\br_\bt_\bC_\ba_\bl_\bl_\bO_\bn_\bc_\be\n+void assertCallOnce(const char *file=nullptr, int line=-1, const char\n+*function=nullptr)\n+Make sure call_once() works and provide a helpful error message otherwise.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn stdthread.hh:35\n+_\bD_\bu_\bn_\be_\b:_\b:_\bd_\bo_\bA_\bs_\bs_\be_\br_\bt_\bC_\ba_\bl_\bl_\bO_\bn_\bc_\be\n+void doAssertCallOnce(const char *file, int line, const char *function)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn stdthread.cc:38\n ===============================================================================\n Generated by\u00a0_\b[_\bd_\bo_\bx_\by_\bg_\be_\bn_\b] 1.9.8\n"}]}, {"source1": "./usr/share/doc/libdune-common-doc/doxygen/a00020.html", "source2": "./usr/share/doc/libdune-common-doc/doxygen/a00020.html", "unified_diff": "@@ -1,15 +1,15 @@\n \n \n \n \n \n \n \n-dune-common: indexset.hh File Reference\n+dune-common: reservedvector.hh File Reference\n \n \n \n \n \n \n \n@@ -65,125 +65,77 @@\n
\n \n \n \n \n \n \n \n+
reservedvector.hh File Reference
\n \n
\n \n-

Provides a map between global and local indices. \n+

An stl-compliant random-access container which stores everything on the stack. \n More...

\n
#include <algorithm>
\n-#include <cstdint>
\n+#include <array>
\n+#include <cassert>
\n #include <iostream>
\n-#include <dune/common/arraylist.hh>
\n-#include <dune/common/exceptions.hh>
\n-#include <dune/common/parallel/localindex.hh>
\n-#include <dune/common/parallel/mpitraits.hh>
\n+#include <iterator>
\n+#include <cstddef>
\n+#include <initializer_list>
\n+#include <dune/common/hash.hh>
\n
\n

Go to the source code of this file.

\n \n \n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n+\n+\n \n

\n Classes

class  Dune::IndexPair< TG, TL >
 A pair consisting of a global and local index. More...
 
class  Dune::InvalidIndexSetState
 Exception indicating that the index set is not in the expected state. More...
 
class  Dune::ParallelIndexSet< TG, TL, N >
 Manager class for the mapping between local indices and globally unique indices. More...
 
class  Dune::ParallelIndexSet< TG, TL, N >::iterator
 The iterator over the pairs. More...
 
class  Dune::GlobalLookupIndexSet< I >
 Decorates an index set with the possibility to find a global index that is mapped to a specific local. More...
 
struct  Dune::LocalIndexComparator< T >
 
struct  Dune::IndexSetSortFunctor< TG, TL >
class  Dune::ReservedVector< T, n >
 A Vector class with statically reserved memory. More...
 
\n \n \n \n \n

\n Namespaces

namespace  Dune
 Dune namespace.
 
\n-\n-\n-\n-\n-

\n-Enumerations

enum  Dune::ParallelIndexSetState { Dune::GROUND\n-, Dune::RESIZE\n- }
 The states the index set can be in. More...
 
\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n+\n+\n+\n

\n-Functions

template<class TG , class TL >
std::ostream & Dune::operator<< (std::ostream &os, const IndexPair< TG, TL > &pair)
 Print an index pair.
 
template<class TG , class TL >
bool Dune::operator== (const IndexPair< TG, TL > &, const IndexPair< TG, TL > &)
 
template<class TG , class TL >
bool Dune::operator!= (const IndexPair< TG, TL > &, const IndexPair< TG, TL > &)
 
template<class TG , class TL >
bool Dune::operator< (const IndexPair< TG, TL > &, const IndexPair< TG, TL > &)
 
template<class TG , class TL >
bool Dune::operator> (const IndexPair< TG, TL > &, const IndexPair< TG, TL > &)
 
template<class TG , class TL >
bool Dune::operator<= (const IndexPair< TG, TL > &, const IndexPair< TG, TL > &)
 
template<class TG , class TL >
bool Dune::operator>= (const IndexPair< TG, TL > &, const IndexPair< TG, TL > &)
 
template<class TG , class TL >
bool Dune::operator== (const IndexPair< TG, TL > &, const TG &)
 
template<class TG , class TL >
bool Dune::operator!= (const IndexPair< TG, TL > &, const TG &)
 
template<class TG , class TL >
bool Dune::operator< (const IndexPair< TG, TL > &, const TG &)
 
template<class TG , class TL >
bool Dune::operator> (const IndexPair< TG, TL > &, const TG &)
 
template<class TG , class TL >
bool Dune::operator<= (const IndexPair< TG, TL > &, const TG &)
 
template<class TG , class TL >
bool Dune::operator>= (const IndexPair< TG, TL > &, const TG &)
 
template<class TG , class TL , int N>
std::ostream & Dune::operator<< (std::ostream &os, const ParallelIndexSet< TG, TL, N > &indexSet)
 Print an index set.
 

\n+Macros

#define CHECKSIZE(X)   {}
 
\n

Detailed Description

\n-

Provides a map between global and local indices.

\n-
Author
Markus Blatt
\n-
\n+

An stl-compliant random-access container which stores everything on the stack.

\n+

Macro Definition Documentation

\n+\n+

◆ CHECKSIZE

\n+\n+
\n+
\n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+
#define CHECKSIZE( X)   {}
\n+
\n+\n+
\n+
\n+\n \n
\n Generated by \"doxygen\"/ 1.9.8\n
\n \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,109 +1,37 @@\n dune-common\u00a02.10\n Loading...\n Searching...\n No Matches\n * _\bd_\bu_\bn_\be\n * _\bc_\bo_\bm_\bm_\bo_\bn\n- * _\bp_\ba_\br_\ba_\bl_\bl_\be_\bl\n-_\bC_\bl_\ba_\bs_\bs_\be_\bs | _\bN_\ba_\bm_\be_\bs_\bp_\ba_\bc_\be_\bs | _\bE_\bn_\bu_\bm_\be_\br_\ba_\bt_\bi_\bo_\bn_\bs | _\bF_\bu_\bn_\bc_\bt_\bi_\bo_\bn_\bs\n-indexset.hh File Reference\n-_\bC_\bo_\bm_\bm_\bo_\bn \u00bb _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\b _\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn \u00bb _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\b _\bC_\bo_\bm_\bp_\bu_\bt_\bi_\bn_\bg_\b _\bb_\ba_\bs_\be_\bd_\b _\bo_\bn_\b _\bI_\bn_\bd_\be_\bx_\bs_\be_\bt_\bs\n-Provides a map between global and local indices. _\bM_\bo_\br_\be_\b._\b._\b.\n+_\bC_\bl_\ba_\bs_\bs_\be_\bs | _\bN_\ba_\bm_\be_\bs_\bp_\ba_\bc_\be_\bs | _\bM_\ba_\bc_\br_\bo_\bs\n+reservedvector.hh File Reference\n+An stl-compliant random-access container which stores everything on the stack.\n+_\bM_\bo_\br_\be_\b._\b._\b.\n #include \n-#include \n+#include \n+#include \n #include \n-#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\ba_\br_\br_\ba_\by_\bl_\bi_\bs_\bt_\b._\bh_\bh>\n-#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\be_\bx_\bc_\be_\bp_\bt_\bi_\bo_\bn_\bs_\b._\bh_\bh>\n-#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bp_\ba_\br_\ba_\bl_\bl_\be_\bl_\b/_\bl_\bo_\bc_\ba_\bl_\bi_\bn_\bd_\be_\bx_\b._\bh_\bh>\n-#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bp_\ba_\br_\ba_\bl_\bl_\be_\bl_\b/_\bm_\bp_\bi_\bt_\br_\ba_\bi_\bt_\bs_\b._\bh_\bh>\n+#include \n+#include \n+#include \n+#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bh_\ba_\bs_\bh_\b._\bh_\bh>\n _\bG_\bo_\b _\bt_\bo_\b _\bt_\bh_\be_\b _\bs_\bo_\bu_\br_\bc_\be_\b _\bc_\bo_\bd_\be_\b _\bo_\bf_\b _\bt_\bh_\bi_\bs_\b _\bf_\bi_\bl_\be_\b.\n C\bCl\bla\bas\bss\bse\bes\bs\n- class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bd_\be_\bx_\bP_\ba_\bi_\br_\b<_\b _\bT_\bG_\b,_\b _\bT_\bL_\b _\b>\n-\u00a0 A pair consisting of a global and local index. _\bM_\bo_\br_\be_\b._\b._\b.\n-\u00a0\n- class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bv_\ba_\bl_\bi_\bd_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt_\bS_\bt_\ba_\bt_\be\n-\u00a0 _\bE_\bx_\bc_\be_\bp_\bt_\bi_\bo_\bn indicating that the index set is not in the expected state.\n- _\bM_\bo_\br_\be_\b._\b._\b.\n-\u00a0\n- class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt_\b<_\b _\bT_\bG_\b,_\b _\bT_\bL_\b,_\b _\bN_\b _\b>\n-\u00a0 Manager class for the mapping between local indices and globally\n- unique indices. _\bM_\bo_\br_\be_\b._\b._\b.\n-\u00a0\n- class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt_\b<_\b _\bT_\bG_\b,_\b _\bT_\bL_\b,_\b _\bN_\b _\b>_\b:_\b:_\bi_\bt_\be_\br_\ba_\bt_\bo_\br\n-\u00a0 The iterator over the pairs. _\bM_\bo_\br_\be_\b._\b._\b.\n-\u00a0\n- class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bG_\bl_\bo_\bb_\ba_\bl_\bL_\bo_\bo_\bk_\bu_\bp_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt_\b<_\b _\bI_\b _\b>\n-\u00a0 Decorates an index set with the possibility to find a global index\n- that is mapped to a specific local. _\bM_\bo_\br_\be_\b._\b._\b.\n-\u00a0\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bL_\bo_\bc_\ba_\bl_\bI_\bn_\bd_\be_\bx_\bC_\bo_\bm_\bp_\ba_\br_\ba_\bt_\bo_\br_\b<_\b _\bT_\b _\b>\n-\u00a0\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt_\bS_\bo_\br_\bt_\bF_\bu_\bn_\bc_\bt_\bo_\br_\b<_\b _\bT_\bG_\b,_\b _\bT_\bL_\b _\b>\n+class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bR_\be_\bs_\be_\br_\bv_\be_\bd_\bV_\be_\bc_\bt_\bo_\br_\b<_\b _\bT_\b,_\b _\bn_\b _\b>\n+\u00a0 A Vector class with statically reserved memory. _\bM_\bo_\br_\be_\b._\b._\b.\n \u00a0\n N\bNa\bam\bme\bes\bsp\bpa\bac\bce\bes\bs\n namespace \u00a0 _\bD_\bu_\bn_\be\n \u00a0 _\bD_\bu_\bn_\be namespace.\n \u00a0\n-E\bEn\bnu\bum\bme\ber\bra\bat\bti\bio\bon\bns\bs\n-enum \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt_\bS_\bt_\ba_\bt_\be { _\bD_\bu_\bn_\be_\b:_\b:_\bG_\bR_\bO_\bU_\bN_\bD , _\bD_\bu_\bn_\be_\b:_\b:_\bR_\bE_\bS_\bI_\bZ_\bE }\n-\u00a0 The states the index set can be in. _\bM_\bo_\br_\be_\b._\b._\b.\n-\u00a0\n-F\bFu\bun\bnc\bct\bti\bio\bon\bns\bs\n-template\n-std::ostream &\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b<_\b< (std::ostream &os, const _\bI_\bn_\bd_\be_\bx_\bP_\ba_\bi_\br< TG, TL >\n- &pair)\n-\u00a0 Print an index pair.\n-\u00a0\n-template\n- bool\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b=_\b= (const _\bI_\bn_\bd_\be_\bx_\bP_\ba_\bi_\br< TG, TL > &, const _\bI_\bn_\bd_\be_\bx_\bP_\ba_\bi_\br<\n- TG, TL > &)\n-\u00a0\n-template\n- bool\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b!_\b= (const _\bI_\bn_\bd_\be_\bx_\bP_\ba_\bi_\br< TG, TL > &, const _\bI_\bn_\bd_\be_\bx_\bP_\ba_\bi_\br<\n- TG, TL > &)\n-\u00a0\n-template\n- bool\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b< (const _\bI_\bn_\bd_\be_\bx_\bP_\ba_\bi_\br< TG, TL > &, const _\bI_\bn_\bd_\be_\bx_\bP_\ba_\bi_\br<\n- TG, TL > &)\n-\u00a0\n-template\n- bool\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b> (const _\bI_\bn_\bd_\be_\bx_\bP_\ba_\bi_\br< TG, TL > &, const _\bI_\bn_\bd_\be_\bx_\bP_\ba_\bi_\br<\n- TG, TL > &)\n-\u00a0\n-template\n- bool\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b<_\b= (const _\bI_\bn_\bd_\be_\bx_\bP_\ba_\bi_\br< TG, TL > &, const _\bI_\bn_\bd_\be_\bx_\bP_\ba_\bi_\br<\n- TG, TL > &)\n-\u00a0\n-template\n- bool\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b>_\b= (const _\bI_\bn_\bd_\be_\bx_\bP_\ba_\bi_\br< TG, TL > &, const _\bI_\bn_\bd_\be_\bx_\bP_\ba_\bi_\br<\n- TG, TL > &)\n-\u00a0\n-template\n- bool\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b=_\b= (const _\bI_\bn_\bd_\be_\bx_\bP_\ba_\bi_\br< TG, TL > &, const TG &)\n-\u00a0\n-template\n- bool\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b!_\b= (const _\bI_\bn_\bd_\be_\bx_\bP_\ba_\bi_\br< TG, TL > &, const TG &)\n-\u00a0\n-template\n- bool\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b< (const _\bI_\bn_\bd_\be_\bx_\bP_\ba_\bi_\br< TG, TL > &, const TG &)\n-\u00a0\n-template\n- bool\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b> (const _\bI_\bn_\bd_\be_\bx_\bP_\ba_\bi_\br< TG, TL > &, const TG &)\n-\u00a0\n-template\n- bool\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b<_\b= (const _\bI_\bn_\bd_\be_\bx_\bP_\ba_\bi_\br< TG, TL > &, const TG &)\n-\u00a0\n-template\n- bool\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b>_\b= (const _\bI_\bn_\bd_\be_\bx_\bP_\ba_\bi_\br< TG, TL > &, const TG &)\n-\u00a0\n-template\n-std::ostream &\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b<_\b< (std::ostream &os, const _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt< TG,\n- TL, N > &indexSet)\n-\u00a0 Print an index set.\n+M\bMa\bac\bcr\bro\bos\bs\n+#define\u00a0 _\bC_\bH_\bE_\bC_\bK_\bS_\bI_\bZ_\bE(X)\u00a0\u00a0\u00a0{}\n \u00a0\n *\b**\b**\b**\b**\b* D\bDe\bet\bta\bai\bil\ble\bed\bd D\bDe\bes\bsc\bcr\bri\bip\bpt\bti\bio\bon\bn *\b**\b**\b**\b**\b*\n-Provides a map between global and local indices.\n- Author\n- Markus Blatt\n+An stl-compliant random-access container which stores everything on the stack.\n+*\b**\b**\b**\b**\b* M\bMa\bac\bcr\bro\bo D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn D\bDo\boc\bcu\bum\bme\ben\bnt\bta\bat\bti\bio\bon\bn *\b**\b**\b**\b**\b*\n+*\b**\b**\b**\b**\b* _\b?\b\u25c6_\b?\b\u00a0C\bCH\bHE\bEC\bCK\bKS\bSI\bIZ\bZE\bE *\b**\b**\b**\b**\b*\n+#define CHECKSIZE ( \u00a0 X ) \u00a0\u00a0\u00a0{}\n ===============================================================================\n Generated by\u00a0_\b[_\bd_\bo_\bx_\by_\bg_\be_\bn_\b] 1.9.8\n"}]}, {"source1": "./usr/share/doc/libdune-common-doc/doxygen/a00020_source.html", "source2": "./usr/share/doc/libdune-common-doc/doxygen/a00020_source.html", "unified_diff": "@@ -1,15 +1,15 @@\n \n \n \n \n \n \n \n-dune-common: indexset.hh Source File\n+dune-common: reservedvector.hh Source File\n \n \n \n \n \n \n \n@@ -70,964 +70,532 @@\n \n \n \n \n \n \n \n
\n-
indexset.hh
\n+
reservedvector.hh
\n
\n
\n Go to the documentation of this file.
1// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
\n
2// vi: set et ts=4 sw=2 sts=2:
\n
3// SPDX-FileCopyrightInfo: Copyright \u00a9 DUNE Project contributors, see file LICENSE.md in module root
\n
4// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception
\n-
5#ifndef DUNE_COMMON_PARALLEL_INDEXSET_HH
\n-
6#define DUNE_COMMON_PARALLEL_INDEXSET_HH
\n+
5#ifndef DUNE_COMMON_RESERVEDVECTOR_HH
\n+
6#define DUNE_COMMON_RESERVEDVECTOR_HH
\n
7
\n-
8#include <algorithm>
\n-
9#include <cstdint> // for uint32_t
\n-
10#include <iostream>
\n-
11
\n-\n-\n-\n-\n-
16
\n-
17namespace Dune
\n-
18{
\n-
28 // forward declarations
\n-
29
\n-
30 template<class TG, class TL>
\n-
31 class IndexPair;
\n-
32
\n-
38 template<class TG, class TL>
\n-
39 std::ostream& operator<<(std::ostream& os, const IndexPair<TG,TL>& pair);
\n-
40
\n-
41 template<class TG, class TL>
\n-
42 bool operator==(const IndexPair<TG,TL>&, const IndexPair<TG,TL>&);
\n-
43
\n-
44 template<class TG, class TL>
\n-
45 bool operator!=(const IndexPair<TG,TL>&, const IndexPair<TG,TL>&);
\n-
46
\n-
47 template<class TG, class TL>
\n-
48 bool operator<(const IndexPair<TG,TL>&, const IndexPair<TG,TL>&);
\n+
12#include <algorithm>
\n+
13#include <array>
\n+
14#include <cassert>
\n+
15#include <iostream>
\n+
16#include <iterator>
\n+
17#include <cstddef>
\n+
18#include <initializer_list>
\n+
19
\n+
20#include <dune/common/hash.hh>
\n+
21
\n+
22#ifdef CHECK_RESERVEDVECTOR
\n+
23#define CHECKSIZE(X) assert(X)
\n+
24#else
\n+
25#define CHECKSIZE(X) {}
\n+
26#endif
\n+
27
\n+
28namespace Dune
\n+
29{
\n+
45 template<class T, int n>
\n+
\n+\n+
47 {
\n+
48 using storage_type = std::array<T,n>;
\n
49
\n-
50 template<class TG, class TL>
\n-
51 bool operator>(const IndexPair<TG,TL>&, const IndexPair<TG,TL>&);
\n-
52
\n-
53 template<class TG, class TL>
\n-
54 bool operator<=(const IndexPair<TG,TL>&, const IndexPair<TG,TL>&);
\n-
55
\n-
56 template<class TG, class TL>
\n-
57 bool operator >=(const IndexPair<TG,TL>&, const IndexPair<TG,TL>&);
\n-
58
\n-
59 template<class TG, class TL>
\n-
60 bool operator==(const IndexPair<TG,TL>&, const TG&);
\n-
61
\n-
62 template<class TG, class TL>
\n-
63 bool operator!=(const IndexPair<TG,TL>&, const TG&);
\n-
64
\n-
65 template<class TG, class TL>
\n-
66 bool operator<(const IndexPair<TG,TL>&, const TG&);
\n-
67
\n-
68 template<class TG, class TL>
\n-
69 bool operator>(const IndexPair<TG,TL>&, const TG&);
\n-
70
\n-
71 template<class TG, class TL>
\n-
72 bool operator<=(const IndexPair<TG,TL>&, const TG&);
\n-
73
\n-
74 template<class TG, class TL>
\n-
75 bool operator >=(const IndexPair<TG,TL>&, const TG&);
\n+
50 public:
\n+
51
\n+
55 typedef typename storage_type::value_type value_type;
\n+
57 typedef typename storage_type::pointer pointer;
\n+
59 typedef typename storage_type::const_pointer const_pointer;
\n+
61 typedef typename storage_type::reference reference;
\n+
63 typedef typename storage_type::const_reference const_reference;
\n+
65 typedef typename storage_type::size_type size_type;
\n+
67 typedef typename storage_type::difference_type difference_type;
\n+
69 typedef typename storage_type::iterator iterator;
\n+
71 typedef typename storage_type::const_iterator const_iterator;
\n+
73 typedef std::reverse_iterator<iterator> reverse_iterator;
\n+
75 typedef std::reverse_iterator<const_iterator> const_reverse_iterator;
\n
76
\n-
77 template<typename T>
\n-
78 struct MPITraits;
\n-
79
\n-
83 template<class TG, class TL>
\n-
\n-\n-
85 {
\n-
86 friend std::ostream& operator<<<>(std::ostream&, const IndexPair<TG,TL>&);
\n-
87 friend bool operator==<>(const IndexPair<TG,TL>&, const IndexPair<TG,TL>&);
\n-
88 friend bool operator!=<>(const IndexPair<TG,TL>&, const IndexPair<TG,TL>&);
\n-
89 friend bool operator< <>(const IndexPair<TG,TL>&, const IndexPair<TG,TL>&);
\n-
90 friend bool operator><>(const IndexPair<TG,TL>&, const IndexPair<TG,TL>&);
\n-
91 friend bool operator<=<>(const IndexPair<TG,TL>&, const IndexPair<TG,TL>&);
\n-
92 friend bool operator>=<>(const IndexPair<TG,TL>&, const IndexPair<TG,TL>&);
\n-
93 friend bool operator==<>(const IndexPair<TG,TL>&, const TG &);
\n-
94 friend bool operator!=<>(const IndexPair<TG,TL>&, const TG &);
\n-
95 friend bool operator< <>(const IndexPair<TG,TL>&, const TG &);
\n-
96 friend bool operator> <>(const IndexPair<TG,TL>&, const TG &);
\n-
97 friend bool operator<=<>(const IndexPair<TG,TL>&, const TG &);
\n-
98 friend bool operator>=<>(const IndexPair<TG,TL>&, const TG &);
\n-
99 friend struct MPITraits<IndexPair<TG,TL> >;
\n-
100
\n-
101 public:
\n-
107 typedef TG GlobalIndex;
\n-
108
\n-
120 typedef TL LocalIndex;
\n-
121
\n-\n-
129
\n-\n-\n+
\n+
82 constexpr ReservedVector()
\n+
83 noexcept(std::is_nothrow_default_constructible_v<value_type>)
\n+
84 : storage_()
\n+
85 , size_(0)
\n+
86 {}
\n+
\n+
87
\n+
\n+
89 explicit constexpr ReservedVector(size_type count)
\n+
90 noexcept(std::is_nothrow_default_constructible_v<value_type>)
\n+
91 : storage_()
\n+
92 , size_(count)
\n+
93 {
\n+
94 assert(count <= n);
\n+
95 }
\n+
\n+
96
\n+
\n+
98 constexpr ReservedVector(size_type count, const value_type& value)
\n+
99 noexcept(std::is_nothrow_copy_assignable_v<value_type> &&
\n+
100 noexcept(ReservedVector(count)))
\n+
101 : ReservedVector(count)
\n+
102 {
\n+
103 for (size_type i=0; i<count; ++i)
\n+
104 storage_[i] = value;
\n+
105 }
\n+
\n+
106
\n+
108 template<class InputIt,
\n+
109 std::enable_if_t<std::is_convertible_v<typename std::iterator_traits<InputIt>::value_type, value_type>, int> = 0>
\n+
\n+
110 constexpr ReservedVector(InputIt first, InputIt last)
\n+
111 noexcept(std::is_nothrow_copy_assignable_v<value_type> &&
\n+
112 noexcept(ReservedVector()))
\n+\n+
114 {
\n+
115 for (size_type i=0; i<n && first!=last; ++i,++size_)
\n+
116 storage_[i] = *first++;
\n+
117 assert(first == last);
\n+
118 }
\n+
\n+
119
\n+
\n+
121 constexpr ReservedVector(std::initializer_list<value_type> const& l)
\n+
122 noexcept(std::is_nothrow_copy_assignable_v<value_type> &&
\n+
123 noexcept(ReservedVector(l.begin(),l.end())))
\n+
124 : ReservedVector(l.begin(),l.end())
\n+
125 {}
\n+
\n+
126
\n+
\n+
132 constexpr bool operator== (const ReservedVector& that) const noexcept
\n+
133 {
\n+
134 if (size() != that.size())
\n+
135 return false;
\n+
136 for (size_type i=0; i<size(); ++i)
\n+
137 if (!(storage_[i]==that.storage_[i]))
\n+
138 return false;
\n+
139 return true;
\n+
140 }
\n+
\n
141
\n-
147 inline const GlobalIndex& global() const;
\n-
148
\n-
154 inline LocalIndex& local();
\n-
155
\n-
161 inline const LocalIndex& local() const;
\n-
162
\n-
168 inline void setLocal(int index);
\n-
169 private:
\n-
171 GlobalIndex global_;
\n-\n-
174 };
\n+
\n+
143 constexpr bool operator!= (const ReservedVector& that) const noexcept
\n+
144 {
\n+
145 return !(*this == that);
\n+
146 }
\n+
\n+
147
\n+
\n+
149 constexpr bool operator< (const ReservedVector& that) const noexcept
\n+
150 {
\n+
151 for (size_type i=0; i<std::min(size(),that.size()); ++i) {
\n+
152 if (storage_[i] < that.storage_[i]) return true;
\n+
153 if (that.storage_[i] < storage_[i]) return false;
\n+
154 }
\n+
155 return size() < that.size();
\n+
156 }
\n+
\n+
157
\n+
\n+
159 constexpr bool operator> (const ReservedVector& that) const noexcept
\n+
160 {
\n+
161 return that < *this;
\n+
162 }
\n+
\n+
163
\n+
\n+
165 constexpr bool operator<= (const ReservedVector& that) const noexcept
\n+
166 {
\n+
167 return !(*this > that);
\n+
168 }
\n+
\n+
169
\n+
\n+
171 constexpr bool operator>= (const ReservedVector& that) const noexcept
\n+
172 {
\n+
173 return !(*this < that);
\n+
174 }
\n
\n
175
\n-
\n-\n-
181 {
\n-\n-
190 RESIZE
\n-
200 };
\n-
\n-
201
\n-\n-
206
\n-
207 // Forward declaration
\n-
208 template<class I> class GlobalLookupIndexSet;
\n-
209
\n-
216 template<typename TG, typename TL, int N=100>
\n-
\n-\n-
218 {
\n-
219 friend class GlobalLookupIndexSet<ParallelIndexSet<TG,TL,N> >;
\n-
220
\n-
221 public:
\n-
226 typedef TG GlobalIndex;
\n-
227
\n-
239 typedef TL LocalIndex;
\n-
240
\n-\n-
245
\n-
252 constexpr static int arraySize = (N>0) ? N : 1;
\n+
\n+
181 constexpr void clear() noexcept
\n+
182 {
\n+
183 size_ = 0;
\n+
184 }
\n+
\n+
185
\n+
\n+
187 constexpr void resize(size_type s) noexcept
\n+
188 {
\n+
189 CHECKSIZE(s<=n);
\n+
190 size_ = s;
\n+
191 }
\n+
\n+
192
\n+
\n+
194 constexpr void push_back(const value_type& t)
\n+
195 noexcept(std::is_nothrow_copy_assignable_v<value_type>)
\n+
196 {
\n+
197 CHECKSIZE(size_<n);
\n+
198 storage_[size_++] = t;
\n+
199 }
\n+
\n+
200
\n+
\n+
202 constexpr void push_back(value_type&& t)
\n+
203 noexcept(std::is_nothrow_move_assignable_v<value_type>)
\n+
204 {
\n+
205 CHECKSIZE(size_<n);
\n+
206 storage_[size_++] = std::move(t);
\n+
207 }
\n+
\n+
208
\n+
210 template<class... Args>
\n+
\n+
211 reference emplace_back(Args&&... args)
\n+
212 noexcept(std::is_nothrow_constructible_v<value_type,decltype(args)...>)
\n+
213 {
\n+
214 CHECKSIZE(size_<n);
\n+
215 value_type* p = &storage_[size_++];
\n+
216 // first destroy any previously (default) constructed element at that location
\n+
217 p->~value_type();
\n+
218 // construct the value_type in place
\n+
219 // NOTE: This is not an integral constant expression.
\n+
220 // With c++20 we could use std::construct_at
\n+
221 ::new (const_cast<void*>(static_cast<const volatile void*>(p)))
\n+
222 value_type(std::forward<Args>(args)...);
\n+
223 return *p;
\n+
224 }
\n+
\n+
225
\n+
\n+
227 constexpr void pop_back() noexcept
\n+
228 {
\n+
229 if (! empty()) size_--;
\n+
230 }
\n+
\n+
231
\n+
\n+
237 constexpr iterator begin() noexcept
\n+
238 {
\n+
239 return storage_.begin();
\n+
240 }
\n+
\n+
241
\n+
\n+
243 constexpr const_iterator begin() const noexcept
\n+
244 {
\n+
245 return storage_.begin();
\n+
246 }
\n+
\n+
247
\n+
\n+
249 constexpr const_iterator cbegin() const noexcept
\n+
250 {
\n+
251 return storage_.cbegin();
\n+
252 }
\n+
\n
253
\n-
\n-
255 class iterator :
\n-
256 public ArrayList<IndexPair,N>::iterator
\n-
257 {
\n-
258 typedef typename ArrayList<IndexPair,N>::iterator
\n-\n-\n-
261 public:
\n-
\n-
262 iterator(ParallelIndexSet<TG,TL,N>& indexSet, const Father& father)
\n-
263 : Father(father), indexSet_(&indexSet)
\n-
264 {}
\n+
\n+
255 constexpr reverse_iterator rbegin() noexcept
\n+
256 {
\n+
257 return reverse_iterator{begin()+size()};
\n+
258 }
\n+
\n+
259
\n+
\n+
261 constexpr const_reverse_iterator rbegin() const noexcept
\n+
262 {
\n+\n+
264 }
\n
\n
265
\n-
266 private:
\n-
276 inline void markAsDeleted() const
\n-
277 {
\n-
278#ifndef NDEBUG
\n-
279 if(indexSet_->state_ != RESIZE)
\n-
280 DUNE_THROW(InvalidIndexSetState, "Indices can only be removed "
\n-
281 <<"while in RESIZE state!");
\n-
282#endif
\n-
283 Father::operator*().local().setState(DELETED);
\n-
284 }
\n-
285
\n-
287 ParallelIndexSet<TG,TL,N>* indexSet_;
\n-
288
\n-
289 };
\n-
\n-
290
\n-
291
\n-
292
\n-
294 typedef typename
\n-\n-\n-
297
\n-\n-
302
\n-
\n-\n-
308 {
\n-
309 return state_;
\n-
310 }
\n-
\n-
311
\n-\n-
318
\n-
327 inline void add(const GlobalIndex& global);
\n-
328
\n-
337 inline void add(const GlobalIndex& global, const LocalIndex& local);
\n-
338
\n-
346 inline void markAsDeleted(const iterator& position);
\n-
347
\n-
360 void endResize();
\n-
361
\n-
372 inline IndexPair&
\n-
373 operator[](const GlobalIndex& global);
\n-
374
\n-
384 inline IndexPair&
\n-
385 at(const GlobalIndex& global);
\n-
386
\n-
396 inline bool
\n-
397 exists (const GlobalIndex& global) const;
\n-
398
\n-
409 inline const IndexPair&
\n-
410 operator[](const GlobalIndex& global) const;
\n-
411
\n-
421 inline const IndexPair&
\n-
422 at(const GlobalIndex& global) const;
\n-
423
\n-
428 inline iterator begin();
\n-
429
\n-
434 inline iterator end();
\n-
435
\n-
440 inline const_iterator begin() const;
\n-
441
\n-
446 inline const_iterator end() const;
\n-
447
\n-
457 inline void renumberLocal();
\n-
458
\n-
465 inline int seqNo() const;
\n-
466
\n-
471 inline size_t size() const;
\n-
472
\n-
473 private:
\n-
475 ArrayList<IndexPair,N> localIndices_;
\n-
477 ArrayList<IndexPair,N> newIndices_;
\n-\n-
481 int seqNo_;
\n-
483 bool deletedEntries_;
\n-
488 inline void merge();
\n-
489 };
\n-
\n-
490
\n-
491
\n-
497 template<class TG, class TL, int N>
\n-
498 std::ostream& operator<<(std::ostream& os, const ParallelIndexSet<TG,TL,N>& indexSet);
\n-
499
\n-
505 template<class I>
\n-
\n-\n-
507 {
\n-
508 public:
\n-\n-
513
\n-\n-
518
\n-\n-
523
\n-\n-
528
\n-\n-
530
\n-
537 GlobalLookupIndexSet(const ParallelIndexSet& indexset, std::size_t size);
\n-
538
\n-\n-
545
\n-\n-
550
\n-
560 inline const IndexPair&
\n-
561 operator[](const GlobalIndex& global) const;
\n-
562
\n-
566 inline const IndexPair*
\n-
567 pair(const std::size_t& local) const;
\n-
568
\n-
573 inline const_iterator begin() const;
\n-
574
\n-
579 inline const_iterator end() const;
\n-
580
\n-
587 inline int seqNo() const;
\n-
588
\n-
593 inline size_t size() const;
\n-
594 private:
\n-
598 const ParallelIndexSet& indexSet_;
\n-
599
\n-
603 std::size_t size_;
\n-
604
\n-
608 std::vector<const IndexPair*> indices_;
\n-
609
\n-
610 };
\n-
\n-
611
\n-
612
\n-
613 template<typename T>
\n-
\n-\n-
615 {
\n-
\n-
616 static bool compare([[maybe_unused]] const T& t1, [[maybe_unused]] const T& t2)
\n-
617 {
\n-
618 return false;
\n-
619 }
\n-
\n-
620 };
\n-
\n-
621
\n-
622 template<class TG, class TL>
\n-
\n-\n-
624 {
\n-
\n-\n-
626 {
\n-
627 return i1.global()<i2.global() || (i1.global()==i2.global() &&
\n-\n-
629 i2.local()));
\n-
630 }
\n-
\n-
631 };
\n-
\n-
632
\n-
633
\n-
634
\n-
635 template<class TG, class TL>
\n-
\n-
636 inline std::ostream& operator<<(std::ostream& os, const IndexPair<TG,TL>& pair)
\n-
637 {
\n-
638 os<<"{global="<<pair.global_<<", local="<<pair.local_<<"}";
\n-
639 return os;
\n-
640 }
\n-
\n-
641
\n-
642 template<class TG, class TL, int N>
\n-
\n-
643 inline std::ostream& operator<<(std::ostream& os, const ParallelIndexSet<TG,TL,N>& indexSet)
\n-
644 {
\n-
645 typedef typename ParallelIndexSet<TG,TL,N>::const_iterator Iterator;
\n-
646 Iterator end = indexSet.end();
\n-
647 os<<"{";
\n-
648 for(Iterator index = indexSet.begin(); index != end; ++index)
\n-
649 os<<*index<<" ";
\n-
650 os<<"}";
\n-
651 return os;
\n-
652
\n-
653 }
\n-
\n-
654
\n-
655 template<class TG, class TL>
\n-
\n-
656 inline bool operator==(const IndexPair<TG,TL>& a, const IndexPair<TG,TL>& b)
\n-
657 {
\n-
658 return a.global_==b.global_;
\n-
659 }
\n-
\n-
660
\n-
661 template<class TG, class TL>
\n-
\n-
662 inline bool operator!=(const IndexPair<TG,TL>& a, const IndexPair<TG,TL>& b)
\n-
663 {
\n-
664 return a.global_!=b.global_;
\n-
665 }
\n-
\n-
666
\n-
667 template<class TG, class TL>
\n-
\n-
668 inline bool operator<(const IndexPair<TG,TL>& a, const IndexPair<TG,TL>& b)
\n-
669 {
\n-
670 return a.global_<b.global_;
\n-
671 }
\n-
\n-
672
\n-
673 template<class TG, class TL>
\n-
\n-
674 inline bool operator>(const IndexPair<TG,TL>& a, const IndexPair<TG,TL>& b)
\n-
675 {
\n-
676 return a.global_>b.global_;
\n-
677 }
\n-
\n-
678
\n-
679 template<class TG, class TL>
\n-
\n-
680 inline bool operator<=(const IndexPair<TG,TL>& a, const IndexPair<TG,TL>& b)
\n-
681 {
\n-
682 return a.global_<=b.global_;
\n-
683 }
\n-
\n-
684
\n-
685 template<class TG, class TL>
\n-
\n-
686 inline bool operator >=(const IndexPair<TG,TL>& a, const IndexPair<TG,TL>& b)
\n-
687 {
\n-
688 return a.global_>=b.global_;
\n-
689 }
\n-
\n-
690
\n-
691 template<class TG, class TL>
\n-
\n-
692 inline bool operator==(const IndexPair<TG,TL>& a, const TG& b)
\n-
693 {
\n-
694 return a.global_==b;
\n-
695 }
\n-
\n-
696
\n-
697 template<class TG, class TL>
\n-
\n-
698 inline bool operator!=(const IndexPair<TG,TL>& a, const TG& b)
\n-
699 {
\n-
700 return a.global_!=b;
\n-
701 }
\n-
\n-
702
\n-
703 template<class TG, class TL>
\n-
\n-
704 inline bool operator<(const IndexPair<TG,TL>& a, const TG& b)
\n-
705 {
\n-
706 return a.global_<b;
\n-
707 }
\n-
\n-
708
\n-
709 template<class TG, class TL>
\n-
\n-
710 inline bool operator>(const IndexPair<TG,TL>& a, const TG& b)
\n-
711 {
\n-
712 return a.global_>b;
\n-
713 }
\n-
\n-
714
\n-
715 template<class TG, class TL>
\n-
\n-
716 inline bool operator<=(const IndexPair<TG,TL>& a, const TG& b)
\n-
717 {
\n-
718 return a.global_<=b;
\n-
719 }
\n-
\n-
720
\n-
721 template<class TG, class TL>
\n-
\n-
722 inline bool operator >=(const IndexPair<TG,TL>& a, const TG& b)
\n-
723 {
\n-
724 return a.global_>=b;
\n-
725 }
\n-
\n-
726
\n-
727#ifndef DOXYGEN
\n-
728
\n-
729 template<class TG, class TL>
\n-
730 IndexPair<TG,TL>::IndexPair(const TG& global, const TL& local)
\n-
731 : global_(global), local_(local){}
\n-
732
\n-
733 template<class TG, class TL>
\n-
734 IndexPair<TG,TL>::IndexPair(const TG& global)
\n-
735 : global_(global), local_(){}
\n-
736
\n-
737 template<class TG, class TL>
\n-\n-
739 : global_(), local_(){}
\n-
740
\n-
741 template<class TG, class TL>
\n-
742 inline const TG& IndexPair<TG,TL>::global() const {
\n-
743 return global_;
\n-
744 }
\n-
745
\n-
746 template<class TG, class TL>
\n-
747 inline TL& IndexPair<TG,TL>::local() {
\n-
748 return local_;
\n-
749 }
\n-
750
\n-
751 template<class TG, class TL>
\n-
752 inline const TL& IndexPair<TG,TL>::local() const {
\n-
753 return local_;
\n-
754 }
\n-
755
\n-
756 template<class TG, class TL>
\n-
757 inline void IndexPair<TG,TL>::setLocal(int local){
\n-
758 local_=local;
\n-
759 }
\n-
760
\n-
761 template<class TG, class TL, int N>
\n-\n-
763 : state_(GROUND), seqNo_(0), deletedEntries_()
\n-
764 {}
\n-
765
\n-
766 template<class TG, class TL, int N>
\n-\n-
768 {
\n-
769
\n-
770 // Checks in unproductive code
\n-
771#ifndef NDEBUG
\n-
772 if(state_!=GROUND)
\n-
773 DUNE_THROW(InvalidIndexSetState,
\n-
774 "IndexSet has to be in GROUND state, when "
\n-
775 << "beginResize() is called!");
\n-
776#endif
\n-
777
\n-
778 state_ = RESIZE;
\n-
779 deletedEntries_ = false;
\n-
780 }
\n-
781
\n-
782 template<class TG, class TL, int N>
\n-
783 inline void ParallelIndexSet<TG,TL,N>::add(const GlobalIndex& global)
\n-
784 {
\n-
785 // Checks in unproductive code
\n-
786#ifndef NDEBUG
\n-
787 if(state_ != RESIZE)
\n-
788 DUNE_THROW(InvalidIndexSetState, "Indices can only be added "
\n-
789 <<"while in RESIZE state!");
\n-
790#endif
\n-
791 newIndices_.push_back(IndexPair(global));
\n-
792 }
\n-
793
\n-
794 template<class TG, class TL, int N>
\n-
795 inline void ParallelIndexSet<TG,TL,N>::add(const TG& global, const TL& local)
\n-
796 {
\n-
797 // Checks in unproductive code
\n-
798#ifndef NDEBUG
\n-
799 if(state_ != RESIZE)
\n-
800 DUNE_THROW(InvalidIndexSetState, "Indices can only be added "
\n-
801 <<"while in RESIZE state!");
\n-
802#endif
\n-
803 newIndices_.push_back(IndexPair(global,local));
\n-
804 }
\n-
805
\n-
806 template<class TG, class TL, int N>
\n-
807 inline void ParallelIndexSet<TG,TL,N>::markAsDeleted(const iterator& global)
\n-
808 {
\n-
809 // Checks in unproductive code
\n-
810#ifndef NDEBUG
\n-
811 if(state_ != RESIZE)
\n-
812 DUNE_THROW(InvalidIndexSetState, "Indices can only be removed "
\n-
813 <<"while in RESIZE state!");
\n-
814#endif
\n-
815 deletedEntries_ = true;
\n-
816
\n-
817 global.markAsDeleted();
\n-
818 }
\n-
819
\n-
820 template<class TG, class TL, int N>
\n-\n-
822 // Checks in unproductive code
\n-
823#ifndef NDEBUG
\n-
824 if(state_ != RESIZE)
\n-
825 DUNE_THROW(InvalidIndexSetState, "endResize called while not "
\n-
826 <<"in RESIZE state!");
\n-
827#endif
\n-
828
\n-
829 std::sort(newIndices_.begin(), newIndices_.end(), IndexSetSortFunctor<TG,TL>());
\n-
830 merge();
\n-
831 seqNo_++;
\n-
832 state_ = GROUND;
\n-
833 }
\n-
834
\n-
835
\n-
836 template<class TG, class TL, int N>
\n-
837 inline void ParallelIndexSet<TG,TL,N>::merge(){
\n-
838 if(localIndices_.size()==0)
\n-
839 {
\n-
840 localIndices_=newIndices_;
\n-
841 newIndices_.clear();
\n-
842 }
\n-
843 else if(newIndices_.size()>0 || deletedEntries_)
\n-
844 {
\n-
845 ArrayList<IndexPair,N> tempPairs;
\n-
846
\n-
847 auto old = localIndices_.begin();
\n-
848 auto added = newIndices_.begin();
\n-
849 const auto endold = localIndices_.end();
\n-
850 const auto endadded = newIndices_.end();
\n-
851
\n-
852 while(old != endold && added!= endadded)
\n-
853 {
\n-
854 if(old->local().state()==DELETED) {
\n-
855 old.eraseToHere();
\n-
856 }
\n-
857 else
\n-
858 {
\n-
859 if(old->global() < added->global() ||
\n-
860 (old->global() == added->global()
\n-
861 && LocalIndexComparator<TL>::compare(old->local(),added->local())))
\n-
862 {
\n-
863 tempPairs.push_back(*old);
\n-
864 old.eraseToHere();
\n-
865 continue;
\n-
866 }else
\n-
867 {
\n-
868 tempPairs.push_back(*added);
\n-
869 added.eraseToHere();
\n-
870 }
\n-
871 }
\n-
872 }
\n-
873
\n-
874 while(old != endold)
\n-
875 {
\n-
876 if(old->local().state()!=DELETED) {
\n-
877 tempPairs.push_back(*old);
\n-
878 }
\n-
879 old.eraseToHere();
\n-
880 }
\n-
881
\n-
882 while(added!= endadded)
\n-
883 {
\n-
884 tempPairs.push_back(*added);
\n-
885 added.eraseToHere();
\n-
886 }
\n-
887 localIndices_ = tempPairs;
\n-
888 }
\n-
889 }
\n-
890
\n-
891
\n-
892 template<class TG, class TL, int N>
\n-
893 inline const IndexPair<TG,TL>&
\n-
894 ParallelIndexSet<TG,TL,N>::at(const TG& global) const
\n-
895 {
\n-
896 // perform a binary search
\n-
897 int low=0, high=localIndices_.size()-1, probe=-1;
\n-
898
\n-
899 while(low<high)
\n-
900 {
\n-
901 probe = (high + low) / 2;
\n-
902 if(global <= localIndices_[probe].global())
\n-
903 high = probe;
\n-
904 else
\n-
905 low = probe+1;
\n-
906 }
\n-
907
\n-
908 if(probe==-1)
\n-
909 DUNE_THROW(RangeError, "No entries!");
\n-
910
\n-
911 if( localIndices_[low].global() != global)
\n-
912 DUNE_THROW(RangeError, "Could not find entry of "<<global);
\n-
913 else
\n-
914 return localIndices_[low];
\n-
915 }
\n-
916
\n-
917 template<class TG, class TL, int N>
\n-
918 inline const IndexPair<TG,TL>&
\n-
919 ParallelIndexSet<TG,TL,N>::operator[](const TG& global) const
\n-
920 {
\n-
921 // perform a binary search
\n-
922 int low=0, high=localIndices_.size()-1, probe=-1;
\n-
923
\n-
924 while(low<high)
\n-
925 {
\n-
926 probe = (high + low) / 2;
\n-
927 if(global <= localIndices_[probe].global())
\n-
928 high = probe;
\n-
929 else
\n-
930 low = probe+1;
\n-
931 }
\n-
932
\n-
933 return localIndices_[low];
\n-
934 }
\n-
935 template<class TG, class TL, int N>
\n-
936 inline IndexPair<TG,TL>& ParallelIndexSet<TG,TL,N>::at(const TG& global)
\n-
937 {
\n-
938 // perform a binary search
\n-
939 int low=0, high=localIndices_.size()-1, probe=-1;
\n-
940
\n-
941 while(low<high)
\n-
942 {
\n-
943 probe = (high + low) / 2;
\n-
944 if(localIndices_[probe].global() >= global)
\n-
945 high = probe;
\n-
946 else
\n-
947 low = probe+1;
\n-
948 }
\n-
949
\n-
950 if(probe==-1)
\n-
951 DUNE_THROW(RangeError, "No entries!");
\n-
952
\n-
953 if( localIndices_[low].global() != global)
\n-
954 DUNE_THROW(RangeError, "Could not find entry of "<<global);
\n-
955 else
\n-
956 return localIndices_[low];
\n-
957 }
\n-
958
\n-
959 template<class TG, class TL, int N>
\n-
960 inline bool ParallelIndexSet<TG,TL,N>::exists (const TG& global) const
\n-
961 {
\n-
962 // perform a binary search
\n-
963 int low=0, high=localIndices_.size()-1, probe=-1;
\n-
964
\n-
965 while(low<high)
\n-
966 {
\n-
967 probe = (high + low) / 2;
\n-
968 if(localIndices_[probe].global() >= global)
\n-
969 high = probe;
\n-
970 else
\n-
971 low = probe+1;
\n-
972 }
\n-
973
\n-
974 if(probe==-1)
\n-
975 return false;
\n-
976
\n-
977 if( localIndices_[low].global() != global)
\n-
978 return false;
\n-
979 return true;
\n-
980 }
\n-
981
\n-
982 template<class TG, class TL, int N>
\n-
983 inline IndexPair<TG,TL>& ParallelIndexSet<TG,TL,N>::operator[](const TG& global)
\n-
984 {
\n-
985 // perform a binary search
\n-
986 int low=0, high=localIndices_.size()-1, probe=-1;
\n-
987
\n-
988 while(low<high)
\n-
989 {
\n-
990 probe = (high + low) / 2;
\n-
991 if(localIndices_[probe].global() >= global)
\n-
992 high = probe;
\n-
993 else
\n-
994 low = probe+1;
\n-
995 }
\n-
996
\n-
997 return localIndices_[low];
\n-
998 }
\n-
999 template<class TG, class TL, int N>
\n-
1000 inline typename ParallelIndexSet<TG,TL,N>::iterator
\n-\n-
1002 {
\n-
1003 return iterator(*this, localIndices_.begin());
\n-
1004 }
\n-
1005
\n-
1006
\n-
1007 template<class TG, class TL, int N>
\n-
1008 inline typename ParallelIndexSet<TG,TL,N>::iterator
\n-\n-
1010 {
\n-
1011 return iterator(*this,localIndices_.end());
\n-
1012 }
\n-
1013
\n-
1014 template<class TG, class TL, int N>
\n-
1015 inline typename ParallelIndexSet<TG,TL,N>::const_iterator
\n-\n-
1017 {
\n-
1018 return localIndices_.begin();
\n-
1019 }
\n-
1020
\n-
1021
\n-
1022 template<class TG, class TL, int N>
\n-
1023 inline typename ParallelIndexSet<TG,TL,N>::const_iterator
\n-\n-
1025 {
\n-
1026 return localIndices_.end();
\n-
1027 }
\n-
1028
\n-
1029 template<class TG, class TL, int N>
\n-\n-
1031#ifndef NDEBUG
\n-
1032 if(state_==RESIZE)
\n-
1033 DUNE_THROW(InvalidIndexSetState, "IndexSet has to be in "
\n-
1034 <<"GROUND state for renumberLocal()");
\n-
1035#endif
\n-
1036
\n-
1037 const auto end_ = end();
\n-
1038 uint32_t index=0;
\n-
1039
\n-
1040 for(auto pair=begin(); pair!=end_; index++, ++pair)
\n-
1041 pair->local()=index;
\n-
1042 }
\n-
1043
\n-
1044 template<class TG, class TL, int N>
\n-
1045 inline int ParallelIndexSet<TG,TL,N>::seqNo() const
\n-
1046 {
\n-
1047 return seqNo_;
\n-
1048 }
\n-
1049
\n-
1050 template<class TG, class TL, int N>
\n-
1051 inline size_t ParallelIndexSet<TG,TL,N>::size() const
\n-
1052 {
\n-
1053 return localIndices_.size();
\n-
1054 }
\n-
1055
\n-
1056 template<class I>
\n-\n-
1058 std::size_t size)
\n-
1059 : indexSet_(indexset), size_(size),
\n-
1060 indices_(size_, static_cast<const IndexPair*>(0))
\n-
1061 {
\n-
1062 const_iterator end_ = indexSet_.end();
\n-
1063
\n-
1064 for(const_iterator pair = indexSet_.begin(); pair!=end_; ++pair) {
\n-
1065 assert(pair->local()<size_);
\n-
1066 indices_[pair->local()] = &(*pair);
\n-
1067 }
\n-
1068 }
\n-
1069
\n-
1070 template<class I>
\n-\n-
1072 : indexSet_(indexset), size_(0)
\n-
1073 {
\n-
1074 const_iterator end_ = indexSet_.end();
\n-
1075 for(const_iterator pair = indexSet_.begin(); pair!=end_; ++pair)
\n-
1076 size_=std::max(size_,static_cast<std::size_t>(pair->local()));
\n-
1077
\n-
1078 indices_.resize(++size_, 0);
\n-
1079
\n-
1080 for(const_iterator pair = indexSet_.begin(); pair!=end_; ++pair)
\n-
1081 indices_[pair->local()] = &(*pair);
\n-
1082 }
\n-
1083
\n-
1084 template<class I>
\n-\n-
1086 {}
\n-
1087
\n-
1088 template<class I>
\n-
1089 inline const IndexPair<typename I::GlobalIndex, typename I::LocalIndex>*
\n-
1090 GlobalLookupIndexSet<I>::pair(const std::size_t& local) const
\n-
1091 {
\n-
1092 return indices_[local];
\n-
1093 }
\n-
1094
\n-
1095 template<class I>
\n-
1096 inline const IndexPair<typename I::GlobalIndex, typename I::LocalIndex>&
\n-
1097 GlobalLookupIndexSet<I>::operator[](const GlobalIndex& global) const
\n-
1098 {
\n-
1099 return indexSet_[global];
\n-
1100 }
\n-
1101
\n-
1102 template<class I>
\n-
1103 typename I::const_iterator GlobalLookupIndexSet<I>::begin() const
\n-
1104 {
\n-
1105 return indexSet_.begin();
\n-
1106 }
\n-
1107
\n-
1108 template<class I>
\n-
1109 typename I::const_iterator GlobalLookupIndexSet<I>::end() const
\n-
1110 {
\n-
1111 return indexSet_.end();
\n-
1112 }
\n-
1113
\n-
1114 template<class I>
\n-
1115 inline size_t GlobalLookupIndexSet<I>::size() const
\n-
1116 {
\n-
1117 return size_;
\n-
1118 }
\n-
1119
\n-
1120 template<class I>
\n-
1121 inline int GlobalLookupIndexSet<I>::seqNo() const
\n-
1122 {
\n-
1123 return indexSet_.seqNo();
\n-
1124 }
\n-
1125
\n-
1126 template<typename TG, typename TL, int N, typename TG1, typename TL1, int N1>
\n-
1127 bool operator==(const ParallelIndexSet<TG,TL,N>& idxset,
\n-
1128 const ParallelIndexSet<TG1,TL1,N1>& idxset1)
\n-
1129 {
\n-
1130 if(idxset.size()!=idxset1.size())
\n-
1131 return false;
\n-
1132 typedef typename ParallelIndexSet<TG,TL,N>::const_iterator Iter;
\n-
1133 typedef typename ParallelIndexSet<TG1,TL1,N1>::const_iterator Iter1;
\n-
1134 Iter iter=idxset.begin();
\n-
1135 for(Iter1 iter1=idxset1.begin(); iter1 != idxset1.end(); ++iter, ++iter1) {
\n-
1136 if(iter1->global()!=iter->global())
\n-
1137 return false;
\n-
1138 typedef typename ParallelIndexSet<TG,TL,N>::LocalIndex PI;
\n-
1139 const PI& pi=iter->local(), pi1=iter1->local();
\n-
1140
\n-
1141 if(pi!=pi1)
\n-
1142 return false;
\n-
1143 }
\n-
1144 return true;
\n-
1145 }
\n-
1146
\n-
1147 template<typename TG, typename TL, int N, typename TG1, typename TL1, int N1>
\n-
1148 bool operator!=(const ParallelIndexSet<TG,TL,N>& idxset,
\n-
1149 const ParallelIndexSet<TG1,TL1,N1>& idxset1)
\n-
1150 {
\n-
1151 return !(idxset==idxset1);
\n-
1152 }
\n-
1153
\n-
1154
\n-
1155#endif // DOXYGEN
\n-
1156
\n-
1157}
\n-
1158
\n-
1159#endif // DUNE_COMMON_PARALLEL_INDEXSET_HH
\n-
Provides classes for use as the local index in ParallelIndexSet.
\n-
Traits classes for mapping types onto MPI_Datatype.
\n-
Implements a random-access container that can efficiently change size (similar to std::deque)
\n-
A few common exception classes.
\n-
std::ostream & operator<<(std::ostream &s, const bigunsignedint< k > &x)
Definition bigunsignedint.hh:278
\n-
#define DUNE_THROW(E, m)
Definition exceptions.hh:218
\n-
EnableIfInterOperable< T1, T2, bool >::type operator<(const RandomAccessIteratorFacade< T1, V1, R1, D > &lhs, const RandomAccessIteratorFacade< T2, V2, R2, D > &rhs)
Comparison operator.
Definition iteratorfacades.hh:638
\n-
EnableIfInterOperable< T1, T2, bool >::type operator>(const RandomAccessIteratorFacade< T1, V1, R1, D > &lhs, const RandomAccessIteratorFacade< T2, V2, R2, D > &rhs)
Comparison operator.
Definition iteratorfacades.hh:684
\n-
EnableIfInterOperable< T1, T2, bool >::type operator<=(const RandomAccessIteratorFacade< T1, V1, R1, D > &lhs, const RandomAccessIteratorFacade< T2, V2, R2, D > &rhs)
Comparison operator.
Definition iteratorfacades.hh:661
\n-
EnableIfInterOperable< T1, T2, bool >::type operator==(const ForwardIteratorFacade< T1, V1, R1, D > &lhs, const ForwardIteratorFacade< T2, V2, R2, D > &rhs)
Checks for equality.
Definition iteratorfacades.hh:238
\n-
EnableIfInterOperable< T1, T2, bool >::type operator>=(const RandomAccessIteratorFacade< T1, V1, R1, D > &lhs, const RandomAccessIteratorFacade< T2, V2, R2, D > &rhs)
Comparison operator.
Definition iteratorfacades.hh:706
\n-
EnableIfInterOperable< T1, T2, bool >::type operator!=(const ForwardIteratorFacade< T1, V1, R1, D > &lhs, const ForwardIteratorFacade< T2, V2, R2, D > &rhs)
Checks for inequality.
Definition iteratorfacades.hh:260
\n-
IndexPair & operator[](const GlobalIndex &global)
Find the index pair with a specific global id.
\n-
static constexpr int arraySize
The size of the individual arrays in the underlying ArrayList.
Definition indexset.hh:252
\n-
void beginResize()
Indicate that the index set is to be resized.
\n-
ParallelIndexSetState
The states the index set can be in.
Definition indexset.hh:181
\n-
void renumberLocal()
Renumbers the local index numbers.
\n-
bool exists(const GlobalIndex &global) const
Find the index pair with a specific global id.
\n-
size_t size() const
Get the total number (public and nonpublic) indices.
\n-
ArrayList< IndexPair, N >::const_iterator const_iterator
The constant iterator over the pairs.
Definition indexset.hh:296
\n-
bool operator()(const IndexPair< TG, TL > &i1, const IndexPair< TG, TL > &i2)
Definition indexset.hh:625
\n-
void add(const GlobalIndex &global)
Add an new index to the set.
\n-
const_iterator end() const
Get an iterator over the indices positioned after the last index.
\n-
const LocalIndex & local() const
Get the local index.
\n-
const IndexPair & at(const GlobalIndex &global) const
Find the index pair with a specific global id.
\n-
GlobalLookupIndexSet(const ParallelIndexSet &indexset)
Constructor.
\n-
TL LocalIndex
the type of the local index.
Definition indexset.hh:120
\n-
int seqNo() const
Get the internal sequence number.
\n-
static bool compare(const T &t1, const T &t2)
Definition indexset.hh:616
\n-
iterator begin()
Get an iterator over the indices positioned at the first index.
\n-
Dune::IndexPair< typename I::GlobalIndex, typename I::LocalIndex > IndexPair
Definition indexset.hh:529
\n-
iterator end()
Get an iterator over the indices positioned after the last index.
\n-
ParallelIndexSet::const_iterator const_iterator
The iterator over the index pairs.
Definition indexset.hh:527
\n-
const_iterator begin() const
Get an iterator over the indices positioned at the first index.
\n-
const IndexPair & operator[](const GlobalIndex &global) const
Find the index pair with a specific global id.
\n-
const ParallelIndexSetState & state()
Get the state the index set is in.
Definition indexset.hh:307
\n-
const_iterator begin() const
Get an iterator over the indices positioned at the first index.
\n-
const IndexPair & operator[](const GlobalIndex &global) const
Find the index pair with a specific global id.
\n-
IndexPair()
Construct a new Pair.
\n-
I ParallelIndexSet
The type of the index set.
Definition indexset.hh:512
\n-
TL LocalIndex
The type of the local index, e.g. ParallelLocalIndex.
Definition indexset.hh:239
\n-
void markAsDeleted(const iterator &position)
Mark an index as deleted.
\n-
ParallelIndexSet::LocalIndex LocalIndex
The type of the local index.
Definition indexset.hh:517
\n-
IndexPair(const GlobalIndex &global, const LocalIndex &local)
Constructs a new Pair.
\n-
void setLocal(int index)
Set the local index.
\n-
const GlobalIndex & global() const
Get the global index.
\n-
void add(const GlobalIndex &global, const LocalIndex &local)
Add an new index to the set.
\n-
const_iterator end() const
Get an iterator over the indices positioned after the last index.
\n-
IndexPair & at(const GlobalIndex &global)
Find the index pair with a specific global id.
\n-
ParallelIndexSet()
Constructor.
\n-
void endResize()
Indicate that the resizing finishes.
\n-
~GlobalLookupIndexSet()
Destructor.
\n-
const IndexPair * pair(const std::size_t &local) const
Get the index pair corresponding to a local index.
\n-
LocalIndex & local()
Get the local index.
\n-
size_t size() const
Get the total number (public and nonpublic) indices.
\n-
IndexPair(const GlobalIndex &global)
Constructs a new Pair.
\n-
TG GlobalIndex
the type of the global index. This type has to provide at least a operator< for sorting.
Definition indexset.hh:226
\n-
TG GlobalIndex
the type of the global index.
Definition indexset.hh:107
\n-
int seqNo() const
Get the internal sequence number.
\n-
iterator(ParallelIndexSet< TG, TL, N > &indexSet, const Father &father)
Definition indexset.hh:262
\n-
GlobalLookupIndexSet(const ParallelIndexSet &indexset, std::size_t size)
Constructor.
\n-
ParallelIndexSet::GlobalIndex GlobalIndex
The type of the global index.
Definition indexset.hh:522
\n-
Dune::IndexPair< GlobalIndex, LocalIndex > IndexPair
The type of the pair stored.
Definition indexset.hh:244
\n-
@ RESIZE
Indicates that the index set is currently being resized.
Definition indexset.hh:190
\n-
@ GROUND
The default mode. Indicates that the index set is ready to be used.
Definition indexset.hh:186
\n-
@ DELETED
Definition localindex.hh:28
\n+
\n+
267 constexpr const_reverse_iterator crbegin() const noexcept
\n+
268 {
\n+\n+
270 }
\n+
\n+
271
\n+
\n+
273 constexpr iterator end() noexcept
\n+
274 {
\n+
275 return storage_.begin()+size();
\n+
276 }
\n+
\n+
277
\n+
\n+
279 constexpr const_iterator end() const noexcept
\n+
280 {
\n+
281 return storage_.begin()+size();
\n+
282 }
\n+
\n+
283
\n+
\n+
285 constexpr const_iterator cend() const noexcept
\n+
286 {
\n+
287 return storage_.cbegin()+size();
\n+
288 }
\n+
\n+
289
\n+
\n+
291 constexpr reverse_iterator rend() noexcept
\n+
292 {
\n+
293 return reverse_iterator{begin()};
\n+
294 }
\n+
\n+
295
\n+
\n+
297 constexpr const_reverse_iterator rend() const noexcept
\n+
298 {
\n+\n+
300 }
\n+
\n+
301
\n+
\n+
303 constexpr const_reverse_iterator crend() const noexcept
\n+
304 {
\n+\n+
306 }
\n+
\n+
307
\n+
\n+
313 constexpr reference at(size_type i)
\n+
314 {
\n+
315 if (!(i < size()))
\n+
316 throw std::out_of_range("Index out of range");
\n+
317 return storage_[i];
\n+
318 }
\n+
\n+
319
\n+
\n+
321 constexpr const_reference at(size_type i) const
\n+
322 {
\n+
323 if (!(i < size()))
\n+
324 throw std::out_of_range("Index out of range");
\n+
325 return storage_[i];
\n+
326 }
\n+
\n+
327
\n+
\n+
329 constexpr reference operator[] (size_type i) noexcept
\n+
330 {
\n+
331 CHECKSIZE(size_>i);
\n+
332 return storage_[i];
\n+
333 }
\n+
\n+
334
\n+
\n+
336 constexpr const_reference operator[] (size_type i) const noexcept
\n+
337 {
\n+
338 CHECKSIZE(size_>i);
\n+
339 return storage_[i];
\n+
340 }
\n+
\n+
341
\n+
\n+
343 constexpr reference front() noexcept
\n+
344 {
\n+
345 CHECKSIZE(size_>0);
\n+
346 return storage_[0];
\n+
347 }
\n+
\n+
348
\n+
\n+
350 constexpr const_reference front() const noexcept
\n+
351 {
\n+
352 CHECKSIZE(size_>0);
\n+
353 return storage_[0];
\n+
354 }
\n+
\n+
355
\n+
\n+
357 constexpr reference back() noexcept
\n+
358 {
\n+
359 CHECKSIZE(size_>0);
\n+
360 return storage_[size_-1];
\n+
361 }
\n+
\n+
362
\n+
\n+
364 constexpr const_reference back() const noexcept
\n+
365 {
\n+
366 CHECKSIZE(size_>0);
\n+
367 return storage_[size_-1];
\n+
368 }
\n+
\n+
369
\n+
\n+
371 constexpr pointer data() noexcept
\n+
372 {
\n+
373 return storage_.data();
\n+
374 }
\n+
\n+
375
\n+
\n+
377 constexpr const_pointer data() const noexcept
\n+
378 {
\n+
379 return storage_.data();
\n+
380 }
\n+
\n+
381
\n+
\n+
387 constexpr size_type size() const noexcept
\n+
388 {
\n+
389 return size_;
\n+
390 }
\n+
\n+
391
\n+
\n+
393 constexpr bool empty() const noexcept
\n+
394 {
\n+
395 return size_==0;
\n+
396 }
\n+
\n+
397
\n+
\n+
399 static constexpr size_type capacity() noexcept
\n+
400 {
\n+
401 return n;
\n+
402 }
\n+
\n+
403
\n+
\n+
405 static constexpr size_type max_size() noexcept
\n+
406 {
\n+
407 return n;
\n+
408 }
\n+
\n+
409
\n+
\n+
415 constexpr void fill(const value_type& value)
\n+
416 noexcept(std::is_nothrow_copy_assignable_v<value_type>)
\n+
417 {
\n+
418 for (size_type i=0; i<size(); ++i)
\n+
419 storage_[i] = value;
\n+
420 }
\n+
\n+
421
\n+
\n+
423 void swap(ReservedVector& other)
\n+
424 noexcept(std::is_nothrow_swappable_v<value_type>)
\n+
425 {
\n+
426 using std::swap;
\n+
427 swap(storage_, other.storage_);
\n+
428 swap(size_, other.size_);
\n+
429 }
\n+
\n+
430
\n+
\n+
434 friend std::ostream& operator<< (std::ostream& s, const ReservedVector& v)
\n+
435 {
\n+
436 for (size_type i=0; i<v.size(); i++)
\n+
437 s << v[i] << " ";
\n+
438 return s;
\n+
439 }
\n+
\n+
440
\n+
\n+
441 inline friend std::size_t hash_value(const ReservedVector& v) noexcept
\n+
442 {
\n+
443 return hash_range(v.storage_.data(),v.storage_.data()+v.size_);
\n+
444 }
\n+
\n+
445
\n+
446 private:
\n+
447 storage_type storage_;
\n+
448 size_type size_;
\n+
449 };
\n+
\n+
450
\n+
451}
\n+
452
\n+\n+
454
\n+
455#undef CHECKSIZE
\n+
456
\n+
457#endif // DUNE_COMMON_RESERVEDVECTOR_HH
\n+
#define CHECKSIZE(X)
Definition reservedvector.hh:25
\n+
Support for calculating hash values of objects.
\n+
#define DUNE_DEFINE_HASH(template_args, type)
Defines the required struct specialization to make type hashable via Dune::hash.
Definition hash.hh:100
\n+
#define DUNE_HASH_TYPE(...)
Wrapper macro for the type to be hashed in DUNE_DEFINE_HASH.
Definition hash.hh:117
\n+
#define DUNE_HASH_TEMPLATE_ARGS(...)
Wrapper macro for the template arguments in DUNE_DEFINE_HASH.
Definition hash.hh:109
\n+
STL namespace.
\n
Dune namespace.
Definition alignedallocator.hh:13
\n-
constexpr std::integral_constant< std::size_t, sizeof...(II)> size(std::integer_sequence< T, II... >)
Return the size of the sequence.
Definition integersequence.hh:75
\n-
A random access iterator for the Dune::ArrayList class.
Definition arraylist.hh:255
\n-
A constant random access iterator for the Dune::ArrayList class.
Definition arraylist.hh:368
\n-
A dynamically growing random access list.
Definition arraylist.hh:62
\n-
ConstArrayListIterator< MemberType, N, A > const_iterator
A constant random access iterator.
Definition arraylist.hh:110
\n-
A traits class describing the mapping of types onto MPI_Datatypes.
Definition mpitraits.hh:41
\n-
Default exception if a function was called while the object is not in a valid state for that function...
Definition exceptions.hh:281
\n-\n-
A pair consisting of a global and local index.
Definition indexset.hh:85
\n-
Exception indicating that the index set is not in the expected state.
Definition indexset.hh:205
\n-
Decorates an index set with the possibility to find a global index that is mapped to a specific local...
Definition indexset.hh:507
\n-
Manager class for the mapping between local indices and globally unique indices.
Definition indexset.hh:218
\n-
The iterator over the pairs.
Definition indexset.hh:257
\n-
Definition indexset.hh:615
\n-
Definition indexset.hh:624
\n+
std::size_t hash_range(It first, It last)
Hashes all elements in the range [first,last) and returns the combined hash.
Definition hash.hh:322
\n+
A Vector class with statically reserved memory.
Definition reservedvector.hh:47
\n+
constexpr const_reference front() const noexcept
Returns const reference to first element of vector.
Definition reservedvector.hh:350
\n+
constexpr const_reverse_iterator crend() const noexcept
Returns a const reverse-iterator pointing to the begin of the vector.
Definition reservedvector.hh:303
\n+
constexpr ReservedVector(size_type count) noexcept(std::is_nothrow_default_constructible_v< value_type >)
Constructs the vector with count elements that will be default-initialized.
Definition reservedvector.hh:89
\n+
constexpr void fill(const value_type &value) noexcept(std::is_nothrow_copy_assignable_v< value_type >)
Fill the container with the value.
Definition reservedvector.hh:415
\n+
storage_type::pointer pointer
Pointer to T.
Definition reservedvector.hh:57
\n+
constexpr reverse_iterator rbegin() noexcept
Returns a const reverse-iterator pointing to the end of the vector.
Definition reservedvector.hh:255
\n+
constexpr bool operator<=(const ReservedVector &that) const noexcept
Lexicographically compares the values in the vector this with that
Definition reservedvector.hh:165
\n+
constexpr bool operator>(const ReservedVector &that) const noexcept
Lexicographically compares the values in the vector this with that
Definition reservedvector.hh:159
\n+
constexpr const_reverse_iterator rend() const noexcept
Returns a const reverse-iterator pointing to the begin of the vector.
Definition reservedvector.hh:297
\n+
static constexpr size_type max_size() noexcept
Returns the maximum length of the vector.
Definition reservedvector.hh:405
\n+
constexpr const_reference at(size_type i) const
Returns a const reference to the i'th element.
Definition reservedvector.hh:321
\n+
std::reverse_iterator< iterator > reverse_iterator
Reverse iterator.
Definition reservedvector.hh:73
\n+
constexpr iterator end() noexcept
Returns an iterator pointing to the end of the vector.
Definition reservedvector.hh:273
\n+
constexpr bool operator<(const ReservedVector &that) const noexcept
Lexicographically compares the values in the vector this with that
Definition reservedvector.hh:149
\n+
constexpr size_type size() const noexcept
Returns number of elements in the vector.
Definition reservedvector.hh:387
\n+
constexpr bool empty() const noexcept
Returns true if vector has no elements.
Definition reservedvector.hh:393
\n+
constexpr iterator begin() noexcept
Returns a iterator pointing to the beginning of the vector.
Definition reservedvector.hh:237
\n+
constexpr void push_back(const value_type &t) noexcept(std::is_nothrow_copy_assignable_v< value_type >)
Appends an element to the end of a vector, up to the maximum size n, O(1) time.
Definition reservedvector.hh:194
\n+
constexpr reverse_iterator rend() noexcept
Returns a const reverse-iterator pointing to the begin of the vector.
Definition reservedvector.hh:291
\n+
storage_type::iterator iterator
Iterator used to iterate through a vector.
Definition reservedvector.hh:69
\n+
constexpr const_iterator cbegin() const noexcept
Returns a const_iterator pointing to the beginning of the vector.
Definition reservedvector.hh:249
\n+
std::reverse_iterator< const_iterator > const_reverse_iterator
Const reverse iterator.
Definition reservedvector.hh:75
\n+
constexpr pointer data() noexcept
Returns pointer to the underlying memory.
Definition reservedvector.hh:371
\n+
constexpr const_reference back() const noexcept
Returns const reference to last element of vector.
Definition reservedvector.hh:364
\n+
friend std::ostream & operator<<(std::ostream &s, const ReservedVector &v)
Send ReservedVector to an output stream.
Definition reservedvector.hh:434
\n+
constexpr bool operator==(const ReservedVector &that) const noexcept
Compares the values in the vector this with that for equality.
Definition reservedvector.hh:132
\n+
constexpr void pop_back() noexcept
Erases the last element of the vector, O(1) time.
Definition reservedvector.hh:227
\n+
friend std::size_t hash_value(const ReservedVector &v) noexcept
Definition reservedvector.hh:441
\n+
storage_type::difference_type difference_type
A signed integral type.
Definition reservedvector.hh:67
\n+
constexpr const_iterator end() const noexcept
Returns a const_iterator pointing to the end of the vector.
Definition reservedvector.hh:279
\n+
constexpr void clear() noexcept
Erases all elements.
Definition reservedvector.hh:181
\n+
constexpr ReservedVector() noexcept(std::is_nothrow_default_constructible_v< value_type >)
Constructs an empty vector.
Definition reservedvector.hh:82
\n+
storage_type::const_iterator const_iterator
Const iterator used to iterate through a vector.
Definition reservedvector.hh:71
\n+
reference emplace_back(Args &&... args) noexcept(std::is_nothrow_constructible_v< value_type, decltype(args)... >)
Appends an element to the end of a vector by constructing it in place.
Definition reservedvector.hh:211
\n+
storage_type::size_type size_type
An unsigned integral type.
Definition reservedvector.hh:65
\n+
constexpr bool operator>=(const ReservedVector &that) const noexcept
Lexicographically compares the values in the vector this with that
Definition reservedvector.hh:171
\n+
storage_type::const_reference const_reference
Const reference to T.
Definition reservedvector.hh:63
\n+
void swap(ReservedVector &other) noexcept(std::is_nothrow_swappable_v< value_type >)
Swap the content with another vector.
Definition reservedvector.hh:423
\n+
constexpr ReservedVector(InputIt first, InputIt last) noexcept(std::is_nothrow_copy_assignable_v< value_type > &&noexcept(ReservedVector()))
Constructs the vector from an iterator range [first,last)
Definition reservedvector.hh:110
\n+
constexpr const_pointer data() const noexcept
Returns const pointer to the underlying memory.
Definition reservedvector.hh:377
\n+
constexpr reference at(size_type i)
Returns reference to the i'th element.
Definition reservedvector.hh:313
\n+
constexpr const_iterator cend() const noexcept
Returns a const_iterator pointing to the end of the vector.
Definition reservedvector.hh:285
\n+
constexpr reference back() noexcept
Returns reference to last element of vector.
Definition reservedvector.hh:357
\n+
constexpr const_reverse_iterator rbegin() const noexcept
Returns a const reverse-iterator pointing to the end of the vector.
Definition reservedvector.hh:261
\n+
storage_type::value_type value_type
The type of object, T, stored in the vector.
Definition reservedvector.hh:55
\n+
constexpr const_iterator begin() const noexcept
Returns a const_iterator pointing to the beginning of the vector.
Definition reservedvector.hh:243
\n+
constexpr ReservedVector(size_type count, const value_type &value) noexcept(std::is_nothrow_copy_assignable_v< value_type > &&noexcept(ReservedVector(count)))
Constructs the vector with count copies of elements with value value.
Definition reservedvector.hh:98
\n+
constexpr reference operator[](size_type i) noexcept
Returns reference to the i'th element.
Definition reservedvector.hh:329
\n+
constexpr reference front() noexcept
Returns reference to first element of vector.
Definition reservedvector.hh:343
\n+
storage_type::const_pointer const_pointer
Const pointer to T.
Definition reservedvector.hh:59
\n+
constexpr ReservedVector(std::initializer_list< value_type > const &l) noexcept(std::is_nothrow_copy_assignable_v< value_type > &&noexcept(ReservedVector(l.begin(), l.end())))
Constructs the vector from an initializer list.
Definition reservedvector.hh:121
\n+
constexpr bool operator!=(const ReservedVector &that) const noexcept
Compares the values in the vector this with that for not equality.
Definition reservedvector.hh:143
\n+
constexpr void resize(size_type s) noexcept
Specifies a new size for the vector.
Definition reservedvector.hh:187
\n+
static constexpr size_type capacity() noexcept
Returns current capacity (allocated memory) of the vector.
Definition reservedvector.hh:399
\n+
storage_type::reference reference
Reference to T.
Definition reservedvector.hh:61
\n+
constexpr const_reverse_iterator crbegin() const noexcept
Returns a const reverse-iterator pointing to the end of the vector.
Definition reservedvector.hh:267
\n+
constexpr void push_back(value_type &&t) noexcept(std::is_nothrow_move_assignable_v< value_type >)
Appends an element to the end of a vector by moving the value, up to the maximum size n,...
Definition reservedvector.hh:202
\n
\n \n
\n Generated by \"doxygen\"/ 1.9.8\n
\n \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,1122 +1,633 @@\n dune-common\u00a02.10\n Loading...\n Searching...\n No Matches\n * _\bd_\bu_\bn_\be\n * _\bc_\bo_\bm_\bm_\bo_\bn\n- * _\bp_\ba_\br_\ba_\bl_\bl_\be_\bl\n-indexset.hh\n+reservedvector.hh\n _\bG_\bo_\b _\bt_\bo_\b _\bt_\bh_\be_\b _\bd_\bo_\bc_\bu_\bm_\be_\bn_\bt_\ba_\bt_\bi_\bo_\bn_\b _\bo_\bf_\b _\bt_\bh_\bi_\bs_\b _\bf_\bi_\bl_\be_\b.\n 1// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-\n 2// vi: set et ts=4 sw=2 sts=2:\n 3// SPDX-FileCopyrightInfo: Copyright \u00c2\u00a9 DUNE Project contributors, see file\n LICENSE.md in module root\n 4// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception\n-5#ifndef DUNE_COMMON_PARALLEL_INDEXSET_HH\n-6#define DUNE_COMMON_PARALLEL_INDEXSET_HH\n+5#ifndef DUNE_COMMON_RESERVEDVECTOR_HH\n+6#define DUNE_COMMON_RESERVEDVECTOR_HH\n 7\n-8#include \n-9#include // for uint32_t\n-10#include \n-11\n-12#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\ba_\br_\br_\ba_\by_\bl_\bi_\bs_\bt_\b._\bh_\bh>\n-13#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\be_\bx_\bc_\be_\bp_\bt_\bi_\bo_\bn_\bs_\b._\bh_\bh>\n-14#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bp_\ba_\br_\ba_\bl_\bl_\be_\bl_\b/_\bl_\bo_\bc_\ba_\bl_\bi_\bn_\bd_\be_\bx_\b._\bh_\bh>\n-15#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bp_\ba_\br_\ba_\bl_\bl_\be_\bl_\b/_\bm_\bp_\bi_\bt_\br_\ba_\bi_\bt_\bs_\b._\bh_\bh>\n-16\n-17namespace _\bD_\bu_\bn_\be\n-18{\n-28 // forward declarations\n-29\n-30 template\n-31 class IndexPair;\n-32\n-38 template\n-39 std::ostream& _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b<_\b<(std::ostream& os, const IndexPair& pair);\n-40\n-41 template\n-42 bool _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b=_\b=(const IndexPair&, const IndexPair&);\n-43\n-44 template\n-45 bool _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b!_\b=(const IndexPair&, const IndexPair&);\n-46\n-47 template\n-48 bool _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b<(const IndexPair&, const IndexPair&);\n+12#include \n+13#include \n+14#include \n+15#include \n+16#include \n+17#include \n+18#include \n+19\n+20#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bh_\ba_\bs_\bh_\b._\bh_\bh>\n+21\n+22#ifdef CHECK_RESERVEDVECTOR\n+23#define CHECKSIZE(X) assert(X)\n+24#else\n+_\b2_\b5#define CHECKSIZE(X) {}\n+26#endif\n+27\n+28namespace _\bD_\bu_\bn_\be\n+29{\n+45 template\n+_\b4_\b6 class _\bR_\be_\bs_\be_\br_\bv_\be_\bd_\bV_\be_\bc_\bt_\bo_\br\n+47 {\n+48 using storage_type = std::array;\n 49\n-50 template\n-51 bool _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b>(const IndexPair&, const IndexPair&);\n-52\n-53 template\n-54 bool _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b<_\b=(const IndexPair&, const IndexPair&);\n-55\n-56 template\n-57 bool _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b _\b>_\b=(const IndexPair&, const IndexPair&);\n-58\n-59 template\n-60 bool _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b=_\b=(const IndexPair&, const TG&);\n-61\n-62 template\n-63 bool _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b!_\b=(const IndexPair&, const TG&);\n-64\n-65 template\n-66 bool _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b<(const IndexPair&, const TG&);\n-67\n-68 template\n-69 bool _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b>(const IndexPair&, const TG&);\n-70\n-71 template\n-72 bool _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b<_\b=(const IndexPair&, const TG&);\n-73\n-74 template\n-75 bool _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b _\b>_\b=(const IndexPair&, const TG&);\n+50 public:\n+51\n+_\b5_\b5 typedef typename storage_type::value_type _\bv_\ba_\bl_\bu_\be_\b__\bt_\by_\bp_\be;\n+_\b5_\b7 typedef typename storage_type::pointer _\bp_\bo_\bi_\bn_\bt_\be_\br;\n+_\b5_\b9 typedef typename storage_type::const_pointer _\bc_\bo_\bn_\bs_\bt_\b__\bp_\bo_\bi_\bn_\bt_\be_\br;\n+_\b6_\b1 typedef typename storage_type::reference _\br_\be_\bf_\be_\br_\be_\bn_\bc_\be;\n+_\b6_\b3 typedef typename storage_type::const_reference _\bc_\bo_\bn_\bs_\bt_\b__\br_\be_\bf_\be_\br_\be_\bn_\bc_\be;\n+_\b6_\b5 typedef typename storage_type::size_type _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be;\n+_\b6_\b7 typedef typename storage_type::difference_type _\bd_\bi_\bf_\bf_\be_\br_\be_\bn_\bc_\be_\b__\bt_\by_\bp_\be;\n+_\b6_\b9 typedef typename storage_type::iterator _\bi_\bt_\be_\br_\ba_\bt_\bo_\br;\n+_\b7_\b1 typedef typename storage_type::const_iterator _\bc_\bo_\bn_\bs_\bt_\b__\bi_\bt_\be_\br_\ba_\bt_\bo_\br;\n+_\b7_\b3 typedef std::reverse_iterator _\br_\be_\bv_\be_\br_\bs_\be_\b__\bi_\bt_\be_\br_\ba_\bt_\bo_\br;\n+_\b7_\b5 typedef std::reverse_iterator _\bc_\bo_\bn_\bs_\bt_\b__\br_\be_\bv_\be_\br_\bs_\be_\b__\bi_\bt_\be_\br_\ba_\bt_\bo_\br;\n 76\n-77 template\n-78 struct MPITraits;\n-79\n-83 template\n-_\b8_\b4 class _\bI_\bn_\bd_\be_\bx_\bP_\ba_\bi_\br\n-85 {\n-86 friend std::ostream& operator<<<>(std::ostream&, const _\bI_\bn_\bd_\be_\bx_\bP_\ba_\bi_\br_\b<_\bT_\bG_\b,_\bT_\bL_\b>&);\n-87 friend bool operator==<>(const _\bI_\bn_\bd_\be_\bx_\bP_\ba_\bi_\br_\b<_\bT_\bG_\b,_\bT_\bL_\b>&, const _\bI_\bn_\bd_\be_\bx_\bP_\ba_\bi_\br_\b<_\bT_\bG_\b,_\bT_\bL_\b>&);\n-88 friend bool operator!=<>(const _\bI_\bn_\bd_\be_\bx_\bP_\ba_\bi_\br_\b<_\bT_\bG_\b,_\bT_\bL_\b>&, const _\bI_\bn_\bd_\be_\bx_\bP_\ba_\bi_\br_\b<_\bT_\bG_\b,_\bT_\bL_\b>&);\n-89 friend bool operator< <>(const _\bI_\bn_\bd_\be_\bx_\bP_\ba_\bi_\br_\b<_\bT_\bG_\b,_\bT_\bL_\b>&, const _\bI_\bn_\bd_\be_\bx_\bP_\ba_\bi_\br_\b<_\bT_\bG_\b,_\bT_\bL_\b>&);\n-90 friend bool operator><>(const _\bI_\bn_\bd_\be_\bx_\bP_\ba_\bi_\br_\b<_\bT_\bG_\b,_\bT_\bL_\b>&, const _\bI_\bn_\bd_\be_\bx_\bP_\ba_\bi_\br_\b<_\bT_\bG_\b,_\bT_\bL_\b>&);\n-91 friend bool operator<=<>(const _\bI_\bn_\bd_\be_\bx_\bP_\ba_\bi_\br_\b<_\bT_\bG_\b,_\bT_\bL_\b>&, const _\bI_\bn_\bd_\be_\bx_\bP_\ba_\bi_\br_\b<_\bT_\bG_\b,_\bT_\bL_\b>&);\n-92 friend bool operator>=<>(const _\bI_\bn_\bd_\be_\bx_\bP_\ba_\bi_\br_\b<_\bT_\bG_\b,_\bT_\bL_\b>&, const _\bI_\bn_\bd_\be_\bx_\bP_\ba_\bi_\br_\b<_\bT_\bG_\b,_\bT_\bL_\b>&);\n-93 friend bool operator==<>(const _\bI_\bn_\bd_\be_\bx_\bP_\ba_\bi_\br_\b<_\bT_\bG_\b,_\bT_\bL_\b>&, const TG &);\n-94 friend bool operator!=<>(const _\bI_\bn_\bd_\be_\bx_\bP_\ba_\bi_\br_\b<_\bT_\bG_\b,_\bT_\bL_\b>&, const TG &);\n-95 friend bool operator< <>(const _\bI_\bn_\bd_\be_\bx_\bP_\ba_\bi_\br_\b<_\bT_\bG_\b,_\bT_\bL_\b>&, const TG &);\n-96 friend bool operator> <>(const _\bI_\bn_\bd_\be_\bx_\bP_\ba_\bi_\br_\b<_\bT_\bG_\b,_\bT_\bL_\b>&, const TG &);\n-97 friend bool operator<=<>(const _\bI_\bn_\bd_\be_\bx_\bP_\ba_\bi_\br_\b<_\bT_\bG_\b,_\bT_\bL_\b>&, const TG &);\n-_\b9_\b8 friend bool operator>=<>(const _\bI_\bn_\bd_\be_\bx_\bP_\ba_\bi_\br_\b<_\bT_\bG_\b,_\bT_\bL_\b>&, const TG &);\n-99 friend struct _\bM_\bP_\bI_\bT_\br_\ba_\bi_\bt_\bs<_\bI_\bn_\bd_\be_\bx_\bP_\ba_\bi_\br >;\n-100\n-101 public:\n-_\b1_\b0_\b7 typedef TG _\bG_\bl_\bo_\bb_\ba_\bl_\bI_\bn_\bd_\be_\bx;\n-108\n-_\b1_\b2_\b0 typedef TL _\bL_\bo_\bc_\ba_\bl_\bI_\bn_\bd_\be_\bx;\n-121\n-_\b1_\b2_\b8 _\bI_\bn_\bd_\be_\bx_\bP_\ba_\bi_\br(const _\bG_\bl_\bo_\bb_\ba_\bl_\bI_\bn_\bd_\be_\bx& _\bg_\bl_\bo_\bb_\ba_\bl, const _\bL_\bo_\bc_\ba_\bl_\bI_\bn_\bd_\be_\bx& _\bl_\bo_\bc_\ba_\bl);\n-129\n-_\b1_\b3_\b3 _\bI_\bn_\bd_\be_\bx_\bP_\ba_\bi_\br();\n-_\b1_\b4_\b0 _\bI_\bn_\bd_\be_\bx_\bP_\ba_\bi_\br(const _\bG_\bl_\bo_\bb_\ba_\bl_\bI_\bn_\bd_\be_\bx& _\bg_\bl_\bo_\bb_\ba_\bl);\n+_\b8_\b2 constexpr _\bR_\be_\bs_\be_\br_\bv_\be_\bd_\bV_\be_\bc_\bt_\bo_\br()\n+83 noexcept(_\bs_\bt_\bd::is_nothrow_default_constructible_v<_\bv_\ba_\bl_\bu_\be_\b__\bt_\by_\bp_\be>)\n+84 : storage_()\n+85 , size_(0)\n+86 {}\n+87\n+_\b8_\b9 explicit constexpr _\bR_\be_\bs_\be_\br_\bv_\be_\bd_\bV_\be_\bc_\bt_\bo_\br(_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be count)\n+90 noexcept(std::is_nothrow_default_constructible_v)\n+91 : storage_()\n+92 , size_(count)\n+93 {\n+94 assert(count <= n);\n+95 }\n+96\n+_\b9_\b8 constexpr _\bR_\be_\bs_\be_\br_\bv_\be_\bd_\bV_\be_\bc_\bt_\bo_\br(_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be count, const _\bv_\ba_\bl_\bu_\be_\b__\bt_\by_\bp_\be& value)\n+99 noexcept(std::is_nothrow_copy_assignable_v &&\n+100 noexcept(_\bR_\be_\bs_\be_\br_\bv_\be_\bd_\bV_\be_\bc_\bt_\bo_\br(count)))\n+101 : _\bR_\be_\bs_\be_\br_\bv_\be_\bd_\bV_\be_\bc_\bt_\bo_\br(count)\n+102 {\n+103 for (_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be i=0; i::value_type, _\bv_\ba_\bl_\bu_\be_\b__\bt_\by_\bp_\be>, int> = 0>\n+_\b1_\b1_\b0 constexpr _\bR_\be_\bs_\be_\br_\bv_\be_\bd_\bV_\be_\bc_\bt_\bo_\br(InputIt first, InputIt last)\n+111 noexcept(std::is_nothrow_copy_assignable_v &&\n+112 noexcept(_\bR_\be_\bs_\be_\br_\bv_\be_\bd_\bV_\be_\bc_\bt_\bo_\br()))\n+113 : _\bR_\be_\bs_\be_\br_\bv_\be_\bd_\bV_\be_\bc_\bt_\bo_\br()\n+114 {\n+115 for (_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be i=0; i const& l)\n+122 noexcept(std::is_nothrow_copy_assignable_v &&\n+123 noexcept(_\bR_\be_\bs_\be_\br_\bv_\be_\bd_\bV_\be_\bc_\bt_\bo_\br(l.begin(),l.end())))\n+124 : _\bR_\be_\bs_\be_\br_\bv_\be_\bd_\bV_\be_\bc_\bt_\bo_\br(l.begin(),l.end())\n+125 {}\n+126\n+_\b1_\b3_\b2 constexpr bool _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b=_\b=_\b (const _\bR_\be_\bs_\be_\br_\bv_\be_\bd_\bV_\be_\bc_\bt_\bo_\br& that) const noexcept\n+133 {\n+134 if (_\bs_\bi_\bz_\be() != that.size())\n+135 return false;\n+136 for (_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be i=0; i<_\bs_\bi_\bz_\be(); ++i)\n+137 if (!(storage_[i]==that.storage_[i]))\n+138 return false;\n+139 return true;\n+140 }\n 141\n-_\b1_\b4_\b7 inline const _\bG_\bl_\bo_\bb_\ba_\bl_\bI_\bn_\bd_\be_\bx& _\bg_\bl_\bo_\bb_\ba_\bl() const;\n-148\n-_\b1_\b5_\b4 inline _\bL_\bo_\bc_\ba_\bl_\bI_\bn_\bd_\be_\bx& _\bl_\bo_\bc_\ba_\bl();\n-155\n-_\b1_\b6_\b1 inline const _\bL_\bo_\bc_\ba_\bl_\bI_\bn_\bd_\be_\bx& _\bl_\bo_\bc_\ba_\bl() const;\n-162\n-_\b1_\b6_\b8 inline void _\bs_\be_\bt_\bL_\bo_\bc_\ba_\bl(int index);\n-169 private:\n-171 _\bG_\bl_\bo_\bb_\ba_\bl_\bI_\bn_\bd_\be_\bx global_;\n-_\b1_\b7_\b3 _\bL_\bo_\bc_\ba_\bl_\bI_\bn_\bd_\be_\bx local_;\n-174 };\n+_\b1_\b4_\b3 constexpr bool _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b!_\b=_\b (const _\bR_\be_\bs_\be_\br_\bv_\be_\bd_\bV_\be_\bc_\bt_\bo_\br& that) const noexcept\n+144 {\n+145 return !(*this == that);\n+146 }\n+147\n+_\b1_\b4_\b9 constexpr bool _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b<_\b (const _\bR_\be_\bs_\be_\br_\bv_\be_\bd_\bV_\be_\bc_\bt_\bo_\br& that) const noexcept\n+150 {\n+151 for (_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be i=0; i_\b (const _\bR_\be_\bs_\be_\br_\bv_\be_\bd_\bV_\be_\bc_\bt_\bo_\br& that) const noexcept\n+160 {\n+161 return that < *this;\n+162 }\n+163\n+_\b1_\b6_\b5 constexpr bool _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b<_\b=_\b (const _\bR_\be_\bs_\be_\br_\bv_\be_\bd_\bV_\be_\bc_\bt_\bo_\br& that) const noexcept\n+166 {\n+167 return !(*this > that);\n+168 }\n+169\n+_\b1_\b7_\b1 constexpr bool _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b>_\b=_\b (const _\bR_\be_\bs_\be_\br_\bv_\be_\bd_\bV_\be_\bc_\bt_\bo_\br& that) const noexcept\n+172 {\n+173 return !(*this < that);\n+174 }\n 175\n-_\b1_\b8_\b0 enum _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt_\bS_\bt_\ba_\bt_\be\n-181 {\n-_\b1_\b8_\b6 _\bG_\bR_\bO_\bU_\bN_\bD,\n-190 _\bR_\bE_\bS_\bI_\bZ_\bE\n-_\b2_\b0_\b0 };\n-201\n-_\b2_\b0_\b5 class _\bI_\bn_\bv_\ba_\bl_\bi_\bd_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt_\bS_\bt_\ba_\bt_\be : public _\bI_\bn_\bv_\ba_\bl_\bi_\bd_\bS_\bt_\ba_\bt_\be_\bE_\bx_\bc_\be_\bp_\bt_\bi_\bo_\bn {};\n-206\n-207 // Forward declaration\n-208 template class _\bG_\bl_\bo_\bb_\ba_\bl_\bL_\bo_\bo_\bk_\bu_\bp_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt;\n-209\n-216 template\n-_\b2_\b1_\b7 class _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt\n-218 {\n-219 friend class _\bG_\bl_\bo_\bb_\ba_\bl_\bL_\bo_\bo_\bk_\bu_\bp_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt<_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt >;\n-220\n-221 public:\n-_\b2_\b2_\b6 typedef TG _\bG_\bl_\bo_\bb_\ba_\bl_\bI_\bn_\bd_\be_\bx;\n-227\n-_\b2_\b3_\b9 typedef TL _\bL_\bo_\bc_\ba_\bl_\bI_\bn_\bd_\be_\bx;\n-240\n-_\b2_\b4_\b4 typedef _\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bd_\be_\bx_\bP_\ba_\bi_\br_\b<_\bG_\bl_\bo_\bb_\ba_\bl_\bI_\bn_\bd_\be_\bx_\b,_\bL_\bo_\bc_\ba_\bl_\bI_\bn_\bd_\be_\bx_\b> _\bI_\bn_\bd_\be_\bx_\bP_\ba_\bi_\br;\n-245\n-_\b2_\b5_\b2 constexpr static int _\ba_\br_\br_\ba_\by_\bS_\bi_\bz_\be = (N>0) ? N : 1;\n+_\b1_\b8_\b1 constexpr void _\bc_\bl_\be_\ba_\br() noexcept\n+182 {\n+183 size_ = 0;\n+184 }\n+185\n+_\b1_\b8_\b7 constexpr void _\br_\be_\bs_\bi_\bz_\be(_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be s) noexcept\n+188 {\n+189 _\bC_\bH_\bE_\bC_\bK_\bS_\bI_\bZ_\bE(s<=n);\n+190 size_ = s;\n+191 }\n+192\n+_\b1_\b9_\b4 constexpr void _\bp_\bu_\bs_\bh_\b__\bb_\ba_\bc_\bk(const _\bv_\ba_\bl_\bu_\be_\b__\bt_\by_\bp_\be& t)\n+195 noexcept(std::is_nothrow_copy_assignable_v)\n+196 {\n+197 _\bC_\bH_\bE_\bC_\bK_\bS_\bI_\bZ_\bE(size_)\n+204 {\n+205 _\bC_\bH_\bE_\bC_\bK_\bS_\bI_\bZ_\bE(size_\n+_\b2_\b1_\b1 _\br_\be_\bf_\be_\br_\be_\bn_\bc_\be _\be_\bm_\bp_\bl_\ba_\bc_\be_\b__\bb_\ba_\bc_\bk(Args&&... args)\n+212 noexcept(std::is_nothrow_constructible_v<_\bv_\ba_\bl_\bu_\be_\b__\bt_\by_\bp_\be,decltype(args)...>)\n+213 {\n+214 _\bC_\bH_\bE_\bC_\bK_\bS_\bI_\bZ_\bE(size_~value_type();\n+218 // construct the value_type in place\n+219 // NOTE: This is not an integral constant expression.\n+220 // With c++20 we could use std::construct_at\n+221 ::new (const_cast(static_cast(p)))\n+222 _\bv_\ba_\bl_\bu_\be_\b__\bt_\by_\bp_\be(std::forward(args)...);\n+223 return *p;\n+224 }\n+225\n+_\b2_\b2_\b7 constexpr void _\bp_\bo_\bp_\b__\bb_\ba_\bc_\bk() noexcept\n+228 {\n+229 if (! _\be_\bm_\bp_\bt_\by()) size_--;\n+230 }\n+231\n+_\b2_\b3_\b7 constexpr _\bi_\bt_\be_\br_\ba_\bt_\bo_\br _\bb_\be_\bg_\bi_\bn() noexcept\n+238 {\n+239 return storage_.begin();\n+240 }\n+241\n+_\b2_\b4_\b3 constexpr _\bc_\bo_\bn_\bs_\bt_\b__\bi_\bt_\be_\br_\ba_\bt_\bo_\br _\bb_\be_\bg_\bi_\bn() const noexcept\n+244 {\n+245 return storage_.begin();\n+246 }\n+247\n+_\b2_\b4_\b9 constexpr _\bc_\bo_\bn_\bs_\bt_\b__\bi_\bt_\be_\br_\ba_\bt_\bo_\br _\bc_\bb_\be_\bg_\bi_\bn() const noexcept\n+250 {\n+251 return storage_.cbegin();\n+252 }\n 253\n-_\b2_\b5_\b5 class _\bi_\bt_\be_\br_\ba_\bt_\bo_\br :\n-256 public _\bA_\br_\br_\ba_\by_\bL_\bi_\bs_\bt::iterator\n-257 {\n-258 typedef typename _\bA_\br_\br_\ba_\by_\bL_\bi_\bs_\bt_\b<_\bI_\bn_\bd_\be_\bx_\bP_\ba_\bi_\br_\b,_\bN_\b>_\b:_\b:_\bi_\bt_\be_\br_\ba_\bt_\bo_\br\n-_\b2_\b5_\b9 _\bF_\ba_\bt_\bh_\be_\br;\n-260 friend class _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt<_\bG_\bl_\bo_\bb_\ba_\bl_\bI_\bn_\bd_\be_\bx,_\bL_\bo_\bc_\ba_\bl_\bI_\bn_\bd_\be_\bx,N>;\n-261 public:\n-_\b2_\b6_\b2 _\bi_\bt_\be_\br_\ba_\bt_\bo_\br(_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt_\b<_\bT_\bG_\b,_\bT_\bL_\b,_\bN_\b>& indexSet, const _\bF_\ba_\bt_\bh_\be_\br& father)\n-263 : _\bF_\ba_\bt_\bh_\be_\br(father), indexSet_(&indexSet)\n-264 {}\n+_\b2_\b5_\b5 constexpr _\br_\be_\bv_\be_\br_\bs_\be_\b__\bi_\bt_\be_\br_\ba_\bt_\bo_\br _\br_\bb_\be_\bg_\bi_\bn() noexcept\n+256 {\n+257 return _\br_\be_\bv_\be_\br_\bs_\be_\b__\bi_\bt_\be_\br_\ba_\bt_\bo_\br{_\bb_\be_\bg_\bi_\bn()+_\bs_\bi_\bz_\be()};\n+258 }\n+259\n+_\b2_\b6_\b1 constexpr _\bc_\bo_\bn_\bs_\bt_\b__\br_\be_\bv_\be_\br_\bs_\be_\b__\bi_\bt_\be_\br_\ba_\bt_\bo_\br _\br_\bb_\be_\bg_\bi_\bn() const noexcept\n+262 {\n+263 return _\bc_\bo_\bn_\bs_\bt_\b__\br_\be_\bv_\be_\br_\bs_\be_\b__\bi_\bt_\be_\br_\ba_\bt_\bo_\br{_\bb_\be_\bg_\bi_\bn()+_\bs_\bi_\bz_\be()};\n+264 }\n 265\n-266 private:\n-276 inline void markAsDeleted() const\n-277 {\n-278#ifndef NDEBUG\n-279 if(indexSet_->state_ != _\bR_\bE_\bS_\bI_\bZ_\bE)\n-280 _\bD_\bU_\bN_\bE_\b__\bT_\bH_\bR_\bO_\bW(_\bI_\bn_\bv_\ba_\bl_\bi_\bd_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt_\bS_\bt_\ba_\bt_\be, \"Indices can only be removed \"\n-281 <<\"while in RESIZE state!\");\n-282#endif\n-283 _\bF_\ba_\bt_\bh_\be_\br_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b*().local().setState(_\bD_\bE_\bL_\bE_\bT_\bE_\bD);\n-284 }\n-285\n-287 _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt_\b<_\bT_\bG_\b,_\bT_\bL_\b,_\bN_\b>* indexSet_;\n-288\n-289 };\n-290\n-291\n-292\n-294 typedef typename\n-295 _\bA_\br_\br_\ba_\by_\bL_\bi_\bs_\bt_\b<_\bI_\bn_\bd_\be_\bx_\bP_\ba_\bi_\br_\b,_\bN_\b>_\b:_\b:_\bc_\bo_\bn_\bs_\bt_\b__\bi_\bt_\be_\br_\ba_\bt_\bo_\br\n-_\b2_\b9_\b6 _\bc_\bo_\bn_\bs_\bt_\b__\bi_\bt_\be_\br_\ba_\bt_\bo_\br;\n-297\n-_\b3_\b0_\b1 _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt();\n-302\n-_\b3_\b0_\b7 inline const _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt_\bS_\bt_\ba_\bt_\be& _\bs_\bt_\ba_\bt_\be()\n-308 {\n-309 return state_;\n-310 }\n-311\n-_\b3_\b1_\b7 void _\bb_\be_\bg_\bi_\bn_\bR_\be_\bs_\bi_\bz_\be();\n-318\n-_\b3_\b2_\b7 inline void _\ba_\bd_\bd(const _\bG_\bl_\bo_\bb_\ba_\bl_\bI_\bn_\bd_\be_\bx& global);\n-328\n-_\b3_\b3_\b7 inline void _\ba_\bd_\bd(const _\bG_\bl_\bo_\bb_\ba_\bl_\bI_\bn_\bd_\be_\bx& global, const _\bL_\bo_\bc_\ba_\bl_\bI_\bn_\bd_\be_\bx& local);\n-338\n-_\b3_\b4_\b6 inline void _\bm_\ba_\br_\bk_\bA_\bs_\bD_\be_\bl_\be_\bt_\be_\bd(const _\bi_\bt_\be_\br_\ba_\bt_\bo_\br& position);\n-347\n-_\b3_\b6_\b0 void _\be_\bn_\bd_\bR_\be_\bs_\bi_\bz_\be();\n-361\n-372 inline _\bI_\bn_\bd_\be_\bx_\bP_\ba_\bi_\br&\n-_\b3_\b7_\b3 _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b[_\b](const _\bG_\bl_\bo_\bb_\ba_\bl_\bI_\bn_\bd_\be_\bx& global);\n-374\n-384 inline _\bI_\bn_\bd_\be_\bx_\bP_\ba_\bi_\br&\n-_\b3_\b8_\b5 _\ba_\bt(const _\bG_\bl_\bo_\bb_\ba_\bl_\bI_\bn_\bd_\be_\bx& global);\n-386\n-396 inline bool\n-_\b3_\b9_\b7 _\be_\bx_\bi_\bs_\bt_\bs (const _\bG_\bl_\bo_\bb_\ba_\bl_\bI_\bn_\bd_\be_\bx& global) const;\n-398\n-409 inline const _\bI_\bn_\bd_\be_\bx_\bP_\ba_\bi_\br&\n-_\b4_\b1_\b0 _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b[_\b](const _\bG_\bl_\bo_\bb_\ba_\bl_\bI_\bn_\bd_\be_\bx& global) const;\n-411\n-421 inline const _\bI_\bn_\bd_\be_\bx_\bP_\ba_\bi_\br&\n-_\b4_\b2_\b2 _\ba_\bt(const _\bG_\bl_\bo_\bb_\ba_\bl_\bI_\bn_\bd_\be_\bx& global) const;\n-423\n-_\b4_\b2_\b8 inline _\bi_\bt_\be_\br_\ba_\bt_\bo_\br _\bb_\be_\bg_\bi_\bn();\n-429\n-_\b4_\b3_\b4 inline _\bi_\bt_\be_\br_\ba_\bt_\bo_\br _\be_\bn_\bd();\n-435\n-_\b4_\b4_\b0 inline _\bc_\bo_\bn_\bs_\bt_\b__\bi_\bt_\be_\br_\ba_\bt_\bo_\br _\bb_\be_\bg_\bi_\bn() const;\n-441\n-_\b4_\b4_\b6 inline _\bc_\bo_\bn_\bs_\bt_\b__\bi_\bt_\be_\br_\ba_\bt_\bo_\br _\be_\bn_\bd() const;\n-447\n-_\b4_\b5_\b7 inline void _\br_\be_\bn_\bu_\bm_\bb_\be_\br_\bL_\bo_\bc_\ba_\bl();\n-458\n-_\b4_\b6_\b5 inline int _\bs_\be_\bq_\bN_\bo() const;\n-466\n-_\b4_\b7_\b1 inline size_t _\bs_\bi_\bz_\be() const;\n-472\n-473 private:\n-475 _\bA_\br_\br_\ba_\by_\bL_\bi_\bs_\bt_\b<_\bI_\bn_\bd_\be_\bx_\bP_\ba_\bi_\br_\b,_\bN_\b> localIndices_;\n-477 _\bA_\br_\br_\ba_\by_\bL_\bi_\bs_\bt_\b<_\bI_\bn_\bd_\be_\bx_\bP_\ba_\bi_\br_\b,_\bN_\b> newIndices_;\n-479 _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt_\bS_\bt_\ba_\bt_\be state_;\n-481 int seqNo_;\n-483 bool deletedEntries_;\n-488 inline void merge();\n-489 };\n-490\n-491\n-497 template\n-498 std::ostream& _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b<_\b<(std::ostream& os, const _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt_\b<_\bT_\bG_\b,_\bT_\bL_\b,_\bN_\b>&\n-indexSet);\n-499\n-505 template\n-_\b5_\b0_\b6 class _\bG_\bl_\bo_\bb_\ba_\bl_\bL_\bo_\bo_\bk_\bu_\bp_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt\n-507 {\n-508 public:\n-_\b5_\b1_\b2 typedef I _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt;\n-513\n-_\b5_\b1_\b7 typedef typename _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt_\b:_\b:_\bL_\bo_\bc_\ba_\bl_\bI_\bn_\bd_\be_\bx _\bL_\bo_\bc_\ba_\bl_\bI_\bn_\bd_\be_\bx;\n-518\n-_\b5_\b2_\b2 typedef typename _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt_\b:_\b:_\bG_\bl_\bo_\bb_\ba_\bl_\bI_\bn_\bd_\be_\bx _\bG_\bl_\bo_\bb_\ba_\bl_\bI_\bn_\bd_\be_\bx;\n-523\n-_\b5_\b2_\b7 typedef typename _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt_\b:_\b:_\bc_\bo_\bn_\bs_\bt_\b__\bi_\bt_\be_\br_\ba_\bt_\bo_\br _\bc_\bo_\bn_\bs_\bt_\b__\bi_\bt_\be_\br_\ba_\bt_\bo_\br;\n-528\n-_\b5_\b2_\b9 typedef _\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bd_\be_\bx_\bP_\ba_\bi_\br_\b<_\bt_\by_\bp_\be_\bn_\ba_\bm_\be_\b _\bI_\b:_\b:_\bG_\bl_\bo_\bb_\ba_\bl_\bI_\bn_\bd_\be_\bx_\b,_\b _\bt_\by_\bp_\be_\bn_\ba_\bm_\be_\b _\bI_\b:_\b:_\bL_\bo_\bc_\ba_\bl_\bI_\bn_\bd_\be_\bx_\b>\n-_\bI_\bn_\bd_\be_\bx_\bP_\ba_\bi_\br;\n-530\n-_\b5_\b3_\b7 _\bG_\bl_\bo_\bb_\ba_\bl_\bL_\bo_\bo_\bk_\bu_\bp_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt(const _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt& indexset, std::size_t _\bs_\bi_\bz_\be);\n-538\n-_\b5_\b4_\b4 _\bG_\bl_\bo_\bb_\ba_\bl_\bL_\bo_\bo_\bk_\bu_\bp_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt(const _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt& indexset);\n-545\n-_\b5_\b4_\b9 _\b~_\bG_\bl_\bo_\bb_\ba_\bl_\bL_\bo_\bo_\bk_\bu_\bp_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt();\n-550\n-560 inline const _\bI_\bn_\bd_\be_\bx_\bP_\ba_\bi_\br&\n-_\b5_\b6_\b1 _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b[_\b](const _\bG_\bl_\bo_\bb_\ba_\bl_\bI_\bn_\bd_\be_\bx& global) const;\n-562\n-566 inline const _\bI_\bn_\bd_\be_\bx_\bP_\ba_\bi_\br*\n-_\b5_\b6_\b7 _\bp_\ba_\bi_\br(const std::size_t& local) const;\n-568\n-_\b5_\b7_\b3 inline _\bc_\bo_\bn_\bs_\bt_\b__\bi_\bt_\be_\br_\ba_\bt_\bo_\br _\bb_\be_\bg_\bi_\bn() const;\n-574\n-_\b5_\b7_\b9 inline _\bc_\bo_\bn_\bs_\bt_\b__\bi_\bt_\be_\br_\ba_\bt_\bo_\br _\be_\bn_\bd() const;\n-580\n-_\b5_\b8_\b7 inline int _\bs_\be_\bq_\bN_\bo() const;\n-588\n-_\b5_\b9_\b3 inline size_t _\bs_\bi_\bz_\be() const;\n-594 private:\n-598 const _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt& indexSet_;\n-599\n-603 std::size_t size_;\n-604\n-608 std::vector indices_;\n-609\n-610 };\n-611\n-612\n-613 template\n-_\b6_\b1_\b4 struct _\bL_\bo_\bc_\ba_\bl_\bI_\bn_\bd_\be_\bx_\bC_\bo_\bm_\bp_\ba_\br_\ba_\bt_\bo_\br\n-615 {\n-_\b6_\b1_\b6 static bool _\bc_\bo_\bm_\bp_\ba_\br_\be([[maybe_unused]] const T& t1, [[maybe_unused]] const T&\n-t2)\n-617 {\n-618 return false;\n-619 }\n-620 };\n-621\n-622 template\n-_\b6_\b2_\b3 struct _\bI_\bn_\bd_\be_\bx_\bS_\be_\bt_\bS_\bo_\br_\bt_\bF_\bu_\bn_\bc_\bt_\bo_\br\n-624 {\n-_\b6_\b2_\b5 bool _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b(_\b)(const _\bI_\bn_\bd_\be_\bx_\bP_\ba_\bi_\br_\b<_\bT_\bG_\b,_\bT_\bL_\b>& i1, const _\bI_\bn_\bd_\be_\bx_\bP_\ba_\bi_\br_\b<_\bT_\bG_\b,_\bT_\bL_\b>& i2)\n-626 {\n-627 return i1._\bg_\bl_\bo_\bb_\ba_\bl()_\b:_\b:_\bc_\bo_\bm_\bp_\ba_\br_\be(i1._\bl_\bo_\bc_\ba_\bl(),\n-629 i2._\bl_\bo_\bc_\ba_\bl()));\n-630 }\n-631 };\n-632\n-633\n-634\n-635 template\n-_\b6_\b3_\b6 inline std::ostream& _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b<_\b<(std::ostream& os, const _\bI_\bn_\bd_\be_\bx_\bP_\ba_\bi_\br_\b<_\bT_\bG_\b,_\bT_\bL_\b>&\n-pair)\n-637 {\n-638 os<<\"{global=\"<\n-_\b6_\b4_\b3 inline std::ostream& _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b<_\b<(std::ostream& os, const\n-_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt_\b<_\bT_\bG_\b,_\bT_\bL_\b,_\bN_\b>& indexSet)\n-644 {\n-645 typedef typename _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt_\b<_\bT_\bG_\b,_\bT_\bL_\b,_\bN_\b>_\b:_\b:_\bc_\bo_\bn_\bs_\bt_\b__\bi_\bt_\be_\br_\ba_\bt_\bo_\br Iterator;\n-646 Iterator end = indexSet._\be_\bn_\bd();\n-647 os<<\"{\";\n-648 for(Iterator index = indexSet._\bb_\be_\bg_\bi_\bn(); index != end; ++index)\n-649 os<<*index<<\" \";\n-650 os<<\"}\";\n-651 return os;\n-652\n-653 }\n-654\n-655 template\n-_\b6_\b5_\b6 inline bool _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b=_\b=(const _\bI_\bn_\bd_\be_\bx_\bP_\ba_\bi_\br_\b<_\bT_\bG_\b,_\bT_\bL_\b>& a, const _\bI_\bn_\bd_\be_\bx_\bP_\ba_\bi_\br_\b<_\bT_\bG_\b,_\bT_\bL_\b>&\n-b)\n-657 {\n-658 return a.global_==b.global_;\n-659 }\n-660\n-661 template\n-_\b6_\b6_\b2 inline bool _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b!_\b=(const _\bI_\bn_\bd_\be_\bx_\bP_\ba_\bi_\br_\b<_\bT_\bG_\b,_\bT_\bL_\b>& a, const _\bI_\bn_\bd_\be_\bx_\bP_\ba_\bi_\br_\b<_\bT_\bG_\b,_\bT_\bL_\b>&\n-b)\n-663 {\n-664 return a.global_!=b.global_;\n-665 }\n-666\n-667 template\n-_\b6_\b6_\b8 inline bool _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b<(const _\bI_\bn_\bd_\be_\bx_\bP_\ba_\bi_\br_\b<_\bT_\bG_\b,_\bT_\bL_\b>& a, const _\bI_\bn_\bd_\be_\bx_\bP_\ba_\bi_\br_\b<_\bT_\bG_\b,_\bT_\bL_\b>& b)\n-669 {\n-670 return a.global_\n-_\b6_\b7_\b4 inline bool _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b>(const _\bI_\bn_\bd_\be_\bx_\bP_\ba_\bi_\br_\b<_\bT_\bG_\b,_\bT_\bL_\b>& a, const _\bI_\bn_\bd_\be_\bx_\bP_\ba_\bi_\br_\b<_\bT_\bG_\b,_\bT_\bL_\b>& b)\n-675 {\n-676 return a.global_>b.global_;\n-677 }\n-678\n-679 template\n-_\b6_\b8_\b0 inline bool _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b<_\b=(const _\bI_\bn_\bd_\be_\bx_\bP_\ba_\bi_\br_\b<_\bT_\bG_\b,_\bT_\bL_\b>& a, const _\bI_\bn_\bd_\be_\bx_\bP_\ba_\bi_\br_\b<_\bT_\bG_\b,_\bT_\bL_\b>&\n-b)\n-681 {\n-682 return a.global_<=b.global_;\n-683 }\n-684\n-685 template\n-_\b6_\b8_\b6 inline bool _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b _\b>_\b=(const _\bI_\bn_\bd_\be_\bx_\bP_\ba_\bi_\br_\b<_\bT_\bG_\b,_\bT_\bL_\b>& a, const _\bI_\bn_\bd_\be_\bx_\bP_\ba_\bi_\br_\b<_\bT_\bG_\b,_\bT_\bL_\b>&\n-b)\n-687 {\n-688 return a.global_>=b.global_;\n-689 }\n-690\n-691 template\n-_\b6_\b9_\b2 inline bool _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b=_\b=(const _\bI_\bn_\bd_\be_\bx_\bP_\ba_\bi_\br_\b<_\bT_\bG_\b,_\bT_\bL_\b>& a, const TG& b)\n-693 {\n-694 return a.global_==b;\n-695 }\n-696\n-697 template\n-_\b6_\b9_\b8 inline bool _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b!_\b=(const _\bI_\bn_\bd_\be_\bx_\bP_\ba_\bi_\br_\b<_\bT_\bG_\b,_\bT_\bL_\b>& a, const TG& b)\n-699 {\n-700 return a.global_!=b;\n-701 }\n-702\n-703 template\n-_\b7_\b0_\b4 inline bool _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b<(const _\bI_\bn_\bd_\be_\bx_\bP_\ba_\bi_\br_\b<_\bT_\bG_\b,_\bT_\bL_\b>& a, const TG& b)\n-705 {\n-706 return a.global_\n-_\b7_\b1_\b0 inline bool _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b>(const _\bI_\bn_\bd_\be_\bx_\bP_\ba_\bi_\br_\b<_\bT_\bG_\b,_\bT_\bL_\b>& a, const TG& b)\n-711 {\n-712 return a.global_>b;\n-713 }\n-714\n-715 template\n-_\b7_\b1_\b6 inline bool _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b<_\b=(const _\bI_\bn_\bd_\be_\bx_\bP_\ba_\bi_\br_\b<_\bT_\bG_\b,_\bT_\bL_\b>& a, const TG& b)\n-717 {\n-718 return a.global_<=b;\n-719 }\n-720\n-721 template\n-_\b7_\b2_\b2 inline bool _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b _\b>_\b=(const _\bI_\bn_\bd_\be_\bx_\bP_\ba_\bi_\br_\b<_\bT_\bG_\b,_\bT_\bL_\b>& a, const TG& b)\n-723 {\n-724 return a.global_>=b;\n-725 }\n-726\n-727#ifndef DOXYGEN\n-728\n-729 template\n-730 _\bI_\bn_\bd_\be_\bx_\bP_\ba_\bi_\br_\b<_\bT_\bG_\b,_\bT_\bL_\b>_\b:_\b:_\bI_\bn_\bd_\be_\bx_\bP_\ba_\bi_\br(const TG& global, const TL& local)\n-731 : global_(global), local_(local){}\n-732\n-733 template\n-734 _\bI_\bn_\bd_\be_\bx_\bP_\ba_\bi_\br_\b<_\bT_\bG_\b,_\bT_\bL_\b>_\b:_\b:_\bI_\bn_\bd_\be_\bx_\bP_\ba_\bi_\br(const TG& global)\n-735 : global_(global), local_(){}\n-736\n-737 template\n-738 _\bI_\bn_\bd_\be_\bx_\bP_\ba_\bi_\br_\b<_\bT_\bG_\b,_\bT_\bL_\b>_\b:_\b:_\bI_\bn_\bd_\be_\bx_\bP_\ba_\bi_\br()\n-739 : global_(), local_(){}\n-740\n-741 template\n-742 inline const TG& _\bI_\bn_\bd_\be_\bx_\bP_\ba_\bi_\br_\b<_\bT_\bG_\b,_\bT_\bL_\b>_\b:_\b:_\bg_\bl_\bo_\bb_\ba_\bl() const {\n-743 return global_;\n-744 }\n-745\n-746 template\n-747 inline TL& _\bI_\bn_\bd_\be_\bx_\bP_\ba_\bi_\br_\b<_\bT_\bG_\b,_\bT_\bL_\b>_\b:_\b:_\bl_\bo_\bc_\ba_\bl() {\n-748 return local_;\n-749 }\n-750\n-751 template\n-752 inline const TL& _\bI_\bn_\bd_\be_\bx_\bP_\ba_\bi_\br_\b<_\bT_\bG_\b,_\bT_\bL_\b>_\b:_\b:_\bl_\bo_\bc_\ba_\bl() const {\n-753 return local_;\n-754 }\n-755\n-756 template\n-757 inline void _\bI_\bn_\bd_\be_\bx_\bP_\ba_\bi_\br_\b<_\bT_\bG_\b,_\bT_\bL_\b>_\b:_\b:_\bs_\be_\bt_\bL_\bo_\bc_\ba_\bl(int local){\n-758 local_=local;\n-759 }\n-760\n-761 template\n-762 _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt_\b<_\bT_\bG_\b,_\bT_\bL_\b,_\bN_\b>_\b:_\b:_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt()\n-763 : state_(_\bG_\bR_\bO_\bU_\bN_\bD), seqNo_(0), deletedEntries_()\n-764 {}\n-765\n-766 template\n-767 void _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt_\b<_\bT_\bG_\b,_\bT_\bL_\b,_\bN_\b>_\b:_\b:_\bb_\be_\bg_\bi_\bn_\bR_\be_\bs_\bi_\bz_\be()\n-768 {\n-769\n-770 // Checks in unproductive code\n-771#ifndef NDEBUG\n-772 if(state_!=_\bG_\bR_\bO_\bU_\bN_\bD)\n-773 _\bD_\bU_\bN_\bE_\b__\bT_\bH_\bR_\bO_\bW(InvalidIndexSetState,\n-774 \"IndexSet has to be in GROUND state, when \"\n-775 << \"beginResize() is called!\");\n-776#endif\n-777\n-778 state_ = _\bR_\bE_\bS_\bI_\bZ_\bE;\n-779 deletedEntries_ = false;\n-780 }\n-781\n-782 template\n-783 inline void _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt_\b<_\bT_\bG_\b,_\bT_\bL_\b,_\bN_\b>_\b:_\b:_\ba_\bd_\bd(const GlobalIndex& global)\n-784 {\n-785 // Checks in unproductive code\n-786#ifndef NDEBUG\n-787 if(state_ != _\bR_\bE_\bS_\bI_\bZ_\bE)\n-788 _\bD_\bU_\bN_\bE_\b__\bT_\bH_\bR_\bO_\bW(InvalidIndexSetState, \"Indices can only be added \"\n-789 <<\"while in RESIZE state!\");\n-790#endif\n-791 newIndices_.push_back(IndexPair(global));\n-792 }\n-793\n-794 template\n-795 inline void _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt_\b<_\bT_\bG_\b,_\bT_\bL_\b,_\bN_\b>_\b:_\b:_\ba_\bd_\bd(const TG& global, const TL&\n-local)\n-796 {\n-797 // Checks in unproductive code\n-798#ifndef NDEBUG\n-799 if(state_ != _\bR_\bE_\bS_\bI_\bZ_\bE)\n-800 _\bD_\bU_\bN_\bE_\b__\bT_\bH_\bR_\bO_\bW(InvalidIndexSetState, \"Indices can only be added \"\n-801 <<\"while in RESIZE state!\");\n-802#endif\n-803 newIndices_.push_back(IndexPair(global,local));\n-804 }\n-805\n-806 template\n-807 inline void _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt_\b<_\bT_\bG_\b,_\bT_\bL_\b,_\bN_\b>_\b:_\b:_\bm_\ba_\br_\bk_\bA_\bs_\bD_\be_\bl_\be_\bt_\be_\bd(const iterator&\n-global)\n-808 {\n-809 // Checks in unproductive code\n-810#ifndef NDEBUG\n-811 if(state_ != _\bR_\bE_\bS_\bI_\bZ_\bE)\n-812 _\bD_\bU_\bN_\bE_\b__\bT_\bH_\bR_\bO_\bW(InvalidIndexSetState, \"Indices can only be removed \"\n-813 <<\"while in RESIZE state!\");\n-814#endif\n-815 deletedEntries_ = true;\n-816\n-817 global.markAsDeleted();\n-818 }\n-819\n-820 template\n-821 void _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt_\b<_\bT_\bG_\b,_\bT_\bL_\b,_\bN_\b>_\b:_\b:_\be_\bn_\bd_\bR_\be_\bs_\bi_\bz_\be() {\n-822 // Checks in unproductive code\n-823#ifndef NDEBUG\n-824 if(state_ != _\bR_\bE_\bS_\bI_\bZ_\bE)\n-825 _\bD_\bU_\bN_\bE_\b__\bT_\bH_\bR_\bO_\bW(InvalidIndexSetState, \"endResize called while not \"\n-826 <<\"in RESIZE state!\");\n-827#endif\n-828\n-829 std::sort(newIndices_.begin(), newIndices_.end(),\n-IndexSetSortFunctor());\n-830 merge();\n-831 seqNo_++;\n-832 state_ = _\bG_\bR_\bO_\bU_\bN_\bD;\n-833 }\n-834\n-835\n-836 template\n-837 inline void ParallelIndexSet::merge(){\n-838 if(localIndices_.size()==0)\n-839 {\n-840 localIndices_=newIndices_;\n-841 newIndices_.clear();\n-842 }\n-843 else if(newIndices_.size()>0 || deletedEntries_)\n-844 {\n-845 ArrayList tempPairs;\n-846\n-847 auto old = localIndices_.begin();\n-848 auto added = newIndices_.begin();\n-849 const auto endold = localIndices_.end();\n-850 const auto endadded = newIndices_.end();\n-851\n-852 while(old != endold && added!= endadded)\n-853 {\n-854 if(old->local().state()==_\bD_\bE_\bL_\bE_\bT_\bE_\bD) {\n-855 old.eraseToHere();\n-856 }\n-857 else\n-858 {\n-859 if(old->global() < added->global() ||\n-860 (old->global() == added->global()\n-861 && _\bL_\bo_\bc_\ba_\bl_\bI_\bn_\bd_\be_\bx_\bC_\bo_\bm_\bp_\ba_\br_\ba_\bt_\bo_\br_\b<_\bT_\bL_\b>_\b:_\b:_\bc_\bo_\bm_\bp_\ba_\br_\be(old->local(),added->local())))\n-862 {\n-863 tempPairs.push_back(*old);\n-864 old.eraseToHere();\n-865 continue;\n-866 }else\n-867 {\n-868 tempPairs.push_back(*added);\n-869 added.eraseToHere();\n-870 }\n-871 }\n-872 }\n-873\n-874 while(old != endold)\n-875 {\n-876 if(old->local().state()!=_\bD_\bE_\bL_\bE_\bT_\bE_\bD) {\n-877 tempPairs.push_back(*old);\n-878 }\n-879 old.eraseToHere();\n-880 }\n-881\n-882 while(added!= endadded)\n-883 {\n-884 tempPairs.push_back(*added);\n-885 added.eraseToHere();\n-886 }\n-887 localIndices_ = tempPairs;\n-888 }\n-889 }\n-890\n-891\n-892 template\n-893 inline const IndexPair&\n-894 _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt_\b<_\bT_\bG_\b,_\bT_\bL_\b,_\bN_\b>_\b:_\b:_\ba_\bt(const TG& global) const\n-895 {\n-896 // perform a binary search\n-897 int low=0, high=localIndices_.size()-1, probe=-1;\n-898\n-899 while(low\n-918 inline const IndexPair&\n-919 _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt_\b<_\bT_\bG_\b,_\bT_\bL_\b,_\bN_\b>_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b[_\b](const TG& global) const\n-920 {\n-921 // perform a binary search\n-922 int low=0, high=localIndices_.size()-1, probe=-1;\n-923\n-924 while(low\n-936 inline IndexPair& _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt_\b<_\bT_\bG_\b,_\bT_\bL_\b,_\bN_\b>_\b:_\b:_\ba_\bt(const TG& global)\n-937 {\n-938 // perform a binary search\n-939 int low=0, high=localIndices_.size()-1, probe=-1;\n-940\n-941 while(low= global)\n-945 high = probe;\n-946 else\n-947 low = probe+1;\n-948 }\n-949\n-950 if(probe==-1)\n-951 _\bD_\bU_\bN_\bE_\b__\bT_\bH_\bR_\bO_\bW(RangeError, \"No entries!\");\n-952\n-953 if( localIndices_[low].global() != global)\n-954 _\bD_\bU_\bN_\bE_\b__\bT_\bH_\bR_\bO_\bW(RangeError, \"Could not find entry of \"<\n-960 inline bool _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt_\b<_\bT_\bG_\b,_\bT_\bL_\b,_\bN_\b>_\b:_\b:_\be_\bx_\bi_\bs_\bt_\bs (const TG& global) const\n-961 {\n-962 // perform a binary search\n-963 int low=0, high=localIndices_.size()-1, probe=-1;\n-964\n-965 while(low= global)\n-969 high = probe;\n-970 else\n-971 low = probe+1;\n-972 }\n-973\n-974 if(probe==-1)\n-975 return false;\n-976\n-977 if( localIndices_[low].global() != global)\n-978 return false;\n-979 return true;\n-980 }\n-981\n-982 template\n-983 inline IndexPair& _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt_\b<_\bT_\bG_\b,_\bT_\bL_\b,_\bN_\b>_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b[_\b](const TG&\n-global)\n-984 {\n-985 // perform a binary search\n-986 int low=0, high=localIndices_.size()-1, probe=-1;\n-987\n-988 while(low= global)\n-992 high = probe;\n-993 else\n-994 low = probe+1;\n-995 }\n-996\n-997 return localIndices_[low];\n-998 }\n-999 template\n-1000 inline typename ParallelIndexSet::iterator\n-1001 _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt_\b<_\bT_\bG_\b,_\bT_\bL_\b,_\bN_\b>_\b:_\b:_\bb_\be_\bg_\bi_\bn()\n-1002 {\n-1003 return iterator(*this, localIndices_.begin());\n-1004 }\n-1005\n-1006\n-1007 template\n-1008 inline typename ParallelIndexSet::iterator\n-1009 _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt_\b<_\bT_\bG_\b,_\bT_\bL_\b,_\bN_\b>_\b:_\b:_\be_\bn_\bd()\n-1010 {\n-1011 return iterator(*this,localIndices_.end());\n-1012 }\n-1013\n-1014 template\n-1015 inline typename ParallelIndexSet::const_iterator\n-1016 _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt_\b<_\bT_\bG_\b,_\bT_\bL_\b,_\bN_\b>_\b:_\b:_\bb_\be_\bg_\bi_\bn() const\n-1017 {\n-1018 return localIndices_.begin();\n-1019 }\n-1020\n-1021\n-1022 template\n-1023 inline typename ParallelIndexSet::const_iterator\n-1024 _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt_\b<_\bT_\bG_\b,_\bT_\bL_\b,_\bN_\b>_\b:_\b:_\be_\bn_\bd() const\n-1025 {\n-1026 return localIndices_.end();\n-1027 }\n-1028\n-1029 template\n-1030 void _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt_\b<_\bT_\bG_\b,_\bT_\bL_\b,_\bN_\b>_\b:_\b:_\br_\be_\bn_\bu_\bm_\bb_\be_\br_\bL_\bo_\bc_\ba_\bl(){\n-1031#ifndef NDEBUG\n-1032 if(state_==_\bR_\bE_\bS_\bI_\bZ_\bE)\n-1033 _\bD_\bU_\bN_\bE_\b__\bT_\bH_\bR_\bO_\bW(InvalidIndexSetState, \"IndexSet has to be in \"\n-1034 <<\"GROUND state for renumberLocal()\");\n-1035#endif\n-1036\n-1037 const auto end_ = end();\n-1038 uint32_t index=0;\n-1039\n-1040 for(auto pair=begin(); pair!=end_; index++, ++pair)\n-1041 pair->local()=index;\n-1042 }\n-1043\n-1044 template\n-1045 inline int _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt_\b<_\bT_\bG_\b,_\bT_\bL_\b,_\bN_\b>_\b:_\b:_\bs_\be_\bq_\bN_\bo() const\n-1046 {\n-1047 return seqNo_;\n-1048 }\n-1049\n-1050 template\n-1051 inline size_t _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt_\b<_\bT_\bG_\b,_\bT_\bL_\b,_\bN_\b>_\b:_\b:_\bs_\bi_\bz_\be() const\n-1052 {\n-1053 return localIndices_.size();\n-1054 }\n-1055\n-1056 template\n-1057 _\bG_\bl_\bo_\bb_\ba_\bl_\bL_\bo_\bo_\bk_\bu_\bp_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt_\b<_\bI_\b>_\b:_\b:_\bG_\bl_\bo_\bb_\ba_\bl_\bL_\bo_\bo_\bk_\bu_\bp_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt(const I& indexset,\n-1058 std::size_t _\bs_\bi_\bz_\be)\n-1059 : indexSet_(indexset), size_(_\bs_\bi_\bz_\be),\n-1060 indices_(size_, static_cast(0))\n-1061 {\n-1062 const_iterator end_ = indexSet_.end();\n-1063\n-1064 for(const_iterator pair = indexSet_.begin(); pair!=end_; ++pair) {\n-1065 assert(pair->local()local()] = &(*pair);\n-1067 }\n-1068 }\n-1069\n-1070 template\n-1071 _\bG_\bl_\bo_\bb_\ba_\bl_\bL_\bo_\bo_\bk_\bu_\bp_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt_\b<_\bI_\b>_\b:_\b:_\bG_\bl_\bo_\bb_\ba_\bl_\bL_\bo_\bo_\bk_\bu_\bp_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt(const I& indexset)\n-1072 : indexSet_(indexset), size_(0)\n-1073 {\n-1074 const_iterator end_ = indexSet_.end();\n-1075 for(const_iterator pair = indexSet_.begin(); pair!=end_; ++pair)\n-1076 size_=std::max(size_,static_cast(pair->local()));\n-1077\n-1078 indices_.resize(++size_, 0);\n-1079\n-1080 for(const_iterator pair = indexSet_.begin(); pair!=end_; ++pair)\n-1081 indices_[pair->local()] = &(*pair);\n-1082 }\n-1083\n-1084 template\n-1085 _\bG_\bl_\bo_\bb_\ba_\bl_\bL_\bo_\bo_\bk_\bu_\bp_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt_\b<_\bI_\b>_\b:_\b:_\b~_\bG_\bl_\bo_\bb_\ba_\bl_\bL_\bo_\bo_\bk_\bu_\bp_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt()\n-1086 {}\n-1087\n-1088 template\n-1089 inline const IndexPair*\n-1090 _\bG_\bl_\bo_\bb_\ba_\bl_\bL_\bo_\bo_\bk_\bu_\bp_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt_\b<_\bI_\b>_\b:_\b:_\bp_\ba_\bi_\br(const std::size_t& local) const\n-1091 {\n-1092 return indices_[local];\n-1093 }\n-1094\n-1095 template\n-1096 inline const IndexPair&\n-1097 _\bG_\bl_\bo_\bb_\ba_\bl_\bL_\bo_\bo_\bk_\bu_\bp_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt_\b<_\bI_\b>_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b[_\b](const GlobalIndex& global) const\n-1098 {\n-1099 return indexSet_[global];\n-1100 }\n-1101\n-1102 template\n-1103 typename I::const_iterator _\bG_\bl_\bo_\bb_\ba_\bl_\bL_\bo_\bo_\bk_\bu_\bp_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt_\b<_\bI_\b>_\b:_\b:_\bb_\be_\bg_\bi_\bn() const\n-1104 {\n-1105 return indexSet_.begin();\n-1106 }\n-1107\n-1108 template\n-1109 typename I::const_iterator _\bG_\bl_\bo_\bb_\ba_\bl_\bL_\bo_\bo_\bk_\bu_\bp_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt_\b<_\bI_\b>_\b:_\b:_\be_\bn_\bd() const\n-1110 {\n-1111 return indexSet_.end();\n-1112 }\n-1113\n-1114 template\n-1115 inline size_t _\bG_\bl_\bo_\bb_\ba_\bl_\bL_\bo_\bo_\bk_\bu_\bp_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt_\b<_\bI_\b>_\b:_\b:_\bs_\bi_\bz_\be() const\n-1116 {\n-1117 return size_;\n-1118 }\n-1119\n-1120 template\n-1121 inline int _\bG_\bl_\bo_\bb_\ba_\bl_\bL_\bo_\bo_\bk_\bu_\bp_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt_\b<_\bI_\b>_\b:_\b:_\bs_\be_\bq_\bN_\bo() const\n-1122 {\n-1123 return indexSet_.seqNo();\n-1124 }\n-1125\n-1126 template\n-1127 bool _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b=_\b=(const ParallelIndexSet& idxset,\n-1128 const ParallelIndexSet& idxset1)\n-1129 {\n-1130 if(idxset.size()!=idxset1.size())\n-1131 return false;\n-1132 typedef typename ParallelIndexSet::const_iterator Iter;\n-1133 typedef typename _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt_\b<_\bT_\bG_\b1_\b,_\bT_\bL_\b1_\b,_\bN_\b1_\b>_\b:_\b:_\bc_\bo_\bn_\bs_\bt_\b__\bi_\bt_\be_\br_\ba_\bt_\bo_\br Iter1;\n-1134 Iter iter=idxset.begin();\n-1135 for(Iter1 iter1=idxset1.begin(); iter1 != idxset1.end(); ++iter, ++iter1)\n-{\n-1136 if(iter1->global()!=iter->global())\n-1137 return false;\n-1138 typedef typename ParallelIndexSet::LocalIndex PI;\n-1139 const PI& pi=iter->local(), pi1=iter1->local();\n-1140\n-1141 if(pi!=pi1)\n-1142 return false;\n-1143 }\n-1144 return true;\n-1145 }\n-1146\n-1147 template\n-1148 bool _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b!_\b=(const ParallelIndexSet& idxset,\n-1149 const ParallelIndexSet& idxset1)\n-1150 {\n-1151 return !(idxset==idxset1);\n-1152 }\n-1153\n-1154\n-1155#endif // DOXYGEN\n-1156\n-1157}\n-1158\n-1159#endif // DUNE_COMMON_PARALLEL_INDEXSET_HH\n-_\bl_\bo_\bc_\ba_\bl_\bi_\bn_\bd_\be_\bx_\b._\bh_\bh\n-Provides classes for use as the local index in ParallelIndexSet.\n-_\bm_\bp_\bi_\bt_\br_\ba_\bi_\bt_\bs_\b._\bh_\bh\n-Traits classes for mapping types onto MPI_Datatype.\n-_\ba_\br_\br_\ba_\by_\bl_\bi_\bs_\bt_\b._\bh_\bh\n-Implements a random-access container that can efficiently change size (similar\n-to std::deque)\n-_\be_\bx_\bc_\be_\bp_\bt_\bi_\bo_\bn_\bs_\b._\bh_\bh\n-A few common exception classes.\n-_\bD_\bu_\bn_\be_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b<_\b<\n-std::ostream & operator<<(std::ostream &s, const bigunsignedint< k > &x)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bigunsignedint.hh:278\n-_\bD_\bU_\bN_\bE_\b__\bT_\bH_\bR_\bO_\bW\n-#define DUNE_THROW(E, m)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn exceptions.hh:218\n-_\bD_\bu_\bn_\be_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b<\n-EnableIfInterOperable< T1, T2, bool >::type operator<(const\n-RandomAccessIteratorFacade< T1, V1, R1, D > &lhs, const\n-RandomAccessIteratorFacade< T2, V2, R2, D > &rhs)\n-Comparison operator.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn iteratorfacades.hh:638\n-_\bD_\bu_\bn_\be_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b>\n-EnableIfInterOperable< T1, T2, bool >::type operator>(const\n-RandomAccessIteratorFacade< T1, V1, R1, D > &lhs, const\n-RandomAccessIteratorFacade< T2, V2, R2, D > &rhs)\n-Comparison operator.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn iteratorfacades.hh:684\n-_\bD_\bu_\bn_\be_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b<_\b=\n-EnableIfInterOperable< T1, T2, bool >::type operator<=(const\n-RandomAccessIteratorFacade< T1, V1, R1, D > &lhs, const\n-RandomAccessIteratorFacade< T2, V2, R2, D > &rhs)\n-Comparison operator.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn iteratorfacades.hh:661\n-_\bD_\bu_\bn_\be_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b=_\b=\n-EnableIfInterOperable< T1, T2, bool >::type operator==(const\n-ForwardIteratorFacade< T1, V1, R1, D > &lhs, const ForwardIteratorFacade< T2,\n-V2, R2, D > &rhs)\n-Checks for equality.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn iteratorfacades.hh:238\n-_\bD_\bu_\bn_\be_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b>_\b=\n-EnableIfInterOperable< T1, T2, bool >::type operator>=(const\n-RandomAccessIteratorFacade< T1, V1, R1, D > &lhs, const\n-RandomAccessIteratorFacade< T2, V2, R2, D > &rhs)\n-Comparison operator.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn iteratorfacades.hh:706\n-_\bD_\bu_\bn_\be_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b!_\b=\n-EnableIfInterOperable< T1, T2, bool >::type operator!=(const\n-ForwardIteratorFacade< T1, V1, R1, D > &lhs, const ForwardIteratorFacade< T2,\n-V2, R2, D > &rhs)\n-Checks for inequality.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn iteratorfacades.hh:260\n-_\bD_\bu_\bn_\be_\b:_\b:_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b[_\b]\n-IndexPair & operator[](const GlobalIndex &global)\n-Find the index pair with a specific global id.\n-_\bD_\bu_\bn_\be_\b:_\b:_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt_\b:_\b:_\ba_\br_\br_\ba_\by_\bS_\bi_\bz_\be\n-static constexpr int arraySize\n-The size of the individual arrays in the underlying ArrayList.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn indexset.hh:252\n-_\bD_\bu_\bn_\be_\b:_\b:_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt_\b:_\b:_\bb_\be_\bg_\bi_\bn_\bR_\be_\bs_\bi_\bz_\be\n-void beginResize()\n-Indicate that the index set is to be resized.\n-_\bD_\bu_\bn_\be_\b:_\b:_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt_\bS_\bt_\ba_\bt_\be\n-ParallelIndexSetState\n-The states the index set can be in.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn indexset.hh:181\n-_\bD_\bu_\bn_\be_\b:_\b:_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt_\b:_\b:_\br_\be_\bn_\bu_\bm_\bb_\be_\br_\bL_\bo_\bc_\ba_\bl\n-void renumberLocal()\n-Renumbers the local index numbers.\n-_\bD_\bu_\bn_\be_\b:_\b:_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt_\b:_\b:_\be_\bx_\bi_\bs_\bt_\bs\n-bool exists(const GlobalIndex &global) const\n-Find the index pair with a specific global id.\n-_\bD_\bu_\bn_\be_\b:_\b:_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt_\b:_\b:_\bs_\bi_\bz_\be\n-size_t size() const\n-Get the total number (public and nonpublic) indices.\n-_\bD_\bu_\bn_\be_\b:_\b:_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt_\b:_\b:_\bc_\bo_\bn_\bs_\bt_\b__\bi_\bt_\be_\br_\ba_\bt_\bo_\br\n-ArrayList< IndexPair, N >::const_iterator const_iterator\n-The constant iterator over the pairs.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn indexset.hh:296\n-_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt_\bS_\bo_\br_\bt_\bF_\bu_\bn_\bc_\bt_\bo_\br_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b(_\b)\n-bool operator()(const IndexPair< TG, TL > &i1, const IndexPair< TG, TL > &i2)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn indexset.hh:625\n-_\bD_\bu_\bn_\be_\b:_\b:_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt_\b:_\b:_\ba_\bd_\bd\n-void add(const GlobalIndex &global)\n-Add an new index to the set.\n-_\bD_\bu_\bn_\be_\b:_\b:_\bG_\bl_\bo_\bb_\ba_\bl_\bL_\bo_\bo_\bk_\bu_\bp_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt_\b:_\b:_\be_\bn_\bd\n-const_iterator end() const\n-Get an iterator over the indices positioned after the last index.\n-_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bd_\be_\bx_\bP_\ba_\bi_\br_\b:_\b:_\bl_\bo_\bc_\ba_\bl\n-const LocalIndex & local() const\n-Get the local index.\n-_\bD_\bu_\bn_\be_\b:_\b:_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt_\b:_\b:_\ba_\bt\n-const IndexPair & at(const GlobalIndex &global) const\n-Find the index pair with a specific global id.\n-_\bD_\bu_\bn_\be_\b:_\b:_\bG_\bl_\bo_\bb_\ba_\bl_\bL_\bo_\bo_\bk_\bu_\bp_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt_\b:_\b:_\bG_\bl_\bo_\bb_\ba_\bl_\bL_\bo_\bo_\bk_\bu_\bp_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt\n-GlobalLookupIndexSet(const ParallelIndexSet &indexset)\n-Constructor.\n-_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bd_\be_\bx_\bP_\ba_\bi_\br_\b:_\b:_\bL_\bo_\bc_\ba_\bl_\bI_\bn_\bd_\be_\bx\n-TL LocalIndex\n-the type of the local index.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn indexset.hh:120\n-_\bD_\bu_\bn_\be_\b:_\b:_\bG_\bl_\bo_\bb_\ba_\bl_\bL_\bo_\bo_\bk_\bu_\bp_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt_\b:_\b:_\bs_\be_\bq_\bN_\bo\n-int seqNo() const\n-Get the internal sequence number.\n-_\bD_\bu_\bn_\be_\b:_\b:_\bL_\bo_\bc_\ba_\bl_\bI_\bn_\bd_\be_\bx_\bC_\bo_\bm_\bp_\ba_\br_\ba_\bt_\bo_\br_\b:_\b:_\bc_\bo_\bm_\bp_\ba_\br_\be\n-static bool compare(const T &t1, const T &t2)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn indexset.hh:616\n-_\bD_\bu_\bn_\be_\b:_\b:_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt_\b:_\b:_\bb_\be_\bg_\bi_\bn\n-iterator begin()\n-Get an iterator over the indices positioned at the first index.\n-_\bD_\bu_\bn_\be_\b:_\b:_\bG_\bl_\bo_\bb_\ba_\bl_\bL_\bo_\bo_\bk_\bu_\bp_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt_\b:_\b:_\bI_\bn_\bd_\be_\bx_\bP_\ba_\bi_\br\n-Dune::IndexPair< typename I::GlobalIndex, typename I::LocalIndex > IndexPair\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn indexset.hh:529\n-_\bD_\bu_\bn_\be_\b:_\b:_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt_\b:_\b:_\be_\bn_\bd\n-iterator end()\n-Get an iterator over the indices positioned after the last index.\n-_\bD_\bu_\bn_\be_\b:_\b:_\bG_\bl_\bo_\bb_\ba_\bl_\bL_\bo_\bo_\bk_\bu_\bp_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt_\b:_\b:_\bc_\bo_\bn_\bs_\bt_\b__\bi_\bt_\be_\br_\ba_\bt_\bo_\br\n-ParallelIndexSet::const_iterator const_iterator\n-The iterator over the index pairs.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn indexset.hh:527\n-_\bD_\bu_\bn_\be_\b:_\b:_\bG_\bl_\bo_\bb_\ba_\bl_\bL_\bo_\bo_\bk_\bu_\bp_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt_\b:_\b:_\bb_\be_\bg_\bi_\bn\n-const_iterator begin() const\n-Get an iterator over the indices positioned at the first index.\n-_\bD_\bu_\bn_\be_\b:_\b:_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b[_\b]\n-const IndexPair & operator[](const GlobalIndex &global) const\n-Find the index pair with a specific global id.\n-_\bD_\bu_\bn_\be_\b:_\b:_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt_\b:_\b:_\bs_\bt_\ba_\bt_\be\n-const ParallelIndexSetState & state()\n-Get the state the index set is in.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn indexset.hh:307\n-_\bD_\bu_\bn_\be_\b:_\b:_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt_\b:_\b:_\bb_\be_\bg_\bi_\bn\n-const_iterator begin() const\n-Get an iterator over the indices positioned at the first index.\n-_\bD_\bu_\bn_\be_\b:_\b:_\bG_\bl_\bo_\bb_\ba_\bl_\bL_\bo_\bo_\bk_\bu_\bp_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b[_\b]\n-const IndexPair & operator[](const GlobalIndex &global) const\n-Find the index pair with a specific global id.\n-_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bd_\be_\bx_\bP_\ba_\bi_\br_\b:_\b:_\bI_\bn_\bd_\be_\bx_\bP_\ba_\bi_\br\n-IndexPair()\n-Construct a new Pair.\n-_\bD_\bu_\bn_\be_\b:_\b:_\bG_\bl_\bo_\bb_\ba_\bl_\bL_\bo_\bo_\bk_\bu_\bp_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt_\b:_\b:_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt\n-I ParallelIndexSet\n-The type of the index set.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn indexset.hh:512\n-_\bD_\bu_\bn_\be_\b:_\b:_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt_\b:_\b:_\bL_\bo_\bc_\ba_\bl_\bI_\bn_\bd_\be_\bx\n-TL LocalIndex\n-The type of the local index, e.g. ParallelLocalIndex.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn indexset.hh:239\n-_\bD_\bu_\bn_\be_\b:_\b:_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt_\b:_\b:_\bm_\ba_\br_\bk_\bA_\bs_\bD_\be_\bl_\be_\bt_\be_\bd\n-void markAsDeleted(const iterator &position)\n-Mark an index as deleted.\n-_\bD_\bu_\bn_\be_\b:_\b:_\bG_\bl_\bo_\bb_\ba_\bl_\bL_\bo_\bo_\bk_\bu_\bp_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt_\b:_\b:_\bL_\bo_\bc_\ba_\bl_\bI_\bn_\bd_\be_\bx\n-ParallelIndexSet::LocalIndex LocalIndex\n-The type of the local index.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn indexset.hh:517\n-_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bd_\be_\bx_\bP_\ba_\bi_\br_\b:_\b:_\bI_\bn_\bd_\be_\bx_\bP_\ba_\bi_\br\n-IndexPair(const GlobalIndex &global, const LocalIndex &local)\n-Constructs a new Pair.\n-_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bd_\be_\bx_\bP_\ba_\bi_\br_\b:_\b:_\bs_\be_\bt_\bL_\bo_\bc_\ba_\bl\n-void setLocal(int index)\n-Set the local index.\n-_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bd_\be_\bx_\bP_\ba_\bi_\br_\b:_\b:_\bg_\bl_\bo_\bb_\ba_\bl\n-const GlobalIndex & global() const\n-Get the global index.\n-_\bD_\bu_\bn_\be_\b:_\b:_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt_\b:_\b:_\ba_\bd_\bd\n-void add(const GlobalIndex &global, const LocalIndex &local)\n-Add an new index to the set.\n-_\bD_\bu_\bn_\be_\b:_\b:_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt_\b:_\b:_\be_\bn_\bd\n-const_iterator end() const\n-Get an iterator over the indices positioned after the last index.\n-_\bD_\bu_\bn_\be_\b:_\b:_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt_\b:_\b:_\ba_\bt\n-IndexPair & at(const GlobalIndex &global)\n-Find the index pair with a specific global id.\n-_\bD_\bu_\bn_\be_\b:_\b:_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt_\b:_\b:_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt\n-ParallelIndexSet()\n-Constructor.\n-_\bD_\bu_\bn_\be_\b:_\b:_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt_\b:_\b:_\be_\bn_\bd_\bR_\be_\bs_\bi_\bz_\be\n-void endResize()\n-Indicate that the resizing finishes.\n-_\bD_\bu_\bn_\be_\b:_\b:_\bG_\bl_\bo_\bb_\ba_\bl_\bL_\bo_\bo_\bk_\bu_\bp_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt_\b:_\b:_\b~_\bG_\bl_\bo_\bb_\ba_\bl_\bL_\bo_\bo_\bk_\bu_\bp_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt\n-~GlobalLookupIndexSet()\n-Destructor.\n-_\bD_\bu_\bn_\be_\b:_\b:_\bG_\bl_\bo_\bb_\ba_\bl_\bL_\bo_\bo_\bk_\bu_\bp_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt_\b:_\b:_\bp_\ba_\bi_\br\n-const IndexPair * pair(const std::size_t &local) const\n-Get the index pair corresponding to a local index.\n-_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bd_\be_\bx_\bP_\ba_\bi_\br_\b:_\b:_\bl_\bo_\bc_\ba_\bl\n-LocalIndex & local()\n-Get the local index.\n-_\bD_\bu_\bn_\be_\b:_\b:_\bG_\bl_\bo_\bb_\ba_\bl_\bL_\bo_\bo_\bk_\bu_\bp_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt_\b:_\b:_\bs_\bi_\bz_\be\n-size_t size() const\n-Get the total number (public and nonpublic) indices.\n-_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bd_\be_\bx_\bP_\ba_\bi_\br_\b:_\b:_\bI_\bn_\bd_\be_\bx_\bP_\ba_\bi_\br\n-IndexPair(const GlobalIndex &global)\n-Constructs a new Pair.\n-_\bD_\bu_\bn_\be_\b:_\b:_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt_\b:_\b:_\bG_\bl_\bo_\bb_\ba_\bl_\bI_\bn_\bd_\be_\bx\n-TG GlobalIndex\n-the type of the global index. This type has to provide at least a operator< for\n-sorting.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn indexset.hh:226\n-_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bd_\be_\bx_\bP_\ba_\bi_\br_\b:_\b:_\bG_\bl_\bo_\bb_\ba_\bl_\bI_\bn_\bd_\be_\bx\n-TG GlobalIndex\n-the type of the global index.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn indexset.hh:107\n-_\bD_\bu_\bn_\be_\b:_\b:_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt_\b:_\b:_\bs_\be_\bq_\bN_\bo\n-int seqNo() const\n-Get the internal sequence number.\n-_\bD_\bu_\bn_\be_\b:_\b:_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt_\b:_\b:_\bi_\bt_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\bi_\bt_\be_\br_\ba_\bt_\bo_\br\n-iterator(ParallelIndexSet< TG, TL, N > &indexSet, const Father &father)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn indexset.hh:262\n-_\bD_\bu_\bn_\be_\b:_\b:_\bG_\bl_\bo_\bb_\ba_\bl_\bL_\bo_\bo_\bk_\bu_\bp_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt_\b:_\b:_\bG_\bl_\bo_\bb_\ba_\bl_\bL_\bo_\bo_\bk_\bu_\bp_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt\n-GlobalLookupIndexSet(const ParallelIndexSet &indexset, std::size_t size)\n-Constructor.\n-_\bD_\bu_\bn_\be_\b:_\b:_\bG_\bl_\bo_\bb_\ba_\bl_\bL_\bo_\bo_\bk_\bu_\bp_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt_\b:_\b:_\bG_\bl_\bo_\bb_\ba_\bl_\bI_\bn_\bd_\be_\bx\n-ParallelIndexSet::GlobalIndex GlobalIndex\n-The type of the global index.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn indexset.hh:522\n-_\bD_\bu_\bn_\be_\b:_\b:_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt_\b:_\b:_\bI_\bn_\bd_\be_\bx_\bP_\ba_\bi_\br\n-Dune::IndexPair< GlobalIndex, LocalIndex > IndexPair\n-The type of the pair stored.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn indexset.hh:244\n-_\bD_\bu_\bn_\be_\b:_\b:_\bR_\bE_\bS_\bI_\bZ_\bE\n-@ RESIZE\n-Indicates that the index set is currently being resized.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn indexset.hh:190\n-_\bD_\bu_\bn_\be_\b:_\b:_\bG_\bR_\bO_\bU_\bN_\bD\n-@ GROUND\n-The default mode. Indicates that the index set is ready to be used.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn indexset.hh:186\n-_\bD_\bu_\bn_\be_\b:_\b:_\bD_\bE_\bL_\bE_\bT_\bE_\bD\n-@ DELETED\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn localindex.hh:28\n+_\b2_\b6_\b7 constexpr _\bc_\bo_\bn_\bs_\bt_\b__\br_\be_\bv_\be_\br_\bs_\be_\b__\bi_\bt_\be_\br_\ba_\bt_\bo_\br _\bc_\br_\bb_\be_\bg_\bi_\bn() const noexcept\n+268 {\n+269 return _\bc_\bo_\bn_\bs_\bt_\b__\br_\be_\bv_\be_\br_\bs_\be_\b__\bi_\bt_\be_\br_\ba_\bt_\bo_\br{_\bb_\be_\bg_\bi_\bn()+_\bs_\bi_\bz_\be()};\n+270 }\n+271\n+_\b2_\b7_\b3 constexpr _\bi_\bt_\be_\br_\ba_\bt_\bo_\br _\be_\bn_\bd() noexcept\n+274 {\n+275 return storage_.begin()+_\bs_\bi_\bz_\be();\n+276 }\n+277\n+_\b2_\b7_\b9 constexpr _\bc_\bo_\bn_\bs_\bt_\b__\bi_\bt_\be_\br_\ba_\bt_\bo_\br _\be_\bn_\bd() const noexcept\n+280 {\n+281 return storage_.begin()+_\bs_\bi_\bz_\be();\n+282 }\n+283\n+_\b2_\b8_\b5 constexpr _\bc_\bo_\bn_\bs_\bt_\b__\bi_\bt_\be_\br_\ba_\bt_\bo_\br _\bc_\be_\bn_\bd() const noexcept\n+286 {\n+287 return storage_.cbegin()+_\bs_\bi_\bz_\be();\n+288 }\n+289\n+_\b2_\b9_\b1 constexpr _\br_\be_\bv_\be_\br_\bs_\be_\b__\bi_\bt_\be_\br_\ba_\bt_\bo_\br _\br_\be_\bn_\bd() noexcept\n+292 {\n+293 return _\br_\be_\bv_\be_\br_\bs_\be_\b__\bi_\bt_\be_\br_\ba_\bt_\bo_\br{_\bb_\be_\bg_\bi_\bn()};\n+294 }\n+295\n+_\b2_\b9_\b7 constexpr _\bc_\bo_\bn_\bs_\bt_\b__\br_\be_\bv_\be_\br_\bs_\be_\b__\bi_\bt_\be_\br_\ba_\bt_\bo_\br _\br_\be_\bn_\bd() const noexcept\n+298 {\n+299 return _\bc_\bo_\bn_\bs_\bt_\b__\br_\be_\bv_\be_\br_\bs_\be_\b__\bi_\bt_\be_\br_\ba_\bt_\bo_\br{_\bb_\be_\bg_\bi_\bn()};\n+300 }\n+301\n+_\b3_\b0_\b3 constexpr _\bc_\bo_\bn_\bs_\bt_\b__\br_\be_\bv_\be_\br_\bs_\be_\b__\bi_\bt_\be_\br_\ba_\bt_\bo_\br _\bc_\br_\be_\bn_\bd() const noexcept\n+304 {\n+305 return _\bc_\bo_\bn_\bs_\bt_\b__\br_\be_\bv_\be_\br_\bs_\be_\b__\bi_\bt_\be_\br_\ba_\bt_\bo_\br{_\bb_\be_\bg_\bi_\bn()};\n+306 }\n+307\n+_\b3_\b1_\b3 constexpr _\br_\be_\bf_\be_\br_\be_\bn_\bc_\be _\ba_\bt(_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be i)\n+314 {\n+315 if (!(i < _\bs_\bi_\bz_\be()))\n+316 throw std::out_of_range(\"Index out of range\");\n+317 return storage_[i];\n+318 }\n+319\n+_\b3_\b2_\b1 constexpr _\bc_\bo_\bn_\bs_\bt_\b__\br_\be_\bf_\be_\br_\be_\bn_\bc_\be _\ba_\bt(_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be i) const\n+322 {\n+323 if (!(i < _\bs_\bi_\bz_\be()))\n+324 throw std::out_of_range(\"Index out of range\");\n+325 return storage_[i];\n+326 }\n+327\n+_\b3_\b2_\b9 constexpr _\br_\be_\bf_\be_\br_\be_\bn_\bc_\be _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b[_\b]_\b (_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be i) noexcept\n+330 {\n+331 _\bC_\bH_\bE_\bC_\bK_\bS_\bI_\bZ_\bE(size_>i);\n+332 return storage_[i];\n+333 }\n+334\n+_\b3_\b3_\b6 constexpr _\bc_\bo_\bn_\bs_\bt_\b__\br_\be_\bf_\be_\br_\be_\bn_\bc_\be _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b[_\b]_\b (_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be i) const noexcept\n+337 {\n+338 _\bC_\bH_\bE_\bC_\bK_\bS_\bI_\bZ_\bE(size_>i);\n+339 return storage_[i];\n+340 }\n+341\n+_\b3_\b4_\b3 constexpr _\br_\be_\bf_\be_\br_\be_\bn_\bc_\be _\bf_\br_\bo_\bn_\bt() noexcept\n+344 {\n+345 _\bC_\bH_\bE_\bC_\bK_\bS_\bI_\bZ_\bE(size_>0);\n+346 return storage_[0];\n+347 }\n+348\n+_\b3_\b5_\b0 constexpr _\bc_\bo_\bn_\bs_\bt_\b__\br_\be_\bf_\be_\br_\be_\bn_\bc_\be _\bf_\br_\bo_\bn_\bt() const noexcept\n+351 {\n+352 _\bC_\bH_\bE_\bC_\bK_\bS_\bI_\bZ_\bE(size_>0);\n+353 return storage_[0];\n+354 }\n+355\n+_\b3_\b5_\b7 constexpr _\br_\be_\bf_\be_\br_\be_\bn_\bc_\be _\bb_\ba_\bc_\bk() noexcept\n+358 {\n+359 _\bC_\bH_\bE_\bC_\bK_\bS_\bI_\bZ_\bE(size_>0);\n+360 return storage_[size_-1];\n+361 }\n+362\n+_\b3_\b6_\b4 constexpr _\bc_\bo_\bn_\bs_\bt_\b__\br_\be_\bf_\be_\br_\be_\bn_\bc_\be _\bb_\ba_\bc_\bk() const noexcept\n+365 {\n+366 _\bC_\bH_\bE_\bC_\bK_\bS_\bI_\bZ_\bE(size_>0);\n+367 return storage_[size_-1];\n+368 }\n+369\n+_\b3_\b7_\b1 constexpr _\bp_\bo_\bi_\bn_\bt_\be_\br _\bd_\ba_\bt_\ba() noexcept\n+372 {\n+373 return storage_.data();\n+374 }\n+375\n+_\b3_\b7_\b7 constexpr _\bc_\bo_\bn_\bs_\bt_\b__\bp_\bo_\bi_\bn_\bt_\be_\br _\bd_\ba_\bt_\ba() const noexcept\n+378 {\n+379 return storage_.data();\n+380 }\n+381\n+_\b3_\b8_\b7 constexpr _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be _\bs_\bi_\bz_\be() const noexcept\n+388 {\n+389 return size_;\n+390 }\n+391\n+_\b3_\b9_\b3 constexpr bool _\be_\bm_\bp_\bt_\by() const noexcept\n+394 {\n+395 return size_==0;\n+396 }\n+397\n+_\b3_\b9_\b9 static constexpr _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be _\bc_\ba_\bp_\ba_\bc_\bi_\bt_\by() noexcept\n+400 {\n+401 return n;\n+402 }\n+403\n+_\b4_\b0_\b5 static constexpr _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be _\bm_\ba_\bx_\b__\bs_\bi_\bz_\be() noexcept\n+406 {\n+407 return n;\n+408 }\n+409\n+_\b4_\b1_\b5 constexpr void _\bf_\bi_\bl_\bl(const _\bv_\ba_\bl_\bu_\be_\b__\bt_\by_\bp_\be& value)\n+416 noexcept(std::is_nothrow_copy_assignable_v)\n+417 {\n+418 for (_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be i=0; i<_\bs_\bi_\bz_\be(); ++i)\n+419 storage_[i] = value;\n+420 }\n+421\n+_\b4_\b2_\b3 void _\bs_\bw_\ba_\bp(_\bR_\be_\bs_\be_\br_\bv_\be_\bd_\bV_\be_\bc_\bt_\bo_\br& other)\n+424 noexcept(std::is_nothrow_swappable_v)\n+425 {\n+426 using std::swap;\n+427 _\bs_\bw_\ba_\bp(storage_, other.storage_);\n+428 _\bs_\bw_\ba_\bp(size_, other.size_);\n+429 }\n+430\n+_\b4_\b3_\b4 friend std::ostream& _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b<_\b<_\b (std::ostream& s, const _\bR_\be_\bs_\be_\br_\bv_\be_\bd_\bV_\be_\bc_\bt_\bo_\br& v)\n+435 {\n+436 for (_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be i=0; i))\n+454\n+455#undef CHECKSIZE\n+456\n+457#endif // DUNE_COMMON_RESERVEDVECTOR_HH\n+_\bC_\bH_\bE_\bC_\bK_\bS_\bI_\bZ_\bE\n+#define CHECKSIZE(X)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn reservedvector.hh:25\n+_\bh_\ba_\bs_\bh_\b._\bh_\bh\n+Support for calculating hash values of objects.\n+_\bD_\bU_\bN_\bE_\b__\bD_\bE_\bF_\bI_\bN_\bE_\b__\bH_\bA_\bS_\bH\n+#define DUNE_DEFINE_HASH(template_args, type)\n+Defines the required struct specialization to make type hashable via Dune::\n+hash.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn hash.hh:100\n+_\bD_\bU_\bN_\bE_\b__\bH_\bA_\bS_\bH_\b__\bT_\bY_\bP_\bE\n+#define DUNE_HASH_TYPE(...)\n+Wrapper macro for the type to be hashed in DUNE_DEFINE_HASH.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn hash.hh:117\n+_\bD_\bU_\bN_\bE_\b__\bH_\bA_\bS_\bH_\b__\bT_\bE_\bM_\bP_\bL_\bA_\bT_\bE_\b__\bA_\bR_\bG_\bS\n+#define DUNE_HASH_TEMPLATE_ARGS(...)\n+Wrapper macro for the template arguments in DUNE_DEFINE_HASH.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn hash.hh:109\n+_\bs_\bt_\bd\n+STL namespace.\n _\bD_\bu_\bn_\be\n Dune namespace.\n D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn alignedallocator.hh:13\n-_\bD_\bu_\bn_\be_\b:_\b:_\bs_\bi_\bz_\be\n-constexpr std::integral_constant< std::size_t, sizeof...(II)> size(std::\n-integer_sequence< T, II... >)\n-Return the size of the sequence.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn integersequence.hh:75\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\br_\br_\ba_\by_\bL_\bi_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br\n-A random access iterator for the Dune::ArrayList class.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn arraylist.hh:255\n-_\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bn_\bs_\bt_\bA_\br_\br_\ba_\by_\bL_\bi_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br\n-A constant random access iterator for the Dune::ArrayList class.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn arraylist.hh:368\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\br_\br_\ba_\by_\bL_\bi_\bs_\bt\n-A dynamically growing random access list.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn arraylist.hh:62\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\br_\br_\ba_\by_\bL_\bi_\bs_\bt_\b:_\b:_\bc_\bo_\bn_\bs_\bt_\b__\bi_\bt_\be_\br_\ba_\bt_\bo_\br\n-ConstArrayListIterator< MemberType, N, A > const_iterator\n-A constant random access iterator.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn arraylist.hh:110\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\bP_\bI_\bT_\br_\ba_\bi_\bt_\bs\n-A traits class describing the mapping of types onto MPI_Datatypes.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mpitraits.hh:41\n-_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bv_\ba_\bl_\bi_\bd_\bS_\bt_\ba_\bt_\be_\bE_\bx_\bc_\be_\bp_\bt_\bi_\bo_\bn\n-Default exception if a function was called while the object is not in a valid\n-state for that function...\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn exceptions.hh:281\n-_\bD_\bu_\bn_\be_\b:_\b:_\bR_\ba_\bn_\bd_\bo_\bm_\bA_\bc_\bc_\be_\bs_\bs_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bF_\ba_\bc_\ba_\bd_\be_\b<_\b _\bA_\br_\br_\ba_\by_\bL_\bi_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b<_\b _\bT_\b,_\b _\bN_\b,_\b _\bA_\b _\b>_\b,_\b _\bA_\b:_\b:_\bv_\ba_\bl_\bu_\be_\b__\bt_\by_\bp_\be_\b,\n-_\bA_\b:_\b:_\bv_\ba_\bl_\bu_\be_\b__\bt_\by_\bp_\be_\b _\b&_\b,_\b _\bA_\b:_\b:_\bd_\bi_\bf_\bf_\be_\br_\be_\bn_\bc_\be_\b__\bt_\by_\bp_\be_\b _\b>_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b*\n-Reference operator*() const\n-Dereferencing operator.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn iteratorfacades.hh:501\n-_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bd_\be_\bx_\bP_\ba_\bi_\br\n-A pair consisting of a global and local index.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn indexset.hh:85\n-_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bv_\ba_\bl_\bi_\bd_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt_\bS_\bt_\ba_\bt_\be\n-Exception indicating that the index set is not in the expected state.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn indexset.hh:205\n-_\bD_\bu_\bn_\be_\b:_\b:_\bG_\bl_\bo_\bb_\ba_\bl_\bL_\bo_\bo_\bk_\bu_\bp_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt\n-Decorates an index set with the possibility to find a global index that is\n-mapped to a specific local...\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn indexset.hh:507\n-_\bD_\bu_\bn_\be_\b:_\b:_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt\n-Manager class for the mapping between local indices and globally unique\n-indices.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn indexset.hh:218\n-_\bD_\bu_\bn_\be_\b:_\b:_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt_\b:_\b:_\bi_\bt_\be_\br_\ba_\bt_\bo_\br\n-The iterator over the pairs.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn indexset.hh:257\n-_\bD_\bu_\bn_\be_\b:_\b:_\bL_\bo_\bc_\ba_\bl_\bI_\bn_\bd_\be_\bx_\bC_\bo_\bm_\bp_\ba_\br_\ba_\bt_\bo_\br\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn indexset.hh:615\n-_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt_\bS_\bo_\br_\bt_\bF_\bu_\bn_\bc_\bt_\bo_\br\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn indexset.hh:624\n+_\bD_\bu_\bn_\be_\b:_\b:_\bh_\ba_\bs_\bh_\b__\br_\ba_\bn_\bg_\be\n+std::size_t hash_range(It first, It last)\n+Hashes all elements in the range [first,last) and returns the combined hash.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn hash.hh:322\n+_\bD_\bu_\bn_\be_\b:_\b:_\bR_\be_\bs_\be_\br_\bv_\be_\bd_\bV_\be_\bc_\bt_\bo_\br\n+A Vector class with statically reserved memory.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn reservedvector.hh:47\n+_\bD_\bu_\bn_\be_\b:_\b:_\bR_\be_\bs_\be_\br_\bv_\be_\bd_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\bf_\br_\bo_\bn_\bt\n+constexpr const_reference front() const noexcept\n+Returns const reference to first element of vector.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn reservedvector.hh:350\n+_\bD_\bu_\bn_\be_\b:_\b:_\bR_\be_\bs_\be_\br_\bv_\be_\bd_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\bc_\br_\be_\bn_\bd\n+constexpr const_reverse_iterator crend() const noexcept\n+Returns a const reverse-iterator pointing to the begin of the vector.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn reservedvector.hh:303\n+_\bD_\bu_\bn_\be_\b:_\b:_\bR_\be_\bs_\be_\br_\bv_\be_\bd_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\bR_\be_\bs_\be_\br_\bv_\be_\bd_\bV_\be_\bc_\bt_\bo_\br\n+constexpr ReservedVector(size_type count) noexcept(std::\n+is_nothrow_default_constructible_v< value_type >)\n+Constructs the vector with count elements that will be default-initialized.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn reservedvector.hh:89\n+_\bD_\bu_\bn_\be_\b:_\b:_\bR_\be_\bs_\be_\br_\bv_\be_\bd_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\bf_\bi_\bl_\bl\n+constexpr void fill(const value_type &value) noexcept(std::\n+is_nothrow_copy_assignable_v< value_type >)\n+Fill the container with the value.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn reservedvector.hh:415\n+_\bD_\bu_\bn_\be_\b:_\b:_\bR_\be_\bs_\be_\br_\bv_\be_\bd_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\bp_\bo_\bi_\bn_\bt_\be_\br\n+storage_type::pointer pointer\n+Pointer to T.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn reservedvector.hh:57\n+_\bD_\bu_\bn_\be_\b:_\b:_\bR_\be_\bs_\be_\br_\bv_\be_\bd_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\br_\bb_\be_\bg_\bi_\bn\n+constexpr reverse_iterator rbegin() noexcept\n+Returns a const reverse-iterator pointing to the end of the vector.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn reservedvector.hh:255\n+_\bD_\bu_\bn_\be_\b:_\b:_\bR_\be_\bs_\be_\br_\bv_\be_\bd_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b<_\b=\n+constexpr bool operator<=(const ReservedVector &that) const noexcept\n+Lexicographically compares the values in the vector this with that\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn reservedvector.hh:165\n+_\bD_\bu_\bn_\be_\b:_\b:_\bR_\be_\bs_\be_\br_\bv_\be_\bd_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b>\n+constexpr bool operator>(const ReservedVector &that) const noexcept\n+Lexicographically compares the values in the vector this with that\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn reservedvector.hh:159\n+_\bD_\bu_\bn_\be_\b:_\b:_\bR_\be_\bs_\be_\br_\bv_\be_\bd_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\br_\be_\bn_\bd\n+constexpr const_reverse_iterator rend() const noexcept\n+Returns a const reverse-iterator pointing to the begin of the vector.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn reservedvector.hh:297\n+_\bD_\bu_\bn_\be_\b:_\b:_\bR_\be_\bs_\be_\br_\bv_\be_\bd_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\bm_\ba_\bx_\b__\bs_\bi_\bz_\be\n+static constexpr size_type max_size() noexcept\n+Returns the maximum length of the vector.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn reservedvector.hh:405\n+_\bD_\bu_\bn_\be_\b:_\b:_\bR_\be_\bs_\be_\br_\bv_\be_\bd_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\ba_\bt\n+constexpr const_reference at(size_type i) const\n+Returns a const reference to the i'th element.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn reservedvector.hh:321\n+_\bD_\bu_\bn_\be_\b:_\b:_\bR_\be_\bs_\be_\br_\bv_\be_\bd_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\br_\be_\bv_\be_\br_\bs_\be_\b__\bi_\bt_\be_\br_\ba_\bt_\bo_\br\n+std::reverse_iterator< iterator > reverse_iterator\n+Reverse iterator.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn reservedvector.hh:73\n+_\bD_\bu_\bn_\be_\b:_\b:_\bR_\be_\bs_\be_\br_\bv_\be_\bd_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\be_\bn_\bd\n+constexpr iterator end() noexcept\n+Returns an iterator pointing to the end of the vector.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn reservedvector.hh:273\n+_\bD_\bu_\bn_\be_\b:_\b:_\bR_\be_\bs_\be_\br_\bv_\be_\bd_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b<\n+constexpr bool operator<(const ReservedVector &that) const noexcept\n+Lexicographically compares the values in the vector this with that\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn reservedvector.hh:149\n+_\bD_\bu_\bn_\be_\b:_\b:_\bR_\be_\bs_\be_\br_\bv_\be_\bd_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\bs_\bi_\bz_\be\n+constexpr size_type size() const noexcept\n+Returns number of elements in the vector.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn reservedvector.hh:387\n+_\bD_\bu_\bn_\be_\b:_\b:_\bR_\be_\bs_\be_\br_\bv_\be_\bd_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\be_\bm_\bp_\bt_\by\n+constexpr bool empty() const noexcept\n+Returns true if vector has no elements.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn reservedvector.hh:393\n+_\bD_\bu_\bn_\be_\b:_\b:_\bR_\be_\bs_\be_\br_\bv_\be_\bd_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\bb_\be_\bg_\bi_\bn\n+constexpr iterator begin() noexcept\n+Returns a iterator pointing to the beginning of the vector.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn reservedvector.hh:237\n+_\bD_\bu_\bn_\be_\b:_\b:_\bR_\be_\bs_\be_\br_\bv_\be_\bd_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\bp_\bu_\bs_\bh_\b__\bb_\ba_\bc_\bk\n+constexpr void push_back(const value_type &t) noexcept(std::\n+is_nothrow_copy_assignable_v< value_type >)\n+Appends an element to the end of a vector, up to the maximum size n, O(1) time.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn reservedvector.hh:194\n+_\bD_\bu_\bn_\be_\b:_\b:_\bR_\be_\bs_\be_\br_\bv_\be_\bd_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\br_\be_\bn_\bd\n+constexpr reverse_iterator rend() noexcept\n+Returns a const reverse-iterator pointing to the begin of the vector.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn reservedvector.hh:291\n+_\bD_\bu_\bn_\be_\b:_\b:_\bR_\be_\bs_\be_\br_\bv_\be_\bd_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\bi_\bt_\be_\br_\ba_\bt_\bo_\br\n+storage_type::iterator iterator\n+Iterator used to iterate through a vector.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn reservedvector.hh:69\n+_\bD_\bu_\bn_\be_\b:_\b:_\bR_\be_\bs_\be_\br_\bv_\be_\bd_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\bc_\bb_\be_\bg_\bi_\bn\n+constexpr const_iterator cbegin() const noexcept\n+Returns a const_iterator pointing to the beginning of the vector.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn reservedvector.hh:249\n+_\bD_\bu_\bn_\be_\b:_\b:_\bR_\be_\bs_\be_\br_\bv_\be_\bd_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\bc_\bo_\bn_\bs_\bt_\b__\br_\be_\bv_\be_\br_\bs_\be_\b__\bi_\bt_\be_\br_\ba_\bt_\bo_\br\n+std::reverse_iterator< const_iterator > const_reverse_iterator\n+Const reverse iterator.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn reservedvector.hh:75\n+_\bD_\bu_\bn_\be_\b:_\b:_\bR_\be_\bs_\be_\br_\bv_\be_\bd_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\bd_\ba_\bt_\ba\n+constexpr pointer data() noexcept\n+Returns pointer to the underlying memory.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn reservedvector.hh:371\n+_\bD_\bu_\bn_\be_\b:_\b:_\bR_\be_\bs_\be_\br_\bv_\be_\bd_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\bb_\ba_\bc_\bk\n+constexpr const_reference back() const noexcept\n+Returns const reference to last element of vector.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn reservedvector.hh:364\n+_\bD_\bu_\bn_\be_\b:_\b:_\bR_\be_\bs_\be_\br_\bv_\be_\bd_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b<_\b<\n+friend std::ostream & operator<<(std::ostream &s, const ReservedVector &v)\n+Send ReservedVector to an output stream.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn reservedvector.hh:434\n+_\bD_\bu_\bn_\be_\b:_\b:_\bR_\be_\bs_\be_\br_\bv_\be_\bd_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b=_\b=\n+constexpr bool operator==(const ReservedVector &that) const noexcept\n+Compares the values in the vector this with that for equality.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn reservedvector.hh:132\n+_\bD_\bu_\bn_\be_\b:_\b:_\bR_\be_\bs_\be_\br_\bv_\be_\bd_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\bp_\bo_\bp_\b__\bb_\ba_\bc_\bk\n+constexpr void pop_back() noexcept\n+Erases the last element of the vector, O(1) time.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn reservedvector.hh:227\n+_\bD_\bu_\bn_\be_\b:_\b:_\bR_\be_\bs_\be_\br_\bv_\be_\bd_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\bh_\ba_\bs_\bh_\b__\bv_\ba_\bl_\bu_\be\n+friend std::size_t hash_value(const ReservedVector &v) noexcept\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn reservedvector.hh:441\n+_\bD_\bu_\bn_\be_\b:_\b:_\bR_\be_\bs_\be_\br_\bv_\be_\bd_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\bd_\bi_\bf_\bf_\be_\br_\be_\bn_\bc_\be_\b__\bt_\by_\bp_\be\n+storage_type::difference_type difference_type\n+A signed integral type.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn reservedvector.hh:67\n+_\bD_\bu_\bn_\be_\b:_\b:_\bR_\be_\bs_\be_\br_\bv_\be_\bd_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\be_\bn_\bd\n+constexpr const_iterator end() const noexcept\n+Returns a const_iterator pointing to the end of the vector.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn reservedvector.hh:279\n+_\bD_\bu_\bn_\be_\b:_\b:_\bR_\be_\bs_\be_\br_\bv_\be_\bd_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\bc_\bl_\be_\ba_\br\n+constexpr void clear() noexcept\n+Erases all elements.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn reservedvector.hh:181\n+_\bD_\bu_\bn_\be_\b:_\b:_\bR_\be_\bs_\be_\br_\bv_\be_\bd_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\bR_\be_\bs_\be_\br_\bv_\be_\bd_\bV_\be_\bc_\bt_\bo_\br\n+constexpr ReservedVector() noexcept(std::is_nothrow_default_constructible_v<\n+value_type >)\n+Constructs an empty vector.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn reservedvector.hh:82\n+_\bD_\bu_\bn_\be_\b:_\b:_\bR_\be_\bs_\be_\br_\bv_\be_\bd_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\bc_\bo_\bn_\bs_\bt_\b__\bi_\bt_\be_\br_\ba_\bt_\bo_\br\n+storage_type::const_iterator const_iterator\n+Const iterator used to iterate through a vector.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn reservedvector.hh:71\n+_\bD_\bu_\bn_\be_\b:_\b:_\bR_\be_\bs_\be_\br_\bv_\be_\bd_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\be_\bm_\bp_\bl_\ba_\bc_\be_\b__\bb_\ba_\bc_\bk\n+reference emplace_back(Args &&... args) noexcept(std::\n+is_nothrow_constructible_v< value_type, decltype(args)... >)\n+Appends an element to the end of a vector by constructing it in place.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn reservedvector.hh:211\n+_\bD_\bu_\bn_\be_\b:_\b:_\bR_\be_\bs_\be_\br_\bv_\be_\bd_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be\n+storage_type::size_type size_type\n+An unsigned integral type.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn reservedvector.hh:65\n+_\bD_\bu_\bn_\be_\b:_\b:_\bR_\be_\bs_\be_\br_\bv_\be_\bd_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b>_\b=\n+constexpr bool operator>=(const ReservedVector &that) const noexcept\n+Lexicographically compares the values in the vector this with that\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn reservedvector.hh:171\n+_\bD_\bu_\bn_\be_\b:_\b:_\bR_\be_\bs_\be_\br_\bv_\be_\bd_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\bc_\bo_\bn_\bs_\bt_\b__\br_\be_\bf_\be_\br_\be_\bn_\bc_\be\n+storage_type::const_reference const_reference\n+Const reference to T.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn reservedvector.hh:63\n+_\bD_\bu_\bn_\be_\b:_\b:_\bR_\be_\bs_\be_\br_\bv_\be_\bd_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\bs_\bw_\ba_\bp\n+void swap(ReservedVector &other) noexcept(std::is_nothrow_swappable_v<\n+value_type >)\n+Swap the content with another vector.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn reservedvector.hh:423\n+_\bD_\bu_\bn_\be_\b:_\b:_\bR_\be_\bs_\be_\br_\bv_\be_\bd_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\bR_\be_\bs_\be_\br_\bv_\be_\bd_\bV_\be_\bc_\bt_\bo_\br\n+constexpr ReservedVector(InputIt first, InputIt last) noexcept(std::\n+is_nothrow_copy_assignable_v< value_type > &&noexcept(ReservedVector()))\n+Constructs the vector from an iterator range [first,last)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn reservedvector.hh:110\n+_\bD_\bu_\bn_\be_\b:_\b:_\bR_\be_\bs_\be_\br_\bv_\be_\bd_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\bd_\ba_\bt_\ba\n+constexpr const_pointer data() const noexcept\n+Returns const pointer to the underlying memory.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn reservedvector.hh:377\n+_\bD_\bu_\bn_\be_\b:_\b:_\bR_\be_\bs_\be_\br_\bv_\be_\bd_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\ba_\bt\n+constexpr reference at(size_type i)\n+Returns reference to the i'th element.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn reservedvector.hh:313\n+_\bD_\bu_\bn_\be_\b:_\b:_\bR_\be_\bs_\be_\br_\bv_\be_\bd_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\bc_\be_\bn_\bd\n+constexpr const_iterator cend() const noexcept\n+Returns a const_iterator pointing to the end of the vector.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn reservedvector.hh:285\n+_\bD_\bu_\bn_\be_\b:_\b:_\bR_\be_\bs_\be_\br_\bv_\be_\bd_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\bb_\ba_\bc_\bk\n+constexpr reference back() noexcept\n+Returns reference to last element of vector.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn reservedvector.hh:357\n+_\bD_\bu_\bn_\be_\b:_\b:_\bR_\be_\bs_\be_\br_\bv_\be_\bd_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\br_\bb_\be_\bg_\bi_\bn\n+constexpr const_reverse_iterator rbegin() const noexcept\n+Returns a const reverse-iterator pointing to the end of the vector.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn reservedvector.hh:261\n+_\bD_\bu_\bn_\be_\b:_\b:_\bR_\be_\bs_\be_\br_\bv_\be_\bd_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\bv_\ba_\bl_\bu_\be_\b__\bt_\by_\bp_\be\n+storage_type::value_type value_type\n+The type of object, T, stored in the vector.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn reservedvector.hh:55\n+_\bD_\bu_\bn_\be_\b:_\b:_\bR_\be_\bs_\be_\br_\bv_\be_\bd_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\bb_\be_\bg_\bi_\bn\n+constexpr const_iterator begin() const noexcept\n+Returns a const_iterator pointing to the beginning of the vector.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn reservedvector.hh:243\n+_\bD_\bu_\bn_\be_\b:_\b:_\bR_\be_\bs_\be_\br_\bv_\be_\bd_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\bR_\be_\bs_\be_\br_\bv_\be_\bd_\bV_\be_\bc_\bt_\bo_\br\n+constexpr ReservedVector(size_type count, const value_type &value) noexcept\n+(std::is_nothrow_copy_assignable_v< value_type > &&noexcept(ReservedVector\n+(count)))\n+Constructs the vector with count copies of elements with value value.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn reservedvector.hh:98\n+_\bD_\bu_\bn_\be_\b:_\b:_\bR_\be_\bs_\be_\br_\bv_\be_\bd_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b[_\b]\n+constexpr reference operator[](size_type i) noexcept\n+Returns reference to the i'th element.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn reservedvector.hh:329\n+_\bD_\bu_\bn_\be_\b:_\b:_\bR_\be_\bs_\be_\br_\bv_\be_\bd_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\bf_\br_\bo_\bn_\bt\n+constexpr reference front() noexcept\n+Returns reference to first element of vector.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn reservedvector.hh:343\n+_\bD_\bu_\bn_\be_\b:_\b:_\bR_\be_\bs_\be_\br_\bv_\be_\bd_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\bc_\bo_\bn_\bs_\bt_\b__\bp_\bo_\bi_\bn_\bt_\be_\br\n+storage_type::const_pointer const_pointer\n+Const pointer to T.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn reservedvector.hh:59\n+_\bD_\bu_\bn_\be_\b:_\b:_\bR_\be_\bs_\be_\br_\bv_\be_\bd_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\bR_\be_\bs_\be_\br_\bv_\be_\bd_\bV_\be_\bc_\bt_\bo_\br\n+constexpr ReservedVector(std::initializer_list< value_type > const &l) noexcept\n+(std::is_nothrow_copy_assignable_v< value_type > &&noexcept(ReservedVector\n+(l.begin(), l.end())))\n+Constructs the vector from an initializer list.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn reservedvector.hh:121\n+_\bD_\bu_\bn_\be_\b:_\b:_\bR_\be_\bs_\be_\br_\bv_\be_\bd_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b!_\b=\n+constexpr bool operator!=(const ReservedVector &that) const noexcept\n+Compares the values in the vector this with that for not equality.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn reservedvector.hh:143\n+_\bD_\bu_\bn_\be_\b:_\b:_\bR_\be_\bs_\be_\br_\bv_\be_\bd_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\br_\be_\bs_\bi_\bz_\be\n+constexpr void resize(size_type s) noexcept\n+Specifies a new size for the vector.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn reservedvector.hh:187\n+_\bD_\bu_\bn_\be_\b:_\b:_\bR_\be_\bs_\be_\br_\bv_\be_\bd_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\bc_\ba_\bp_\ba_\bc_\bi_\bt_\by\n+static constexpr size_type capacity() noexcept\n+Returns current capacity (allocated memory) of the vector.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn reservedvector.hh:399\n+_\bD_\bu_\bn_\be_\b:_\b:_\bR_\be_\bs_\be_\br_\bv_\be_\bd_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\br_\be_\bf_\be_\br_\be_\bn_\bc_\be\n+storage_type::reference reference\n+Reference to T.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn reservedvector.hh:61\n+_\bD_\bu_\bn_\be_\b:_\b:_\bR_\be_\bs_\be_\br_\bv_\be_\bd_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\bc_\br_\bb_\be_\bg_\bi_\bn\n+constexpr const_reverse_iterator crbegin() const noexcept\n+Returns a const reverse-iterator pointing to the end of the vector.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn reservedvector.hh:267\n+_\bD_\bu_\bn_\be_\b:_\b:_\bR_\be_\bs_\be_\br_\bv_\be_\bd_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\bp_\bu_\bs_\bh_\b__\bb_\ba_\bc_\bk\n+constexpr void push_back(value_type &&t) noexcept(std::\n+is_nothrow_move_assignable_v< value_type >)\n+Appends an element to the end of a vector by moving the value, up to the\n+maximum size n,...\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn reservedvector.hh:202\n ===============================================================================\n Generated by\u00a0_\b[_\bd_\bo_\bx_\by_\bg_\be_\bn_\b] 1.9.8\n"}]}, {"source1": "./usr/share/doc/libdune-common-doc/doxygen/a00023.html", "source2": "./usr/share/doc/libdune-common-doc/doxygen/a00023.html", "unified_diff": "@@ -1,15 +1,15 @@\n \n \n \n \n \n \n \n-dune-common: plocalindex.hh File Reference\n+dune-common: gmpfield.hh File Reference\n \n \n \n \n \n \n \n@@ -65,68 +65,60 @@\n
\n
\n \n \n \n \n \n \n+
gmpfield.hh File Reference
\n \n
\n \n-

Provides classes for use as the local index in ParallelIndexSet for distributed computing. \n+

Wrapper for the GNU multiprecision (GMP) library. \n More...

\n
#include <iostream>
\n-#include <mpi.h>
\n-#include <dune/common/parallel/indexset.hh>
\n-#include <dune/common/parallel/localindex.hh>
\n-#include <dune/common/parallel/mpitraits.hh>
\n+#include <string>
\n+#include <type_traits>
\n+#include <gmpxx.h>
\n+#include <dune/common/promotiontraits.hh>
\n+#include <dune/common/typetraits.hh>
\n
\n

Go to the source code of this file.

\n \n \n-\n-\n+\n+\n \n-\n+\n \n-\n+\n+\n+\n+\n+\n+\n+\n \n

\n Classes

class  Dune::ParallelLocalIndex< T >
 An index present on the local process with an additional attribute flag. More...
class  Dune::GMPField< precision >
 Number class for high precision floating point number using the GMP library mpf_class implementation. More...
 
struct  Dune::LocalIndexComparator< ParallelLocalIndex< T > >
struct  Dune::IsNumber< GMPField< precision > >
 
class  Dune::MPITraits< ParallelLocalIndex< T > >
struct  Dune::PromotionTraits< GMPField< precision1 >, GMPField< precision2 > >
 
struct  Dune::PromotionTraits< GMPField< precision >, GMPField< precision > >
 
struct  Dune::PromotionTraits< GMPField< precision >, T >
 
struct  Dune::PromotionTraits< T, GMPField< precision > >
 
\n \n \n \n \n-

\n Namespaces

namespace  Dune
 Dune namespace.
 
\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n

\n-Functions

template<class T >
std::ostream & Dune::operator<< (std::ostream &os, const ParallelLocalIndex< T > &index)
 Print the local index to a stream.
 
template<typename T >
bool Dune::operator== (const ParallelLocalIndex< T > &p1, const ParallelLocalIndex< T > &p2)
 
template<typename T >
bool Dune::operator!= (const ParallelLocalIndex< T > &p1, const ParallelLocalIndex< T > &p2)
 
\n

Detailed Description

\n-

Provides classes for use as the local index in ParallelIndexSet for distributed computing.

\n-
Author
Markus Blatt
\n+

Wrapper for the GNU multiprecision (GMP) library.

\n
\n \n
\n Generated by \"doxygen\"/ 1.9.8\n
\n \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,52 +1,40 @@\n dune-common\u00a02.10\n Loading...\n Searching...\n No Matches\n * _\bd_\bu_\bn_\be\n * _\bc_\bo_\bm_\bm_\bo_\bn\n- * _\bp_\ba_\br_\ba_\bl_\bl_\be_\bl\n-_\bC_\bl_\ba_\bs_\bs_\be_\bs | _\bN_\ba_\bm_\be_\bs_\bp_\ba_\bc_\be_\bs | _\bF_\bu_\bn_\bc_\bt_\bi_\bo_\bn_\bs\n-plocalindex.hh File Reference\n-_\bC_\bo_\bm_\bm_\bo_\bn \u00bb _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\b _\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn \u00bb _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\b _\bC_\bo_\bm_\bp_\bu_\bt_\bi_\bn_\bg_\b _\bb_\ba_\bs_\be_\bd_\b _\bo_\bn_\b _\bI_\bn_\bd_\be_\bx_\bs_\be_\bt_\bs\n-Provides classes for use as the local index in ParallelIndexSet for distributed\n-computing. _\bM_\bo_\br_\be_\b._\b._\b.\n+_\bC_\bl_\ba_\bs_\bs_\be_\bs | _\bN_\ba_\bm_\be_\bs_\bp_\ba_\bc_\be_\bs\n+gmpfield.hh File Reference\n+Wrapper for the GNU multiprecision (GMP) library. _\bM_\bo_\br_\be_\b._\b._\b.\n #include \n-#include \n-#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bp_\ba_\br_\ba_\bl_\bl_\be_\bl_\b/_\bi_\bn_\bd_\be_\bx_\bs_\be_\bt_\b._\bh_\bh>\n-#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bp_\ba_\br_\ba_\bl_\bl_\be_\bl_\b/_\bl_\bo_\bc_\ba_\bl_\bi_\bn_\bd_\be_\bx_\b._\bh_\bh>\n-#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bp_\ba_\br_\ba_\bl_\bl_\be_\bl_\b/_\bm_\bp_\bi_\bt_\br_\ba_\bi_\bt_\bs_\b._\bh_\bh>\n+#include \n+#include \n+#include \n+#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bp_\br_\bo_\bm_\bo_\bt_\bi_\bo_\bn_\bt_\br_\ba_\bi_\bt_\bs_\b._\bh_\bh>\n+#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bt_\by_\bp_\be_\bt_\br_\ba_\bi_\bt_\bs_\b._\bh_\bh>\n _\bG_\bo_\b _\bt_\bo_\b _\bt_\bh_\be_\b _\bs_\bo_\bu_\br_\bc_\be_\b _\bc_\bo_\bd_\be_\b _\bo_\bf_\b _\bt_\bh_\bi_\bs_\b _\bf_\bi_\bl_\be_\b.\n C\bCl\bla\bas\bss\bse\bes\bs\n- class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bL_\bo_\bc_\ba_\bl_\bI_\bn_\bd_\be_\bx_\b<_\b _\bT_\b _\b>\n-\u00a0 An index present on the local process with an additional attribute\n- flag. _\bM_\bo_\br_\be_\b._\b._\b.\n+ class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bG_\bM_\bP_\bF_\bi_\be_\bl_\bd_\b<_\b _\bp_\br_\be_\bc_\bi_\bs_\bi_\bo_\bn_\b _\b>\n+\u00a0 Number class for high precision floating point number using the GMP\n+ library mpf_class implementation. _\bM_\bo_\br_\be_\b._\b._\b.\n \u00a0\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bL_\bo_\bc_\ba_\bl_\bI_\bn_\bd_\be_\bx_\bC_\bo_\bm_\bp_\ba_\br_\ba_\bt_\bo_\br_\b<_\b _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bL_\bo_\bc_\ba_\bl_\bI_\bn_\bd_\be_\bx_\b<_\b _\bT_\b _\b>_\b _\b>\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bI_\bs_\bN_\bu_\bm_\bb_\be_\br_\b<_\b _\bG_\bM_\bP_\bF_\bi_\be_\bl_\bd_\b<_\b _\bp_\br_\be_\bc_\bi_\bs_\bi_\bo_\bn_\b _\b>_\b _\b>\n \u00a0\n- class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bM_\bP_\bI_\bT_\br_\ba_\bi_\bt_\bs_\b<_\b _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bL_\bo_\bc_\ba_\bl_\bI_\bn_\bd_\be_\bx_\b<_\b _\bT_\b _\b>_\b _\b>\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bP_\br_\bo_\bm_\bo_\bt_\bi_\bo_\bn_\bT_\br_\ba_\bi_\bt_\bs_\b<_\b _\bG_\bM_\bP_\bF_\bi_\be_\bl_\bd_\b<_\b _\bp_\br_\be_\bc_\bi_\bs_\bi_\bo_\bn_\b1_\b _\b>_\b,_\b _\bG_\bM_\bP_\bF_\bi_\be_\bl_\bd_\b<_\b _\bp_\br_\be_\bc_\bi_\bs_\bi_\bo_\bn_\b2_\b _\b>\n+ _\b>\n+\u00a0\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bP_\br_\bo_\bm_\bo_\bt_\bi_\bo_\bn_\bT_\br_\ba_\bi_\bt_\bs_\b<_\b _\bG_\bM_\bP_\bF_\bi_\be_\bl_\bd_\b<_\b _\bp_\br_\be_\bc_\bi_\bs_\bi_\bo_\bn_\b _\b>_\b,_\b _\bG_\bM_\bP_\bF_\bi_\be_\bl_\bd_\b<_\b _\bp_\br_\be_\bc_\bi_\bs_\bi_\bo_\bn_\b _\b>_\b _\b>\n+\u00a0\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bP_\br_\bo_\bm_\bo_\bt_\bi_\bo_\bn_\bT_\br_\ba_\bi_\bt_\bs_\b<_\b _\bG_\bM_\bP_\bF_\bi_\be_\bl_\bd_\b<_\b _\bp_\br_\be_\bc_\bi_\bs_\bi_\bo_\bn_\b _\b>_\b,_\b _\bT_\b _\b>\n+\u00a0\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bP_\br_\bo_\bm_\bo_\bt_\bi_\bo_\bn_\bT_\br_\ba_\bi_\bt_\bs_\b<_\b _\bT_\b,_\b _\bG_\bM_\bP_\bF_\bi_\be_\bl_\bd_\b<_\b _\bp_\br_\be_\bc_\bi_\bs_\bi_\bo_\bn_\b _\b>_\b _\b>\n \u00a0\n N\bNa\bam\bme\bes\bsp\bpa\bac\bce\bes\bs\n namespace \u00a0 _\bD_\bu_\bn_\be\n \u00a0 _\bD_\bu_\bn_\be namespace.\n \u00a0\n-F\bFu\bun\bnc\bct\bti\bio\bon\bns\bs\n-template\n-std::ostream &\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b<_\b< (std::ostream &os, const _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bL_\bo_\bc_\ba_\bl_\bI_\bn_\bd_\be_\bx< T\n- > &index)\n-\u00a0 Print the local index to a stream.\n-\u00a0\n-template\n- bool\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b=_\b= (const _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bL_\bo_\bc_\ba_\bl_\bI_\bn_\bd_\be_\bx< T > &p1, const\n- _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bL_\bo_\bc_\ba_\bl_\bI_\bn_\bd_\be_\bx< T > &p2)\n-\u00a0\n-template\n- bool\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b!_\b= (const _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bL_\bo_\bc_\ba_\bl_\bI_\bn_\bd_\be_\bx< T > &p1, const\n- _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bL_\bo_\bc_\ba_\bl_\bI_\bn_\bd_\be_\bx< T > &p2)\n-\u00a0\n *\b**\b**\b**\b**\b* D\bDe\bet\bta\bai\bil\ble\bed\bd D\bDe\bes\bsc\bcr\bri\bip\bpt\bti\bio\bon\bn *\b**\b**\b**\b**\b*\n-Provides classes for use as the local index in ParallelIndexSet for distributed\n-computing.\n- Author\n- Markus Blatt\n+Wrapper for the GNU multiprecision (GMP) library.\n ===============================================================================\n Generated by\u00a0_\b[_\bd_\bo_\bx_\by_\bg_\be_\bn_\b] 1.9.8\n"}]}, {"source1": "./usr/share/doc/libdune-common-doc/doxygen/a00023_source.html", "source2": "./usr/share/doc/libdune-common-doc/doxygen/a00023_source.html", "unified_diff": "@@ -1,15 +1,15 @@\n \n \n \n \n \n \n \n-dune-common: plocalindex.hh Source File\n+dune-common: gmpfield.hh Source File\n \n \n \n \n \n \n \n@@ -70,309 +70,145 @@\n
\n \n \n \n \n \n \n
\n-
plocalindex.hh
\n+
gmpfield.hh
\n
\n
\n Go to the documentation of this file.
1// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
\n
2// vi: set et ts=4 sw=2 sts=2:
\n
3// SPDX-FileCopyrightInfo: Copyright \u00a9 DUNE Project contributors, see file LICENSE.md in module root
\n
4// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception
\n-
5#ifndef DUNE_COMMON_PARALLEL_PLOCALINDEX_HH
\n-
6#define DUNE_COMMON_PARALLEL_PLOCALINDEX_HH
\n+
5#ifndef DUNE_GMPFIELD_HH
\n+
6#define DUNE_GMPFIELD_HH
\n
7
\n-
8#include <iostream>
\n-
9
\n-
10#if HAVE_MPI
\n-
11#include <mpi.h>
\n-
12#endif
\n-
13
\n-\n-\n-\n+
12#include <iostream>
\n+
13#include <string>
\n+
14#include <type_traits>
\n+
15
\n+
16#if HAVE_GMP || DOXYGEN
\n
17
\n-
18namespace Dune
\n-
19{
\n-
20
\n-
21
\n-
32 template<class T> class ParallelLocalIndex;
\n-
33
\n-
39 template<class T>
\n-
\n-
40 std::ostream& operator<<(std::ostream& os, const ParallelLocalIndex<T>& index)
\n-
41 {
\n-
42 os<<"{local="<<index.localIndex_<<", attr="<<T(index.attribute_)<<", public="
\n-
43 <<(index.public_ ? true : false)<<"}";
\n-
44 return os;
\n-
45 }
\n-
\n-
46
\n-
50 template<typename T>
\n-
\n-\n-
52 {
\n-
53#if HAVE_MPI
\n-
54 // friend declaration needed for MPITraits
\n-
55 friend struct MPITraits<ParallelLocalIndex<T> >;
\n-
56#endif
\n-
57 friend std::ostream& operator<< <>(std::ostream& os, const ParallelLocalIndex<T>& index);
\n-
58
\n-
59 public:
\n-
67 typedef T Attribute;
\n-\n-
77
\n-
86 ParallelLocalIndex(size_t localIndex, const Attribute& attribute, bool isPublic=true);
\n-\n-
93
\n-
94#if 0
\n-\n-
105#endif
\n-
106
\n-
111 inline const Attribute attribute() const;
\n-
112
\n-
117 inline void setAttribute(const Attribute& attribute);
\n-
118
\n-
123 inline size_t local() const;
\n-
124
\n-
128 inline operator size_t() const;
\n-
129
\n-
135 inline ParallelLocalIndex<Attribute>& operator=(size_t index);
\n-
136
\n-
141 inline bool isPublic() const;
\n-
142
\n-
147 inline LocalIndexState state() const;
\n-
148
\n-
153 inline void setState(const LocalIndexState& state);
\n-
154
\n-
155 private:
\n-
157 size_t localIndex_;
\n-
158
\n-
160 char attribute_;
\n-
161
\n-
163 char public_;
\n-
164
\n-
171 char state_;
\n-
172
\n-
173 };
\n-
\n-
174
\n-
175 template<typename T>
\n-
\n-\n-
177 const ParallelLocalIndex<T>& p2)
\n-
178 {
\n-
179 if(p1.local()!=p2.local())
\n-
180 return false;
\n-
181 if(p1.attribute()!=p2.attribute())
\n-
182 return false;
\n-
183 if(p1.isPublic()!=p2.isPublic())
\n-
184 return false;
\n-
185 return true;
\n-
186 }
\n-
\n-
187 template<typename T>
\n-
\n-\n-
189 const ParallelLocalIndex<T>& p2)
\n-
190 {
\n-
191 return !(p1==p2);
\n-
192 }
\n-
\n-
193
\n-
194
\n-
195 template<typename T>
\n-
\n-\n-
197 {
\n-
\n-
198 static bool compare(const ParallelLocalIndex<T>& t1,
\n-
199 const ParallelLocalIndex<T>& t2){
\n-
200 return t1.attribute()<t2.attribute();
\n-
201 }
\n-
\n-
202 };
\n-
\n-
203
\n-
204
\n-
205#if HAVE_MPI
\n-
206
\n-
208 template<typename T>
\n-
\n-\n-
210 {
\n-
211 public:
\n-
212 static MPI_Datatype getType();
\n-
213 private:
\n-
214 static MPI_Datatype type;
\n-
215
\n-
216 };
\n-
\n-
217
\n-
218#endif
\n-
219
\n-
220 template<class T>
\n-
\n-
221 ParallelLocalIndex<T>::ParallelLocalIndex(const T& attribute, bool isPublic)
\n-
222 : localIndex_(0), attribute_(static_cast<char>(attribute)),
\n-
223 public_(static_cast<char>(isPublic)), state_(static_cast<char>(VALID))
\n-
224 {}
\n-
\n-
225
\n-
226
\n-
227 template<class T>
\n-
\n-
228 ParallelLocalIndex<T>::ParallelLocalIndex(size_t local, const T& attribute, bool isPublic)
\n-
229 : localIndex_(local), attribute_(static_cast<char>(attribute)),
\n-
230 public_(static_cast<char>(isPublic)), state_(static_cast<char>(VALID))
\n-
231 {}
\n-
\n-
232
\n-
233 template<class T>
\n-
\n-\n-
235 : localIndex_(0), attribute_(), public_(static_cast<char>(false)),
\n-
236 state_(static_cast<char>(VALID))
\n-
237 {}
\n-
\n-
238
\n-
239 template<class T>
\n-
\n-
240 inline const T ParallelLocalIndex<T>::attribute() const
\n-
241 {
\n-
242 return T(attribute_);
\n-
243 }
\n-
\n-
244
\n-
245 template<class T>
\n-
246 inline void
\n-
\n-\n-
248 {
\n-
249 attribute_ = attribute;
\n-
250 }
\n-
\n-
251
\n-
252 template<class T>
\n-
\n-
253 inline size_t ParallelLocalIndex<T>::local() const
\n-
254 {
\n-
255 return localIndex_;
\n-
256 }
\n-
\n-
257
\n-
258 template<class T>
\n-
\n-\n-
260 {
\n-
261 return localIndex_;
\n-
262 }
\n-
\n-
263
\n-
264 template<class T>
\n-\n-
\n-\n-
267 {
\n-
268 localIndex_=index;
\n-
269 return *this;
\n-
270 }
\n-
\n-
271
\n-
272 template<class T>
\n-
\n-\n-
274 {
\n-
275 return static_cast<bool>(public_);
\n-
276 }
\n-
\n-
277
\n-
278 template<class T>
\n-
\n-\n-
280 {
\n-
281 return LocalIndexState(state_);
\n-
282 }
\n-
\n-
283
\n-
284 template<class T>
\n-
\n-\n-
286 {
\n-
287 state_=static_cast<char>(state);
\n-
288 }
\n-
\n-
289
\n-
290#if HAVE_MPI
\n-
291
\n-
292 template<typename T>
\n-
\n-
293 MPI_Datatype MPITraits<ParallelLocalIndex<T> >::getType()
\n-
294 {
\n-
295
\n-
296 if(type==MPI_DATATYPE_NULL) {
\n-
297 int length = 1;
\n-
298 MPI_Aint base, disp;
\n-
299 MPI_Datatype types[1] = {MPITraits<char>::getType()};
\n-\n-
301 MPI_Get_address(&rep, &base);
\n-
302 MPI_Get_address(&(rep.attribute_), &disp);
\n-
303 disp -= base;
\n-
304
\n-
305 MPI_Datatype tmp;
\n-
306 MPI_Type_create_struct(1, &length, &disp, types, &tmp);
\n-
307
\n-
308 MPI_Type_create_resized(tmp, 0, sizeof(ParallelLocalIndex<T>), &type);
\n-
309 MPI_Type_commit(&type);
\n-
310
\n-
311 MPI_Type_free(&tmp);
\n-
312 }
\n-
313 return type;
\n-
314 }
\n-
\n-
315
\n-
316 template<typename T>
\n-
317 MPI_Datatype MPITraits<ParallelLocalIndex<T> >::type = MPI_DATATYPE_NULL;
\n-
318
\n-
319#endif // HAVE_MPI
\n-
320
\n-
321
\n-
323} // namespace Dune
\n-
324
\n-
325#endif // DUNE_COMMON_PARALLEL_PLOCALINDEX_HH
\n-
Provides a map between global and local indices.
\n-
Provides classes for use as the local index in ParallelIndexSet.
\n-
Traits classes for mapping types onto MPI_Datatype.
\n-
std::ostream & operator<<(std::ostream &s, const bigunsignedint< k > &x)
Definition bigunsignedint.hh:278
\n-
EnableIfInterOperable< T1, T2, bool >::type operator==(const ForwardIteratorFacade< T1, V1, R1, D > &lhs, const ForwardIteratorFacade< T2, V2, R2, D > &rhs)
Checks for equality.
Definition iteratorfacades.hh:238
\n-
EnableIfInterOperable< T1, T2, bool >::type operator!=(const ForwardIteratorFacade< T1, V1, R1, D > &lhs, const ForwardIteratorFacade< T2, V2, R2, D > &rhs)
Checks for inequality.
Definition iteratorfacades.hh:260
\n-
bool isPublic() const
Check whether the index might also be known other processes.
Definition plocalindex.hh:273
\n-
void setAttribute(const Attribute &attribute)
Set the attribute of the index.
Definition plocalindex.hh:247
\n-
size_t local() const
get the local index.
Definition plocalindex.hh:253
\n-
LocalIndexState
The states available for the local indices.
Definition localindex.hh:28
\n-
void setState(const LocalIndexState &state)
Set the state.
Definition plocalindex.hh:285
\n-
ParallelLocalIndex< Attribute > & operator=(size_t index)
Assign a new local index.
Definition plocalindex.hh:266
\n-
LocalIndexState state() const
Get the state.
Definition plocalindex.hh:279
\n-
ParallelLocalIndex()
Parameterless constructor.
Definition plocalindex.hh:234
\n-
const Attribute attribute() const
Get the attribute of the index.
Definition plocalindex.hh:240
\n-
@ VALID
Definition localindex.hh:28
\n+
18#include <gmpxx.h>
\n+
19
\n+\n+\n+
22
\n+
23namespace Dune
\n+
24{
\n+
25
\n+
30 template< unsigned int precision >
\n+
\n+\n+
32 : public mpf_class
\n+
33 {
\n+
34 typedef mpf_class Base;
\n+
35
\n+
36 public:
\n+
\n+\n+
39 : Base(0,precision)
\n+
40 {}
\n+
\n+
41
\n+
\n+
45 GMPField ( const char* str )
\n+
46 : Base(str,precision)
\n+
47 {}
\n+
\n+
48
\n+
\n+
52 GMPField ( const std::string& str )
\n+
53 : Base(str,precision)
\n+
54 {}
\n+
\n+
55
\n+
58 template< class T,
\n+
59 typename EnableIf = typename std::enable_if<
\n+
60 std::is_convertible<T, mpf_class>::value>::type
\n+
61 >
\n+
\n+
62 GMPField ( const T &v )
\n+
63 : Base( v,precision )
\n+
64 {}
\n+
\n+
65
\n+
66 // type conversion operators
\n+
\n+
67 operator double () const
\n+
68 {
\n+
69 return this->get_d();
\n+
70 }
\n+
\n+
71
\n+
72 };
\n+
\n+
73
\n+
74 template <unsigned int precision>
\n+
\n+
75 struct IsNumber<GMPField<precision>>
\n+
76 : public std::integral_constant<bool, true> {
\n+
77 };
\n+
\n+
78
\n+
79 template< unsigned int precision1, unsigned int precision2 >
\n+
\n+
80 struct PromotionTraits<GMPField<precision1>, GMPField<precision2>>
\n+
81 {
\n+
82 typedef GMPField<(precision1 > precision2 ? precision1 : precision2)> PromotedType;
\n+
83 };
\n+
\n+
84
\n+
85 template< unsigned int precision >
\n+
\n+
86 struct PromotionTraits<GMPField<precision>,GMPField<precision>>
\n+
87 {
\n+\n+
89 };
\n+
\n+
90
\n+
91 template< unsigned int precision, class T >
\n+
\n+
92 struct PromotionTraits<GMPField<precision>, T>
\n+
93 {
\n+\n+
95 };
\n+
\n+
96
\n+
97 template< class T, unsigned int precision >
\n+
\n+
98 struct PromotionTraits<T, GMPField<precision>>
\n+
99 {
\n+\n+
101 };
\n+
\n+
102}
\n+
103
\n+
104#endif // HAVE_GMP
\n+
105
\n+
106#endif // #ifndef DUNE_GMPFIELD_HH
\n+
Traits for type conversions and type information.
\n+
Compute type of the result of an arithmetic operation involving two different number types.
\n
Dune namespace.
Definition alignedallocator.hh:13
\n-
A traits class describing the mapping of types onto MPI_Datatypes.
Definition mpitraits.hh:41
\n-
static MPI_Datatype getType()
Definition mpitraits.hh:48
\n-
Definition indexset.hh:615
\n-
An index present on the local process with an additional attribute flag.
Definition plocalindex.hh:52
\n-
T Attribute
The type of the attributes. Normally this will be an enumeration like.
Definition plocalindex.hh:67
\n-
static bool compare(const ParallelLocalIndex< T > &t1, const ParallelLocalIndex< T > &t2)
Definition plocalindex.hh:198
\n+
Whether this type acts as a scalar in the context of (hierarchically blocked) containers.
Definition typetraits.hh:194
\n+
Number class for high precision floating point number using the GMP library mpf_class implementation.
Definition gmpfield.hh:33
\n+
GMPField(const T &v)
initialize from a compatible scalar type
Definition gmpfield.hh:62
\n+
GMPField()
Definition gmpfield.hh:38
\n+
GMPField(const std::string &str)
initialize from a string
Definition gmpfield.hh:52
\n+
GMPField(const char *str)
initialize from a string
Definition gmpfield.hh:45
\n+
GMPField< precision > PromotedType
Definition gmpfield.hh:88
\n+
GMPField< precision > PromotedType
Definition gmpfield.hh:94
\n+
GMPField< precision > PromotedType
Definition gmpfield.hh:100
\n+
Compute type of the result of an arithmetic operation involving two different number types.
Definition promotiontraits.hh:27
\n
\n \n
\n Generated by \"doxygen\"/ 1.9.8\n
\n \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,328 +1,146 @@\n dune-common\u00a02.10\n Loading...\n Searching...\n No Matches\n * _\bd_\bu_\bn_\be\n * _\bc_\bo_\bm_\bm_\bo_\bn\n- * _\bp_\ba_\br_\ba_\bl_\bl_\be_\bl\n-plocalindex.hh\n+gmpfield.hh\n _\bG_\bo_\b _\bt_\bo_\b _\bt_\bh_\be_\b _\bd_\bo_\bc_\bu_\bm_\be_\bn_\bt_\ba_\bt_\bi_\bo_\bn_\b _\bo_\bf_\b _\bt_\bh_\bi_\bs_\b _\bf_\bi_\bl_\be_\b.\n 1// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-\n 2// vi: set et ts=4 sw=2 sts=2:\n 3// SPDX-FileCopyrightInfo: Copyright \u00c2\u00a9 DUNE Project contributors, see file\n LICENSE.md in module root\n 4// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception\n-5#ifndef DUNE_COMMON_PARALLEL_PLOCALINDEX_HH\n-6#define DUNE_COMMON_PARALLEL_PLOCALINDEX_HH\n+5#ifndef DUNE_GMPFIELD_HH\n+6#define DUNE_GMPFIELD_HH\n 7\n-8#include \n-9\n-10#if HAVE_MPI\n-11#include \n-12#endif\n-13\n-14#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bp_\ba_\br_\ba_\bl_\bl_\be_\bl_\b/_\bi_\bn_\bd_\be_\bx_\bs_\be_\bt_\b._\bh_\bh>\n-15#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bp_\ba_\br_\ba_\bl_\bl_\be_\bl_\b/_\bl_\bo_\bc_\ba_\bl_\bi_\bn_\bd_\be_\bx_\b._\bh_\bh>\n-16#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bp_\ba_\br_\ba_\bl_\bl_\be_\bl_\b/_\bm_\bp_\bi_\bt_\br_\ba_\bi_\bt_\bs_\b._\bh_\bh>\n+12#include \n+13#include \n+14#include \n+15\n+16#if HAVE_GMP || DOXYGEN\n 17\n-18namespace _\bD_\bu_\bn_\be\n-19{\n-20\n-21\n-32 template class ParallelLocalIndex;\n-33\n-39 template\n-_\b4_\b0 std::ostream& _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b<_\b<(std::ostream& os, const _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bL_\bo_\bc_\ba_\bl_\bI_\bn_\bd_\be_\bx_\b<_\bT_\b>&\n-index)\n-41 {\n-42 os<<\"{local=\"<\n-_\b5_\b1 class _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bL_\bo_\bc_\ba_\bl_\bI_\bn_\bd_\be_\bx\n-52 {\n-53#if HAVE_MPI\n-54 // friend declaration needed for MPITraits\n-55 friend struct _\bM_\bP_\bI_\bT_\br_\ba_\bi_\bt_\bs<_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bL_\bo_\bc_\ba_\bl_\bI_\bn_\bd_\be_\bx >;\n-56#endif\n-57 friend std::ostream& operator<< <>(std::ostream& os, const\n-_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bL_\bo_\bc_\ba_\bl_\bI_\bn_\bd_\be_\bx_\b<_\bT_\b>& index);\n-58\n-59 public:\n-_\b6_\b7 typedef T _\bA_\bt_\bt_\br_\bi_\bb_\bu_\bt_\be;\n-76 _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bL_\bo_\bc_\ba_\bl_\bI_\bn_\bd_\be_\bx(const _\bA_\bt_\bt_\br_\bi_\bb_\bu_\bt_\be& _\ba_\bt_\bt_\br_\bi_\bb_\bu_\bt_\be, bool _\bi_\bs_\bP_\bu_\bb_\bl_\bi_\bc);\n-77\n-86 _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bL_\bo_\bc_\ba_\bl_\bI_\bn_\bd_\be_\bx(size_t localIndex, const _\bA_\bt_\bt_\br_\bi_\bb_\bu_\bt_\be& _\ba_\bt_\bt_\br_\bi_\bb_\bu_\bt_\be, bool\n-_\bi_\bs_\bP_\bu_\bb_\bl_\bi_\bc=true);\n-92 _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bL_\bo_\bc_\ba_\bl_\bI_\bn_\bd_\be_\bx();\n-93\n-94#if 0\n-104 _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bL_\bo_\bc_\ba_\bl_\bI_\bn_\bd_\be_\bx(const _\bA_\bt_\bt_\br_\bi_\bb_\bu_\bt_\be& _\ba_\bt_\bt_\br_\bi_\bb_\bu_\bt_\be, size_t _\bl_\bo_\bc_\ba_\bl, bool\n-_\bi_\bs_\bP_\bu_\bb_\bl_\bi_\bc);\n-105#endif\n-106\n-111 inline const _\bA_\bt_\bt_\br_\bi_\bb_\bu_\bt_\be _\ba_\bt_\bt_\br_\bi_\bb_\bu_\bt_\be() const;\n-112\n-117 inline void _\bs_\be_\bt_\bA_\bt_\bt_\br_\bi_\bb_\bu_\bt_\be(const _\bA_\bt_\bt_\br_\bi_\bb_\bu_\bt_\be& _\ba_\bt_\bt_\br_\bi_\bb_\bu_\bt_\be);\n-118\n-123 inline size_t _\bl_\bo_\bc_\ba_\bl() const;\n-124\n-128 inline operator size_t() const;\n-129\n-135 inline _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bL_\bo_\bc_\ba_\bl_\bI_\bn_\bd_\be_\bx_\b<_\bA_\bt_\bt_\br_\bi_\bb_\bu_\bt_\be_\b>& _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b=(size_t index);\n-136\n-141 inline bool _\bi_\bs_\bP_\bu_\bb_\bl_\bi_\bc() const;\n-142\n-147 inline _\bL_\bo_\bc_\ba_\bl_\bI_\bn_\bd_\be_\bx_\bS_\bt_\ba_\bt_\be _\bs_\bt_\ba_\bt_\be() const;\n-148\n-153 inline void _\bs_\be_\bt_\bS_\bt_\ba_\bt_\be(const _\bL_\bo_\bc_\ba_\bl_\bI_\bn_\bd_\be_\bx_\bS_\bt_\ba_\bt_\be& _\bs_\bt_\ba_\bt_\be);\n-154\n-155 private:\n-157 size_t localIndex_;\n-158\n-160 char attribute_;\n-161\n-163 char public_;\n-164\n-171 char state_;\n-172\n-173 };\n-174\n-175 template\n-_\b1_\b7_\b6 bool _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b=_\b=(const _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bL_\bo_\bc_\ba_\bl_\bI_\bn_\bd_\be_\bx_\b<_\bT_\b>& p1,\n-177 const _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bL_\bo_\bc_\ba_\bl_\bI_\bn_\bd_\be_\bx_\b<_\bT_\b>& p2)\n-178 {\n-179 if(p1._\bl_\bo_\bc_\ba_\bl()!=p2._\bl_\bo_\bc_\ba_\bl())\n-180 return false;\n-181 if(p1._\ba_\bt_\bt_\br_\bi_\bb_\bu_\bt_\be()!=p2._\ba_\bt_\bt_\br_\bi_\bb_\bu_\bt_\be())\n-182 return false;\n-183 if(p1._\bi_\bs_\bP_\bu_\bb_\bl_\bi_\bc()!=p2._\bi_\bs_\bP_\bu_\bb_\bl_\bi_\bc())\n-184 return false;\n-185 return true;\n-186 }\n-187 template\n-_\b1_\b8_\b8 bool _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b!_\b=(const _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bL_\bo_\bc_\ba_\bl_\bI_\bn_\bd_\be_\bx_\b<_\bT_\b>& p1,\n-189 const _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bL_\bo_\bc_\ba_\bl_\bI_\bn_\bd_\be_\bx_\b<_\bT_\b>& p2)\n-190 {\n-191 return !(p1==p2);\n-192 }\n-193\n-194\n-195 template\n-_\b1_\b9_\b6 struct _\bL_\bo_\bc_\ba_\bl_\bI_\bn_\bd_\be_\bx_\bC_\bo_\bm_\bp_\ba_\br_\ba_\bt_\bo_\br<_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bL_\bo_\bc_\ba_\bl_\bI_\bn_\bd_\be_\bx >\n-197 {\n-_\b1_\b9_\b8 static bool _\bc_\bo_\bm_\bp_\ba_\br_\be(const _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bL_\bo_\bc_\ba_\bl_\bI_\bn_\bd_\be_\bx_\b<_\bT_\b>& t1,\n-199 const _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bL_\bo_\bc_\ba_\bl_\bI_\bn_\bd_\be_\bx_\b<_\bT_\b>& t2){\n-200 return t1._\ba_\bt_\bt_\br_\bi_\bb_\bu_\bt_\be()\n-_\b2_\b0_\b9 class _\bM_\bP_\bI_\bT_\br_\ba_\bi_\bt_\bs<_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bL_\bo_\bc_\ba_\bl_\bI_\bn_\bd_\be_\bx >\n-210 {\n-211 public:\n-212 static MPI_Datatype _\bg_\be_\bt_\bT_\by_\bp_\be();\n-213 private:\n-214 static MPI_Datatype type;\n-215\n-216 };\n-217\n-218#endif\n-219\n-220 template\n-_\b2_\b2_\b1 _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bL_\bo_\bc_\ba_\bl_\bI_\bn_\bd_\be_\bx_\b<_\bT_\b>_\b:_\b:_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bL_\bo_\bc_\ba_\bl_\bI_\bn_\bd_\be_\bx(const T& attribute, bool\n-isPublic)\n-222 : localIndex_(0), attribute_(static_cast(attribute)),\n-223 public_(static_cast(isPublic)), state_(static_cast(_\bV_\bA_\bL_\bI_\bD))\n-224 {}\n-225\n-226\n-227 template\n-_\b2_\b2_\b8 _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bL_\bo_\bc_\ba_\bl_\bI_\bn_\bd_\be_\bx_\b<_\bT_\b>_\b:_\b:_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bL_\bo_\bc_\ba_\bl_\bI_\bn_\bd_\be_\bx(size_t local, const T& attribute,\n-bool isPublic)\n-229 : localIndex_(local), attribute_(static_cast(attribute)),\n-230 public_(static_cast(isPublic)), state_(static_cast(_\bV_\bA_\bL_\bI_\bD))\n-231 {}\n-232\n-233 template\n-_\b2_\b3_\b4 _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bL_\bo_\bc_\ba_\bl_\bI_\bn_\bd_\be_\bx_\b<_\bT_\b>_\b:_\b:_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bL_\bo_\bc_\ba_\bl_\bI_\bn_\bd_\be_\bx()\n-235 : localIndex_(0), attribute_(), public_(static_cast(false)),\n-236 state_(static_cast(_\bV_\bA_\bL_\bI_\bD))\n-237 {}\n-238\n-239 template\n-_\b2_\b4_\b0 inline const T _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bL_\bo_\bc_\ba_\bl_\bI_\bn_\bd_\be_\bx_\b<_\bT_\b>_\b:_\b:_\ba_\bt_\bt_\br_\bi_\bb_\bu_\bt_\be() const\n-241 {\n-242 return T(attribute_);\n-243 }\n-244\n-245 template\n-246 inline void\n-_\b2_\b4_\b7 _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bL_\bo_\bc_\ba_\bl_\bI_\bn_\bd_\be_\bx_\b<_\bT_\b>_\b:_\b:_\bs_\be_\bt_\bA_\bt_\bt_\br_\bi_\bb_\bu_\bt_\be(const _\bA_\bt_\bt_\br_\bi_\bb_\bu_\bt_\be& attribute)\n-248 {\n-249 attribute_ = attribute;\n-250 }\n-251\n-252 template\n-_\b2_\b5_\b3 inline size_t _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bL_\bo_\bc_\ba_\bl_\bI_\bn_\bd_\be_\bx_\b<_\bT_\b>_\b:_\b:_\bl_\bo_\bc_\ba_\bl() const\n-254 {\n-255 return localIndex_;\n-256 }\n-257\n-258 template\n-_\b2_\b5_\b9 inline _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bL_\bo_\bc_\ba_\bl_\bI_\bn_\bd_\be_\bx_\b<_\bT_\b>_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br size_t() const\n-260 {\n-261 return localIndex_;\n-262 }\n-263\n-264 template\n-265 inline _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bL_\bo_\bc_\ba_\bl_\bI_\bn_\bd_\be_\bx_\b<_\bT_\b>&\n-_\b2_\b6_\b6 _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bL_\bo_\bc_\ba_\bl_\bI_\bn_\bd_\be_\bx_\b<_\bT_\b>_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b=(size_t index)\n-267 {\n-268 localIndex_=index;\n-269 return *this;\n-270 }\n-271\n-272 template\n-_\b2_\b7_\b3 inline bool _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bL_\bo_\bc_\ba_\bl_\bI_\bn_\bd_\be_\bx_\b<_\bT_\b>_\b:_\b:_\bi_\bs_\bP_\bu_\bb_\bl_\bi_\bc() const\n-274 {\n-275 return static_cast(public_);\n-276 }\n-277\n-278 template\n-_\b2_\b7_\b9 inline _\bL_\bo_\bc_\ba_\bl_\bI_\bn_\bd_\be_\bx_\bS_\bt_\ba_\bt_\be _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bL_\bo_\bc_\ba_\bl_\bI_\bn_\bd_\be_\bx_\b<_\bT_\b>_\b:_\b:_\bs_\bt_\ba_\bt_\be() const\n-280 {\n-281 return _\bL_\bo_\bc_\ba_\bl_\bI_\bn_\bd_\be_\bx_\bS_\bt_\ba_\bt_\be(state_);\n-282 }\n-283\n-284 template\n-_\b2_\b8_\b5 inline void _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bL_\bo_\bc_\ba_\bl_\bI_\bn_\bd_\be_\bx_\b<_\bT_\b>_\b:_\b:_\bs_\be_\bt_\bS_\bt_\ba_\bt_\be(const _\bL_\bo_\bc_\ba_\bl_\bI_\bn_\bd_\be_\bx_\bS_\bt_\ba_\bt_\be& state)\n-286 {\n-287 state_=static_cast(state);\n-288 }\n-289\n-290#if HAVE_MPI\n-291\n-292 template\n-_\b2_\b9_\b3 MPI_Datatype _\bM_\bP_\bI_\bT_\br_\ba_\bi_\bt_\bs_\b<_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bL_\bo_\bc_\ba_\bl_\bI_\bn_\bd_\be_\bx_\b<_\bT_\b> >::getType()\n-294 {\n-295\n-296 if(type==MPI_DATATYPE_NULL) {\n-297 int length = 1;\n-298 MPI_Aint base, disp;\n-299 MPI_Datatype types[1] = {_\bM_\bP_\bI_\bT_\br_\ba_\bi_\bt_\bs_\b<_\bc_\bh_\ba_\br_\b>_\b:_\b:_\bg_\be_\bt_\bT_\by_\bp_\be()};\n-300 _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bL_\bo_\bc_\ba_\bl_\bI_\bn_\bd_\be_\bx_\b<_\bT_\b> rep;\n-301 MPI_Get_address(&rep, &base);\n-302 MPI_Get_address(&(rep.attribute_), &disp);\n-303 disp -= base;\n-304\n-305 MPI_Datatype tmp;\n-306 MPI_Type_create_struct(1, &length, &disp, types, &tmp);\n-307\n-308 MPI_Type_create_resized(tmp, 0, sizeof(_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bL_\bo_\bc_\ba_\bl_\bI_\bn_\bd_\be_\bx_\b<_\bT_\b>), &type);\n-309 MPI_Type_commit(&type);\n-310\n-311 MPI_Type_free(&tmp);\n-312 }\n-313 return type;\n-314 }\n-315\n-316 template\n-_\b3_\b1_\b7 MPI_Datatype _\bM_\bP_\bI_\bT_\br_\ba_\bi_\bt_\bs_\b<_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bL_\bo_\bc_\ba_\bl_\bI_\bn_\bd_\be_\bx_\b<_\bT_\b> >::type = MPI_DATATYPE_NULL;\n-318\n-319#endif // HAVE_MPI\n-320\n-321\n-323} // namespace Dune\n-324\n-325#endif // DUNE_COMMON_PARALLEL_PLOCALINDEX_HH\n-_\bi_\bn_\bd_\be_\bx_\bs_\be_\bt_\b._\bh_\bh\n-Provides a map between global and local indices.\n-_\bl_\bo_\bc_\ba_\bl_\bi_\bn_\bd_\be_\bx_\b._\bh_\bh\n-Provides classes for use as the local index in ParallelIndexSet.\n-_\bm_\bp_\bi_\bt_\br_\ba_\bi_\bt_\bs_\b._\bh_\bh\n-Traits classes for mapping types onto MPI_Datatype.\n-_\bD_\bu_\bn_\be_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b<_\b<\n-std::ostream & operator<<(std::ostream &s, const bigunsignedint< k > &x)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bigunsignedint.hh:278\n-_\bD_\bu_\bn_\be_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b=_\b=\n-EnableIfInterOperable< T1, T2, bool >::type operator==(const\n-ForwardIteratorFacade< T1, V1, R1, D > &lhs, const ForwardIteratorFacade< T2,\n-V2, R2, D > &rhs)\n-Checks for equality.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn iteratorfacades.hh:238\n-_\bD_\bu_\bn_\be_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b!_\b=\n-EnableIfInterOperable< T1, T2, bool >::type operator!=(const\n-ForwardIteratorFacade< T1, V1, R1, D > &lhs, const ForwardIteratorFacade< T2,\n-V2, R2, D > &rhs)\n-Checks for inequality.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn iteratorfacades.hh:260\n-_\bD_\bu_\bn_\be_\b:_\b:_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bL_\bo_\bc_\ba_\bl_\bI_\bn_\bd_\be_\bx_\b:_\b:_\bi_\bs_\bP_\bu_\bb_\bl_\bi_\bc\n-bool isPublic() const\n-Check whether the index might also be known other processes.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn plocalindex.hh:273\n-_\bD_\bu_\bn_\be_\b:_\b:_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bL_\bo_\bc_\ba_\bl_\bI_\bn_\bd_\be_\bx_\b:_\b:_\bs_\be_\bt_\bA_\bt_\bt_\br_\bi_\bb_\bu_\bt_\be\n-void setAttribute(const Attribute &attribute)\n-Set the attribute of the index.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn plocalindex.hh:247\n-_\bD_\bu_\bn_\be_\b:_\b:_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bL_\bo_\bc_\ba_\bl_\bI_\bn_\bd_\be_\bx_\b:_\b:_\bl_\bo_\bc_\ba_\bl\n-size_t local() const\n-get the local index.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn plocalindex.hh:253\n-_\bD_\bu_\bn_\be_\b:_\b:_\bL_\bo_\bc_\ba_\bl_\bI_\bn_\bd_\be_\bx_\bS_\bt_\ba_\bt_\be\n-LocalIndexState\n-The states available for the local indices.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn localindex.hh:28\n-_\bD_\bu_\bn_\be_\b:_\b:_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bL_\bo_\bc_\ba_\bl_\bI_\bn_\bd_\be_\bx_\b:_\b:_\bs_\be_\bt_\bS_\bt_\ba_\bt_\be\n-void setState(const LocalIndexState &state)\n-Set the state.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn plocalindex.hh:285\n-_\bD_\bu_\bn_\be_\b:_\b:_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bL_\bo_\bc_\ba_\bl_\bI_\bn_\bd_\be_\bx_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b=\n-ParallelLocalIndex< Attribute > & operator=(size_t index)\n-Assign a new local index.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn plocalindex.hh:266\n-_\bD_\bu_\bn_\be_\b:_\b:_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bL_\bo_\bc_\ba_\bl_\bI_\bn_\bd_\be_\bx_\b:_\b:_\bs_\bt_\ba_\bt_\be\n-LocalIndexState state() const\n-Get the state.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn plocalindex.hh:279\n-_\bD_\bu_\bn_\be_\b:_\b:_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bL_\bo_\bc_\ba_\bl_\bI_\bn_\bd_\be_\bx_\b:_\b:_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bL_\bo_\bc_\ba_\bl_\bI_\bn_\bd_\be_\bx\n-ParallelLocalIndex()\n-Parameterless constructor.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn plocalindex.hh:234\n-_\bD_\bu_\bn_\be_\b:_\b:_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bL_\bo_\bc_\ba_\bl_\bI_\bn_\bd_\be_\bx_\b:_\b:_\ba_\bt_\bt_\br_\bi_\bb_\bu_\bt_\be\n-const Attribute attribute() const\n-Get the attribute of the index.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn plocalindex.hh:240\n-_\bD_\bu_\bn_\be_\b:_\b:_\bV_\bA_\bL_\bI_\bD\n-@ VALID\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn localindex.hh:28\n+18#include \n+19\n+20#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bp_\br_\bo_\bm_\bo_\bt_\bi_\bo_\bn_\bt_\br_\ba_\bi_\bt_\bs_\b._\bh_\bh>\n+21#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bt_\by_\bp_\be_\bt_\br_\ba_\bi_\bt_\bs_\b._\bh_\bh>\n+22\n+23namespace _\bD_\bu_\bn_\be\n+24{\n+25\n+30 template< unsigned int precision >\n+_\b3_\b1 class _\bG_\bM_\bP_\bF_\bi_\be_\bl_\bd\n+32 : public mpf_class\n+33 {\n+34 typedef mpf_class Base;\n+35\n+36 public:\n+_\b3_\b8 _\bG_\bM_\bP_\bF_\bi_\be_\bl_\bd ()\n+39 : Base(0,precision)\n+40 {}\n+41\n+_\b4_\b5 _\bG_\bM_\bP_\bF_\bi_\be_\bl_\bd ( const char* str )\n+46 : Base(str,precision)\n+47 {}\n+48\n+_\b5_\b2 _\bG_\bM_\bP_\bF_\bi_\be_\bl_\bd ( const std::string& str )\n+53 : Base(str,precision)\n+54 {}\n+55\n+58 template< class T,\n+59 typename EnableIf = typename std::enable_if<\n+60 std::is_convertible::value>::type\n+61 >\n+_\b6_\b2 _\bG_\bM_\bP_\bF_\bi_\be_\bl_\bd ( const T &v )\n+63 : Base( v,precision )\n+64 {}\n+65\n+66 // type conversion operators\n+_\b6_\b7 operator double () const\n+68 {\n+69 return this->get_d();\n+70 }\n+71\n+72 };\n+73\n+74 template \n+_\b7_\b5 struct _\bI_\bs_\bN_\bu_\bm_\bb_\be_\br<_\bG_\bM_\bP_\bF_\bi_\be_\bl_\bd>\n+76 : public std::integral_constant {\n+77 };\n+78\n+79 template< unsigned int precision1, unsigned int precision2 >\n+_\b8_\b0 struct _\bP_\br_\bo_\bm_\bo_\bt_\bi_\bo_\bn_\bT_\br_\ba_\bi_\bt_\bs<_\bG_\bM_\bP_\bF_\bi_\be_\bl_\bd, _\bG_\bM_\bP_\bF_\bi_\be_\bl_\bd>\n+81 {\n+_\b8_\b2 typedef _\bG_\bM_\bP_\bF_\bi_\be_\bl_\bd<(precision1 > precision2 ? precision1 : precision2)>\n+_\bP_\br_\bo_\bm_\bo_\bt_\be_\bd_\bT_\by_\bp_\be;\n+83 };\n+84\n+85 template< unsigned int precision >\n+_\b8_\b6 struct _\bP_\br_\bo_\bm_\bo_\bt_\bi_\bo_\bn_\bT_\br_\ba_\bi_\bt_\bs<_\bG_\bM_\bP_\bF_\bi_\be_\bl_\bd,_\bG_\bM_\bP_\bF_\bi_\be_\bl_\bd>\n+87 {\n+_\b8_\b8 typedef _\bG_\bM_\bP_\bF_\bi_\be_\bl_\bd_\b<_\bp_\br_\be_\bc_\bi_\bs_\bi_\bo_\bn_\b> _\bP_\br_\bo_\bm_\bo_\bt_\be_\bd_\bT_\by_\bp_\be;\n+89 };\n+90\n+91 template< unsigned int precision, class T >\n+_\b9_\b2 struct _\bP_\br_\bo_\bm_\bo_\bt_\bi_\bo_\bn_\bT_\br_\ba_\bi_\bt_\bs<_\bG_\bM_\bP_\bF_\bi_\be_\bl_\bd, T>\n+93 {\n+_\b9_\b4 typedef _\bG_\bM_\bP_\bF_\bi_\be_\bl_\bd_\b<_\bp_\br_\be_\bc_\bi_\bs_\bi_\bo_\bn_\b> _\bP_\br_\bo_\bm_\bo_\bt_\be_\bd_\bT_\by_\bp_\be;\n+95 };\n+96\n+97 template< class T, unsigned int precision >\n+_\b9_\b8 struct _\bP_\br_\bo_\bm_\bo_\bt_\bi_\bo_\bn_\bT_\br_\ba_\bi_\bt_\bs>\n+99 {\n+_\b1_\b0_\b0 typedef _\bG_\bM_\bP_\bF_\bi_\be_\bl_\bd_\b<_\bp_\br_\be_\bc_\bi_\bs_\bi_\bo_\bn_\b> _\bP_\br_\bo_\bm_\bo_\bt_\be_\bd_\bT_\by_\bp_\be;\n+101 };\n+102}\n+103\n+104#endif // HAVE_GMP\n+105\n+106#endif // #ifndef DUNE_GMPFIELD_HH\n+_\bt_\by_\bp_\be_\bt_\br_\ba_\bi_\bt_\bs_\b._\bh_\bh\n+Traits for type conversions and type information.\n+_\bp_\br_\bo_\bm_\bo_\bt_\bi_\bo_\bn_\bt_\br_\ba_\bi_\bt_\bs_\b._\bh_\bh\n+Compute type of the result of an arithmetic operation involving two different\n+number types.\n _\bD_\bu_\bn_\be\n Dune namespace.\n D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn alignedallocator.hh:13\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\bP_\bI_\bT_\br_\ba_\bi_\bt_\bs\n-A traits class describing the mapping of types onto MPI_Datatypes.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mpitraits.hh:41\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\bP_\bI_\bT_\br_\ba_\bi_\bt_\bs_\b:_\b:_\bg_\be_\bt_\bT_\by_\bp_\be\n-static MPI_Datatype getType()\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mpitraits.hh:48\n-_\bD_\bu_\bn_\be_\b:_\b:_\bL_\bo_\bc_\ba_\bl_\bI_\bn_\bd_\be_\bx_\bC_\bo_\bm_\bp_\ba_\br_\ba_\bt_\bo_\br\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn indexset.hh:615\n-_\bD_\bu_\bn_\be_\b:_\b:_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bL_\bo_\bc_\ba_\bl_\bI_\bn_\bd_\be_\bx\n-An index present on the local process with an additional attribute flag.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn plocalindex.hh:52\n-_\bD_\bu_\bn_\be_\b:_\b:_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bL_\bo_\bc_\ba_\bl_\bI_\bn_\bd_\be_\bx_\b:_\b:_\bA_\bt_\bt_\br_\bi_\bb_\bu_\bt_\be\n-T Attribute\n-The type of the attributes. Normally this will be an enumeration like.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn plocalindex.hh:67\n-_\bD_\bu_\bn_\be_\b:_\b:_\bL_\bo_\bc_\ba_\bl_\bI_\bn_\bd_\be_\bx_\bC_\bo_\bm_\bp_\ba_\br_\ba_\bt_\bo_\br_\b<_\b _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bL_\bo_\bc_\ba_\bl_\bI_\bn_\bd_\be_\bx_\b<_\b _\bT_\b _\b>_\b _\b>_\b:_\b:_\bc_\bo_\bm_\bp_\ba_\br_\be\n-static bool compare(const ParallelLocalIndex< T > &t1, const\n-ParallelLocalIndex< T > &t2)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn plocalindex.hh:198\n+_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bs_\bN_\bu_\bm_\bb_\be_\br\n+Whether this type acts as a scalar in the context of (hierarchically blocked)\n+containers.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn typetraits.hh:194\n+_\bD_\bu_\bn_\be_\b:_\b:_\bG_\bM_\bP_\bF_\bi_\be_\bl_\bd\n+Number class for high precision floating point number using the GMP library\n+mpf_class implementation.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn gmpfield.hh:33\n+_\bD_\bu_\bn_\be_\b:_\b:_\bG_\bM_\bP_\bF_\bi_\be_\bl_\bd_\b:_\b:_\bG_\bM_\bP_\bF_\bi_\be_\bl_\bd\n+GMPField(const T &v)\n+initialize from a compatible scalar type\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn gmpfield.hh:62\n+_\bD_\bu_\bn_\be_\b:_\b:_\bG_\bM_\bP_\bF_\bi_\be_\bl_\bd_\b:_\b:_\bG_\bM_\bP_\bF_\bi_\be_\bl_\bd\n+GMPField()\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn gmpfield.hh:38\n+_\bD_\bu_\bn_\be_\b:_\b:_\bG_\bM_\bP_\bF_\bi_\be_\bl_\bd_\b:_\b:_\bG_\bM_\bP_\bF_\bi_\be_\bl_\bd\n+GMPField(const std::string &str)\n+initialize from a string\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn gmpfield.hh:52\n+_\bD_\bu_\bn_\be_\b:_\b:_\bG_\bM_\bP_\bF_\bi_\be_\bl_\bd_\b:_\b:_\bG_\bM_\bP_\bF_\bi_\be_\bl_\bd\n+GMPField(const char *str)\n+initialize from a string\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn gmpfield.hh:45\n+_\bD_\bu_\bn_\be_\b:_\b:_\bP_\br_\bo_\bm_\bo_\bt_\bi_\bo_\bn_\bT_\br_\ba_\bi_\bt_\bs_\b<_\b _\bG_\bM_\bP_\bF_\bi_\be_\bl_\bd_\b<_\b _\bp_\br_\be_\bc_\bi_\bs_\bi_\bo_\bn_\b _\b>_\b,_\b _\bG_\bM_\bP_\bF_\bi_\be_\bl_\bd_\b<_\b _\bp_\br_\be_\bc_\bi_\bs_\bi_\bo_\bn_\b _\b>_\b _\b>_\b:_\b:\n+_\bP_\br_\bo_\bm_\bo_\bt_\be_\bd_\bT_\by_\bp_\be\n+GMPField< precision > PromotedType\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn gmpfield.hh:88\n+_\bD_\bu_\bn_\be_\b:_\b:_\bP_\br_\bo_\bm_\bo_\bt_\bi_\bo_\bn_\bT_\br_\ba_\bi_\bt_\bs_\b<_\b _\bG_\bM_\bP_\bF_\bi_\be_\bl_\bd_\b<_\b _\bp_\br_\be_\bc_\bi_\bs_\bi_\bo_\bn_\b _\b>_\b,_\b _\bT_\b _\b>_\b:_\b:_\bP_\br_\bo_\bm_\bo_\bt_\be_\bd_\bT_\by_\bp_\be\n+GMPField< precision > PromotedType\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn gmpfield.hh:94\n+_\bD_\bu_\bn_\be_\b:_\b:_\bP_\br_\bo_\bm_\bo_\bt_\bi_\bo_\bn_\bT_\br_\ba_\bi_\bt_\bs_\b<_\b _\bT_\b,_\b _\bG_\bM_\bP_\bF_\bi_\be_\bl_\bd_\b<_\b _\bp_\br_\be_\bc_\bi_\bs_\bi_\bo_\bn_\b _\b>_\b _\b>_\b:_\b:_\bP_\br_\bo_\bm_\bo_\bt_\be_\bd_\bT_\by_\bp_\be\n+GMPField< precision > PromotedType\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn gmpfield.hh:100\n+_\bD_\bu_\bn_\be_\b:_\b:_\bP_\br_\bo_\bm_\bo_\bt_\bi_\bo_\bn_\bT_\br_\ba_\bi_\bt_\bs\n+Compute type of the result of an arithmetic operation involving two different\n+number types.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn promotiontraits.hh:27\n ===============================================================================\n Generated by\u00a0_\b[_\bd_\bo_\bx_\by_\bg_\be_\bn_\b] 1.9.8\n"}]}, {"source1": "./usr/share/doc/libdune-common-doc/doxygen/a00026.html", "source2": "./usr/share/doc/libdune-common-doc/doxygen/a00026.html", "unified_diff": "@@ -1,15 +1,15 @@\n \n \n \n \n \n \n \n-dune-common: localindex.hh File Reference\n+dune-common: stdthread.cc File Reference\n \n \n \n \n \n \n \n@@ -65,55 +65,41 @@\n \n \n \n \n \n \n \n \n+
stdthread.cc File Reference
\n \n
\n-\n-

Provides classes for use as the local index in ParallelIndexSet. \n-More...

\n-
#include <cstddef>
\n-
\n-

Go to the source code of this file.

\n-\n-\n-\n-\n-\n-

\n-Classes

class  Dune::LocalIndex
 An index present on the local process. More...
 
\n+
#include <cstdlib>
\n+#include <iostream>
\n+#include <mutex>
\n+#include <ostream>
\n+#include <dune/common/stdthread.hh>
\n+
\n \n \n \n \n

\n Namespaces

namespace  Dune
 Dune namespace.
 
\n-\n-\n-\n-\n+\n+\n+\n

\n-Enumerations

enum  Dune::LocalIndexState { Dune::VALID\n-, Dune::DELETED\n- }
 The states available for the local indices. More...
 

\n+Functions

void Dune::doAssertCallOnce (const char *file, int line, const char *function)
 
\n-

Detailed Description

\n-

Provides classes for use as the local index in ParallelIndexSet.

\n-
Author
Markus Blatt
\n-
\n+\n \n
\n Generated by \"doxygen\"/ 1.9.8\n
\n \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,31 +1,22 @@\n dune-common\u00a02.10\n Loading...\n Searching...\n No Matches\n * _\bd_\bu_\bn_\be\n * _\bc_\bo_\bm_\bm_\bo_\bn\n- * _\bp_\ba_\br_\ba_\bl_\bl_\be_\bl\n-_\bC_\bl_\ba_\bs_\bs_\be_\bs | _\bN_\ba_\bm_\be_\bs_\bp_\ba_\bc_\be_\bs | _\bE_\bn_\bu_\bm_\be_\br_\ba_\bt_\bi_\bo_\bn_\bs\n-localindex.hh File Reference\n-_\bC_\bo_\bm_\bm_\bo_\bn \u00bb _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\b _\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn \u00bb _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\b _\bC_\bo_\bm_\bp_\bu_\bt_\bi_\bn_\bg_\b _\bb_\ba_\bs_\be_\bd_\b _\bo_\bn_\b _\bI_\bn_\bd_\be_\bx_\bs_\be_\bt_\bs\n-Provides classes for use as the local index in ParallelIndexSet. _\bM_\bo_\br_\be_\b._\b._\b.\n-#include \n-_\bG_\bo_\b _\bt_\bo_\b _\bt_\bh_\be_\b _\bs_\bo_\bu_\br_\bc_\be_\b _\bc_\bo_\bd_\be_\b _\bo_\bf_\b _\bt_\bh_\bi_\bs_\b _\bf_\bi_\bl_\be_\b.\n-C\bCl\bla\bas\bss\bse\bes\bs\n-class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bL_\bo_\bc_\ba_\bl_\bI_\bn_\bd_\be_\bx\n-\u00a0 An index present on the local process. _\bM_\bo_\br_\be_\b._\b._\b.\n-\u00a0\n+_\bN_\ba_\bm_\be_\bs_\bp_\ba_\bc_\be_\bs | _\bF_\bu_\bn_\bc_\bt_\bi_\bo_\bn_\bs\n+stdthread.cc File Reference\n+#include \n+#include \n+#include \n+#include \n+#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bs_\bt_\bd_\bt_\bh_\br_\be_\ba_\bd_\b._\bh_\bh>\n N\bNa\bam\bme\bes\bsp\bpa\bac\bce\bes\bs\n namespace \u00a0 _\bD_\bu_\bn_\be\n \u00a0 _\bD_\bu_\bn_\be namespace.\n \u00a0\n-E\bEn\bnu\bum\bme\ber\bra\bat\bti\bio\bon\bns\bs\n-enum \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bL_\bo_\bc_\ba_\bl_\bI_\bn_\bd_\be_\bx_\bS_\bt_\ba_\bt_\be { _\bD_\bu_\bn_\be_\b:_\b:_\bV_\bA_\bL_\bI_\bD , _\bD_\bu_\bn_\be_\b:_\b:_\bD_\bE_\bL_\bE_\bT_\bE_\bD }\n-\u00a0 The states available for the local indices. _\bM_\bo_\br_\be_\b._\b._\b.\n+F\bFu\bun\bnc\bct\bti\bio\bon\bns\bs\n+void\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bd_\bo_\bA_\bs_\bs_\be_\br_\bt_\bC_\ba_\bl_\bl_\bO_\bn_\bc_\be (const char *file, int line, const char *function)\n \u00a0\n-*\b**\b**\b**\b**\b* D\bDe\bet\bta\bai\bil\ble\bed\bd D\bDe\bes\bsc\bcr\bri\bip\bpt\bti\bio\bon\bn *\b**\b**\b**\b**\b*\n-Provides classes for use as the local index in ParallelIndexSet.\n- Author\n- Markus Blatt\n ===============================================================================\n Generated by\u00a0_\b[_\bd_\bo_\bx_\by_\bg_\be_\bn_\b] 1.9.8\n"}]}, {"source1": "./usr/share/doc/libdune-common-doc/doxygen/a00029.html", "source2": "./usr/share/doc/libdune-common-doc/doxygen/a00029.html", "unified_diff": "@@ -1,15 +1,15 @@\n \n \n \n \n \n \n \n-dune-common: collectivecommunication.hh File Reference\n+dune-common: proxymemberaccess.hh File Reference\n \n \n \n \n \n \n \n@@ -65,24 +65,47 @@\n \n \n \n \n \n \n \n
\n-
collectivecommunication.hh File Reference
\n+ \n+
proxymemberaccess.hh File Reference
\n
\n
\n-
#include <dune/common/parallel/communication.hh>
\n+\n+

infrastructure for supporting operator->() on both references and proxies \n+More...

\n+
#include <type_traits>
\n+#include <utility>
\n
\n

Go to the source code of this file.

\n-
\n+\n+\n+\n+\n+\n+

\n+Namespaces

namespace  Dune
 Dune namespace.
 
\n+\n+\n+\n+\n+\n+

\n+Functions

template<typename T >
pointer_or_proxy_holder Dune::handle_proxy_member_access (T &&t)
 Transparent support for providing member access to both lvalues and rvalues (temporary proxies).
 
\n+

Detailed Description

\n+

infrastructure for supporting operator->() on both references and proxies

\n+
\n \n
\n Generated by \"doxygen\"/ 1.9.8\n
\n \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,12 +1,28 @@\n dune-common\u00a02.10\n Loading...\n Searching...\n No Matches\n * _\bd_\bu_\bn_\be\n * _\bc_\bo_\bm_\bm_\bo_\bn\n- * _\bp_\ba_\br_\ba_\bl_\bl_\be_\bl\n-collectivecommunication.hh File Reference\n-#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bp_\ba_\br_\ba_\bl_\bl_\be_\bl_\b/_\bc_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b._\bh_\bh>\n+_\bN_\ba_\bm_\be_\bs_\bp_\ba_\bc_\be_\bs | _\bF_\bu_\bn_\bc_\bt_\bi_\bo_\bn_\bs\n+proxymemberaccess.hh File Reference\n+_\bC_\bo_\bm_\bm_\bo_\bn \u00bb _\bU_\bt_\bi_\bl_\bi_\bt_\bi_\be_\bs \u00bb _\bC_\b+_\b+_\b _\bu_\bt_\bi_\bl_\bi_\bt_\bi_\be_\bs_\b _\ba_\bn_\bd_\b _\bb_\ba_\bc_\bk_\bp_\bo_\br_\bt_\bs\n+infrastructure for supporting operator->() on both references and proxies\n+_\bM_\bo_\br_\be_\b._\b._\b.\n+#include \n+#include \n _\bG_\bo_\b _\bt_\bo_\b _\bt_\bh_\be_\b _\bs_\bo_\bu_\br_\bc_\be_\b _\bc_\bo_\bd_\be_\b _\bo_\bf_\b _\bt_\bh_\bi_\bs_\b _\bf_\bi_\bl_\be_\b.\n+N\bNa\bam\bme\bes\bsp\bpa\bac\bce\bes\bs\n+namespace \u00a0 _\bD_\bu_\bn_\be\n+\u00a0 _\bD_\bu_\bn_\be namespace.\n+\u00a0\n+F\bFu\bun\bnc\bct\bti\bio\bon\bns\bs\n+template\n+pointer_or_proxy_holder\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bh_\ba_\bn_\bd_\bl_\be_\b__\bp_\br_\bo_\bx_\by_\b__\bm_\be_\bm_\bb_\be_\br_\b__\ba_\bc_\bc_\be_\bs_\bs (T &&t)\n+\u00a0 Transparent support for providing member access to\n+ both lvalues and rvalues (temporary proxies).\n+\u00a0\n+*\b**\b**\b**\b**\b* D\bDe\bet\bta\bai\bil\ble\bed\bd D\bDe\bes\bsc\bcr\bri\bip\bpt\bti\bio\bon\bn *\b**\b**\b**\b**\b*\n+infrastructure for supporting operator->() on both references and proxies\n ===============================================================================\n Generated by\u00a0_\b[_\bd_\bo_\bx_\by_\bg_\be_\bn_\b] 1.9.8\n"}]}, {"source1": "./usr/share/doc/libdune-common-doc/doxygen/a00029_source.html", "source2": "./usr/share/doc/libdune-common-doc/doxygen/a00029_source.html", "unified_diff": "@@ -1,15 +1,15 @@\n \n \n \n \n \n \n \n-dune-common: collectivecommunication.hh Source File\n+dune-common: proxymemberaccess.hh Source File\n \n \n \n \n \n \n \n@@ -70,27 +70,111 @@\n \n \n \n \n \n \n \n
\n-
collectivecommunication.hh
\n+
proxymemberaccess.hh
\n
\n
\n-Go to the documentation of this file.
1// SPDX-FileCopyrightInfo: Copyright \u00a9 DUNE Project contributors, see file LICENSE.md in module root
\n-
2// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception
\n-
3// Will be removed after the 2.7 release
\n-
4#warning "Deprecated header, use #include <dune/common/parallel/communication.hh> instead!"
\n-\n-
Implements an utility class that provides collective communication methods for sequential programs.
\n+Go to the documentation of this file.
1// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
\n+
2// vi: set et ts=4 sw=2 sts=2:
\n+
3// SPDX-FileCopyrightInfo: Copyright \u00a9 DUNE Project contributors, see file LICENSE.md in module root
\n+
4// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception
\n+
5#ifndef DUNE_COMMON_PROXYMEMBERACCESS_HH
\n+
6#define DUNE_COMMON_PROXYMEMBERACCESS_HH
\n+
7
\n+
14#include <type_traits>
\n+
15#include <utility>
\n+
16
\n+
17namespace Dune {
\n+
18
\n+
19 namespace Impl {
\n+
20
\n+
21 // helper struct to store a temporary / proxy
\n+
22 // for the duration of the member access
\n+
23 template<typename T>
\n+
24 struct member_access_proxy_holder
\n+
25 {
\n+
26
\n+
27 // only support moving the temporary into the holder object
\n+
28 member_access_proxy_holder(T&& t)
\n+
29 : _t(std::move(t))
\n+
30 {}
\n+
31
\n+
32 // The object is fundamentally a temporary, i.e. an rvalue,
\n+
33 //
\n+
34 const T* operator->() const
\n+
35 {
\n+
36 return &_t;
\n+
37 }
\n+
38
\n+
39 T _t;
\n+
40
\n+
41 };
\n+
42
\n+
43 } // end Impl namespace
\n+
44
\n+
45
\n+
46#ifdef DOXYGEN
\n+
47
\n+
49
\n+
79 template<typename T>
\n+
80 pointer_or_proxy_holder
\n+\n+
82
\n+
83#else // DOXYGEN
\n+
84
\n+
85
\n+
86 // This version matches lvalues (the C++ type deduction rules state that
\n+
87 // the T&& signature deduces to a reference iff the argument is an lvalue).
\n+
88 // As the argument is an lvalue, we do not have to worry about its lifetime
\n+
89 // and can just return its address.
\n+
90 template<typename T>
\n+
91 inline typename std::enable_if<
\n+
92 std::is_lvalue_reference<T>::value,
\n+
93 typename std::add_pointer<
\n+
94 typename std::remove_reference<
\n+
95 T
\n+
96 >::type
\n+
97 >::type
\n+
98 >::type
\n+\n+
100 {
\n+
101 return &target;
\n+
102 }
\n+
103
\n+
104 // This version matches rvalues (the C++ type deduction rules state that
\n+
105 // the T&& signature deduces to a non-reference iff the argument is an rvalue).
\n+
106 // In this case, we have to capture the rvalue in a new object to make sure it
\n+
107 // is kept alive for the duration of the member access. For this purpose, we move
\n+
108 // it into a member_access_proxy_holder instance.
\n+
109 template<typename T>
\n+
110 inline typename std::enable_if<
\n+
111 !std::is_lvalue_reference<T>::value,
\n+
112 Impl::member_access_proxy_holder<T>
\n+
113 >::type
\n+\n+
115 {
\n+
116 return {std::forward<T>(target)};
\n+
117 }
\n+
118
\n+
119#endif // DOXYGEN
\n+
120
\n+
121} // namespace Dune
\n+
122
\n+
123#endif // DUNE_COMMON_PROXYMEMBERACCESS_HH
\n+
pointer_or_proxy_holder handle_proxy_member_access(T &&t)
Transparent support for providing member access to both lvalues and rvalues (temporary proxies).
\n+
STL namespace.
\n+
Dune namespace.
Definition alignedallocator.hh:13
\n
\n \n
\n Generated by \"doxygen\"/ 1.9.8\n
\n \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,21 +1,110 @@\n dune-common\u00a02.10\n Loading...\n Searching...\n No Matches\n * _\bd_\bu_\bn_\be\n * _\bc_\bo_\bm_\bm_\bo_\bn\n- * _\bp_\ba_\br_\ba_\bl_\bl_\be_\bl\n-collectivecommunication.hh\n+proxymemberaccess.hh\n _\bG_\bo_\b _\bt_\bo_\b _\bt_\bh_\be_\b _\bd_\bo_\bc_\bu_\bm_\be_\bn_\bt_\ba_\bt_\bi_\bo_\bn_\b _\bo_\bf_\b _\bt_\bh_\bi_\bs_\b _\bf_\bi_\bl_\be_\b.\n-1// SPDX-FileCopyrightInfo: Copyright \u00c2\u00a9 DUNE Project contributors, see file\n+1// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-\n+2// vi: set et ts=4 sw=2 sts=2:\n+3// SPDX-FileCopyrightInfo: Copyright \u00c2\u00a9 DUNE Project contributors, see file\n LICENSE.md in module root\n-2// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception\n-3// Will be removed after the 2.7 release\n-4#warning \"Deprecated header, use #include instead!\"\n-5#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bp_\ba_\br_\ba_\bl_\bl_\be_\bl_\b/_\bc_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b._\bh_\bh>\n-_\bc_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b._\bh_\bh\n-Implements an utility class that provides collective communication methods for\n-sequential programs.\n+4// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception\n+5#ifndef DUNE_COMMON_PROXYMEMBERACCESS_HH\n+6#define DUNE_COMMON_PROXYMEMBERACCESS_HH\n+7\n+14#include \n+15#include \n+16\n+17namespace _\bD_\bu_\bn_\be {\n+18\n+19 namespace Impl {\n+20\n+21 // helper struct to store a temporary / proxy\n+22 // for the duration of the member access\n+23 template\n+24 struct member_access_proxy_holder\n+25 {\n+26\n+27 // only support moving the temporary into the holder object\n+28 member_access_proxy_holder(T&& t)\n+29 : _t(_\bs_\bt_\bd::move(t))\n+30 {}\n+31\n+32 // The object is fundamentally a temporary, i.e. an rvalue,\n+33 //\n+34 const T* operator->() const\n+35 {\n+36 return &_t;\n+37 }\n+38\n+39 T _t;\n+40\n+41 };\n+42\n+43 } // end Impl namespace\n+44\n+45\n+46#ifdef DOXYGEN\n+47\n+49\n+79 template\n+80 pointer_or_proxy_holder\n+_\b8_\b1 _\bh_\ba_\bn_\bd_\bl_\be_\b__\bp_\br_\bo_\bx_\by_\b__\bm_\be_\bm_\bb_\be_\br_\b__\ba_\bc_\bc_\be_\bs_\bs(T&& t);\n+82\n+83#else // DOXYGEN\n+84\n+85\n+86 // This version matches lvalues (the C++ type deduction rules state that\n+87 // the T&& signature deduces to a reference iff the argument is an lvalue).\n+88 // As the argument is an lvalue, we do not have to worry about its lifetime\n+89 // and can just return its address.\n+90 template\n+91 inline typename std::enable_if<\n+92 std::is_lvalue_reference::value,\n+93 typename std::add_pointer<\n+94 typename std::remove_reference<\n+95 T\n+96 >::type\n+97 >::type\n+98 >::type\n+99 _\bh_\ba_\bn_\bd_\bl_\be_\b__\bp_\br_\bo_\bx_\by_\b__\bm_\be_\bm_\bb_\be_\br_\b__\ba_\bc_\bc_\be_\bs_\bs(T&& target)\n+100 {\n+101 return ⌖\n+102 }\n+103\n+104 // This version matches rvalues (the C++ type deduction rules state that\n+105 // the T&& signature deduces to a non-reference iff the argument is an\n+rvalue).\n+106 // In this case, we have to capture the rvalue in a new object to make sure\n+it\n+107 // is kept alive for the duration of the member access. For this purpose,\n+we move\n+108 // it into a member_access_proxy_holder instance.\n+109 template\n+110 inline typename std::enable_if<\n+111 !std::is_lvalue_reference::value,\n+112 Impl::member_access_proxy_holder\n+113 >::type\n+114 _\bh_\ba_\bn_\bd_\bl_\be_\b__\bp_\br_\bo_\bx_\by_\b__\bm_\be_\bm_\bb_\be_\br_\b__\ba_\bc_\bc_\be_\bs_\bs(T&& target)\n+115 {\n+116 return {std::forward(target)};\n+117 }\n+118\n+119#endif // DOXYGEN\n+120\n+121} // namespace Dune\n+122\n+123#endif // DUNE_COMMON_PROXYMEMBERACCESS_HH\n+_\bD_\bu_\bn_\be_\b:_\b:_\bh_\ba_\bn_\bd_\bl_\be_\b__\bp_\br_\bo_\bx_\by_\b__\bm_\be_\bm_\bb_\be_\br_\b__\ba_\bc_\bc_\be_\bs_\bs\n+pointer_or_proxy_holder handle_proxy_member_access(T &&t)\n+Transparent support for providing member access to both lvalues and rvalues\n+(temporary proxies).\n+_\bs_\bt_\bd\n+STL namespace.\n+_\bD_\bu_\bn_\be\n+Dune namespace.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn alignedallocator.hh:13\n ===============================================================================\n Generated by\u00a0_\b[_\bd_\bo_\bx_\by_\bg_\be_\bn_\b] 1.9.8\n"}]}, {"source1": "./usr/share/doc/libdune-common-doc/doxygen/a00032.html", "source2": "./usr/share/doc/libdune-common-doc/doxygen/a00032.html", "unified_diff": "@@ -1,15 +1,15 @@\n \n \n \n \n \n \n \n-dune-common: variablesizecommunicator.hh File Reference\n+dune-common: deprecated.hh File Reference\n \n \n \n \n \n \n \n@@ -65,79 +65,40 @@\n
\n \n \n \n \n \n \n
\n \n-
variablesizecommunicator.hh File Reference
\n+Macros
\n+
deprecated.hh File Reference
\n \n
\n \n-

A communicator that only needs to know the number of elements per index at the sender side. \n+

Definition of the DUNE_NO_DEPRECATED_* macros. \n More...

\n-
#include <algorithm>
\n-#include <cassert>
\n-#include <cstddef>
\n-#include <functional>
\n-#include <map>
\n-#include <memory>
\n-#include <utility>
\n-#include <vector>
\n-#include <mpi.h>
\n-#include <dune/common/concept.hh>
\n-#include <dune/common/parallel/interface.hh>
\n-#include <dune/common/parallel/mpitraits.hh>
\n-
\n+\n

Go to the source code of this file.

\n \n-\n-\n-\n-\n-\n-\n-

\n-Classes

struct  Dune::Concept::HasFixedSize
 
class  Dune::VariableSizeCommunicator< Allocator >
 A buffered communicator where the amount of data sent does not have to be known a priori. More...
 
\n-\n-\n-\n-\n-\n-\n-\n+\n+\n+\n+\n+\n+\n+\n

\n-Namespaces

namespace  Dune
 Dune namespace.
 
namespace  Dune::Concept
 Namespace for concepts.
 

\n+Macros

#define DUNE_NO_DEPRECATED_BEGIN   ...
 Ignore deprecation warnings (start)
 
#define DUNE_NO_DEPRECATED_END   ...
 Ignore deprecation warnings (end)
 
\n

Detailed Description

\n-

A communicator that only needs to know the number of elements per index at the sender side.

\n-
Author
Markus Blatt
\n-

Variable Documentation

\n-\n-

◆ fixedSize

\n-\n-
\n-
\n- \n- \n- \n- \n-
std::size_t fixedSize
\n-
\n-\n-

The number of data items per index if it is fixed, 0 otherwise.

\n-\n-
\n-
\n-
\n+

Definition of the DUNE_NO_DEPRECATED_* macros.

\n+
\n \n
\n Generated by \"doxygen\"/ 1.9.8\n
\n \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,50 +1,21 @@\n dune-common\u00a02.10\n Loading...\n Searching...\n No Matches\n * _\bd_\bu_\bn_\be\n * _\bc_\bo_\bm_\bm_\bo_\bn\n- * _\bp_\ba_\br_\ba_\bl_\bl_\be_\bl\n-_\bC_\bl_\ba_\bs_\bs_\be_\bs | _\bN_\ba_\bm_\be_\bs_\bp_\ba_\bc_\be_\bs\n-variablesizecommunicator.hh File Reference\n-_\bC_\bo_\bm_\bm_\bo_\bn \u00bb _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\b _\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn \u00bb _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\b _\bC_\bo_\bm_\bp_\bu_\bt_\bi_\bn_\bg_\b _\bb_\ba_\bs_\be_\bd_\b _\bo_\bn_\b _\bI_\bn_\bd_\be_\bx_\bs_\be_\bt_\bs\n-A communicator that only needs to know the number of elements per index at the\n-sender side. _\bM_\bo_\br_\be_\b._\b._\b.\n-#include \n-#include \n-#include \n-#include \n-#include \n-#include \n-#include \n-#include \n-#include \n-#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bc_\bo_\bn_\bc_\be_\bp_\bt_\b._\bh_\bh>\n-#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bp_\ba_\br_\ba_\bl_\bl_\be_\bl_\b/_\bi_\bn_\bt_\be_\br_\bf_\ba_\bc_\be_\b._\bh_\bh>\n-#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bp_\ba_\br_\ba_\bl_\bl_\be_\bl_\b/_\bm_\bp_\bi_\bt_\br_\ba_\bi_\bt_\bs_\b._\bh_\bh>\n+_\bM_\ba_\bc_\br_\bo_\bs\n+deprecated.hh File Reference\n+Definition of the DUNE_NO_DEPRECATED_* macros. _\bM_\bo_\br_\be_\b._\b._\b.\n _\bG_\bo_\b _\bt_\bo_\b _\bt_\bh_\be_\b _\bs_\bo_\bu_\br_\bc_\be_\b _\bc_\bo_\bd_\be_\b _\bo_\bf_\b _\bt_\bh_\bi_\bs_\b _\bf_\bi_\bl_\be_\b.\n-C\bCl\bla\bas\bss\bse\bes\bs\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bn_\bc_\be_\bp_\bt_\b:_\b:_\bH_\ba_\bs_\bF_\bi_\bx_\be_\bd_\bS_\bi_\bz_\be\n+M\bMa\bac\bcr\bro\bos\bs\n+#define\u00a0 _\bD_\bU_\bN_\bE_\b__\bN_\bO_\b__\bD_\bE_\bP_\bR_\bE_\bC_\bA_\bT_\bE_\bD_\b__\bB_\bE_\bG_\bI_\bN\u00a0\u00a0\u00a0...\n+\u00a0 Ignore deprecation warnings (start)\n \u00a0\n- class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bV_\ba_\br_\bi_\ba_\bb_\bl_\be_\bS_\bi_\bz_\be_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bo_\br_\b<_\b _\bA_\bl_\bl_\bo_\bc_\ba_\bt_\bo_\br_\b _\b>\n-\u00a0 A buffered communicator where the amount of data sent does not have to\n- be known a priori. _\bM_\bo_\br_\be_\b._\b._\b.\n-\u00a0\n-N\bNa\bam\bme\bes\bsp\bpa\bac\bce\bes\bs\n-namespace \u00a0 _\bD_\bu_\bn_\be\n-\u00a0 _\bD_\bu_\bn_\be namespace.\n-\u00a0\n-namespace \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bn_\bc_\be_\bp_\bt\n-\u00a0 Namespace for concepts.\n+#define\u00a0 _\bD_\bU_\bN_\bE_\b__\bN_\bO_\b__\bD_\bE_\bP_\bR_\bE_\bC_\bA_\bT_\bE_\bD_\b__\bE_\bN_\bD\u00a0\u00a0\u00a0...\n+\u00a0 Ignore deprecation warnings (end)\n \u00a0\n *\b**\b**\b**\b**\b* D\bDe\bet\bta\bai\bil\ble\bed\bd D\bDe\bes\bsc\bcr\bri\bip\bpt\bti\bio\bon\bn *\b**\b**\b**\b**\b*\n-A communicator that only needs to know the number of elements per index at the\n-sender side.\n- Author\n- Markus Blatt\n-*\b**\b**\b**\b**\b* V\bVa\bar\bri\bia\bab\bbl\ble\be D\bDo\boc\bcu\bum\bme\ben\bnt\bta\bat\bti\bio\bon\bn *\b**\b**\b**\b**\b*\n-*\b**\b**\b**\b**\b* _\b?\b\u25c6_\b?\b\u00a0f\bfi\bix\bxe\bed\bdS\bSi\biz\bze\be *\b**\b**\b**\b**\b*\n-std::size_t fixedSize\n-The number of data items per index if it is fixed, 0 otherwise.\n+Definition of the DUNE_NO_DEPRECATED_* macros.\n ===============================================================================\n Generated by\u00a0_\b[_\bd_\bo_\bx_\by_\bg_\be_\bn_\b] 1.9.8\n"}]}, {"source1": "./usr/share/doc/libdune-common-doc/doxygen/a00032_source.html", "source2": "./usr/share/doc/libdune-common-doc/doxygen/a00032_source.html", "unified_diff": "@@ -1,15 +1,15 @@\n \n \n \n \n \n \n \n-dune-common: variablesizecommunicator.hh Source File\n+dune-common: deprecated.hh Source File\n \n \n \n \n \n \n \n@@ -70,914 +70,56 @@\n \n \n \n \n \n \n \n
\n-
variablesizecommunicator.hh
\n+
deprecated.hh
\n
\n
\n Go to the documentation of this file.
1// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
\n
2// vi: set et ts=4 sw=2 sts=2:
\n
3// SPDX-FileCopyrightInfo: Copyright \u00a9 DUNE Project contributors, see file LICENSE.md in module root
\n
4// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception
\n-
5#ifndef DUNE_COMMON_PARALLEL_VARIABLESIZECOMMUNICATOR_HH
\n-
6#define DUNE_COMMON_PARALLEL_VARIABLESIZECOMMUNICATOR_HH
\n+
5#ifndef DUNE_DEPRECATED_HH
\n+
6#define DUNE_DEPRECATED_HH
\n
7
\n-
8#if HAVE_MPI
\n-
9
\n-
10#include <algorithm>
\n-
11#include <cassert>
\n-
12#include <cstddef>
\n-
13#include <functional>
\n-
14#include <map>
\n-
15#include <memory>
\n-
16#include <utility>
\n-
17#include <vector>
\n-
18
\n-
19#include <mpi.h>
\n-
20
\n-\n-\n-\n-
24
\n-
37namespace Dune
\n-
38{
\n-
39
\n-
40namespace Concept {
\n-
41
\n-
\n-\n-
43 template <typename H> auto require(H &&h) -> decltype(h.fixedSize());
\n-
44};
\n-
\n-
45
\n-
46} // namespace Concept
\n-
47
\n-
48namespace Impl {
\n-
49
\n-
50template <typename H,
\n-
51 std::enable_if_t<models<Concept::HasFixedSize, H>(), int> = 0>
\n-
52constexpr bool callFixedSize(H &&handle) {
\n-
53 return handle.fixedSize();
\n-
54}
\n-
55
\n-
56} // namespace Impl
\n-
57
\n-
58namespace
\n-
59{
\n-
64template<class T, class Allocator=std::allocator<T> >
\n-
65class MessageBuffer
\n-
66{
\n-
67public:
\n-
72 explicit MessageBuffer(int size)
\n-
73 : buffer_(new T[size]), size_(size), position_(0)
\n-
74 {}
\n-
79 explicit MessageBuffer(const MessageBuffer& o)
\n-
80 : buffer_(new T[o.size_]), size_(o.size_), position_(o.position_)
\n-
81 {
\n-
82 }
\n-
84 ~MessageBuffer()
\n-
85 {
\n-
86 delete[] buffer_;
\n-
87 }
\n-
92 void write(const T& data)
\n-
93 {
\n-
94 buffer_[position_++]=data;
\n-
95 }
\n-
96
\n-
101 void read(T& data)
\n-
102 {
\n-
103 data=buffer_[position_++];
\n-
104 }
\n-
105
\n-
111 void reset()
\n-
112 {
\n-
113 position_=0;
\n-
114 }
\n-
115
\n-
120 bool finished()
\n-
121 {
\n-
122 return position_==size_;
\n-
123 }
\n-
124
\n-
130 bool hasSpaceForItems(int noItems)
\n-
131 {
\n-
132 return position_+noItems<=size_;
\n-
133 }
\n-
138 std::size_t size() const
\n-
139 {
\n-
140 return size_;
\n-
141 }
\n-
146 operator T*()
\n-
147 {
\n-
148 return buffer_;
\n-
149 }
\n-
150
\n-
151private:
\n-
155 T* buffer_;
\n-
159 std::size_t size_;
\n-
163 std::size_t position_;
\n-
164};
\n-
165
\n-
169class InterfaceTracker
\n-
170{
\n-
171public:
\n-
177 InterfaceTracker(int rank, InterfaceInformation info, std::size_t fixedsize=0,
\n-
178 bool allocateSizes=false)
\n-
179 : fixedSize(fixedsize),rank_(rank), index_(), interface_(info), sizes_()
\n-
180 {
\n-
181 if(allocateSizes)
\n-
182 {
\n-
183 sizes_.resize(info.size());
\n-
184 }
\n-
185 }
\n-
186
\n-
190 void moveToNextIndex()
\n-
191 {
\n-
192 index_++;
\n-
193 assert(index_<=interface_.size());
\n-
194 skipZeroIndices();
\n-
195 }
\n-
200 void increment(std::size_t i)
\n-
201 {
\n-
202 index_+=i;
\n-
203 assert(index_<=interface_.size());
\n-
204 }
\n-
209 bool finished() const
\n-
210 {
\n-
211 return index_==interface_.size();
\n-
212 }
\n-
213
\n-
214 void skipZeroIndices()
\n-
215 {
\n-
216 // skip indices with size zero!
\n-
217 while(sizes_.size() && index_!=interface_.size() &&!size())
\n-
218 ++index_;
\n-
219 }
\n-
220
\n-
225 std::size_t index() const
\n-
226 {
\n-
227 return interface_[index_];
\n-
228 }
\n-
232 std::size_t size() const
\n-
233 {
\n-
234 assert(sizes_.size());
\n-
235 return sizes_[index_];
\n-
236 }
\n-
240 std::size_t* getSizesPointer()
\n-
241 {
\n-
242 return &sizes_[0];
\n-
243 }
\n-
248 bool empty() const
\n-
249 {
\n-
250 return !interface_.size();
\n-
251 }
\n-
252
\n-
257 std::size_t indicesLeft() const
\n-
258 {
\n-
259 return interface_.size()-index_;
\n-
260 }
\n-
264 std::size_t fixedSize;
\n-
268 int rank() const
\n-
269 {
\n-
270 return rank_;
\n-
271 }
\n-
275 std::size_t offset() const
\n-
276 {
\n-
277 return index_;
\n-
278 }
\n-
279private:
\n-
281 int rank_;
\n-
283 std::size_t index_;
\n-
285 InterfaceInformation interface_;
\n-
286 std::vector<std::size_t> sizes_;
\n-
287};
\n-
288
\n-
289
\n-
290} // end unnamed namespace
\n-
291
\n-
329template<class Allocator=std::allocator<std::pair<InterfaceInformation,InterfaceInformation> > >
\n-
\n-\n-
331{
\n-
332public:
\n-
337 typedef std::map<int,std::pair<InterfaceInformation,InterfaceInformation>,
\n-
338 std::less<int>,
\n-
339 typename std::allocator_traits<Allocator>::template rebind_alloc< std::pair<const int,std::pair<InterfaceInformation,InterfaceInformation> > > > InterfaceMap;
\n-
340
\n-
341#ifndef DUNE_PARALLEL_MAX_COMMUNICATION_BUFFER_SIZE
\n-
\n-
348 VariableSizeCommunicator(MPI_Comm comm, const InterfaceMap& inf)
\n-
349 : maxBufferSize_(32768), interface_(&inf)
\n-
350 {
\n-
351 MPI_Comm_dup(comm, &communicator_);
\n-
352 }
\n-
\n-
\n-\n-
358 : maxBufferSize_(32768), interface_(&inf.interfaces())
\n-
359 {
\n-
360 MPI_Comm_dup(inf.communicator(), &communicator_);
\n-
361 }
\n-
\n-
362#else
\n-
369 VariableSizeCommunicator(MPI_Comm comm, InterfaceMap& inf)
\n-
370 : maxBufferSize_(DUNE_PARALLEL_MAX_COMMUNICATION_BUFFER_SIZE),
\n-
371 interface_(&inf)
\n-
372 {
\n-
373 MPI_Comm_dup(comm, &communicator_);
\n-
374 }
\n-
379 VariableSizeCommunicator(const Interface& inf)
\n-
380 : maxBufferSize_(DUNE_PARALLEL_MAX_COMMUNICATION_BUFFER_SIZE),
\n-
381 interface_(&inf.interfaces())
\n-
382 {
\n-
383 MPI_Comm_dup(inf.communicator(), &communicator_);
\n-
384 }
\n-
385#endif
\n-
\n-
392 VariableSizeCommunicator(MPI_Comm comm, const InterfaceMap& inf, std::size_t max_buffer_size)
\n-
393 : maxBufferSize_(max_buffer_size), interface_(&inf)
\n-
394 {
\n-
395 MPI_Comm_dup(comm, &communicator_);
\n-
396 }
\n-
\n-
397
\n-
\n-
403 VariableSizeCommunicator(const Interface& inf, std::size_t max_buffer_size)
\n-
404 : maxBufferSize_(max_buffer_size), interface_(&inf.interfaces())
\n-
405 {
\n-
406 MPI_Comm_dup(inf.communicator(), &communicator_);
\n-
407 }
\n-
\n-
408
\n-
\n-\n-
410 {
\n-
411 MPI_Comm_free(&communicator_);
\n-
412 }
\n-
\n-
413
\n-
\n-\n-
419 maxBufferSize_ = other.maxBufferSize_;
\n-
420 interface_ = other.interface_;
\n-
421 MPI_Comm_dup(other.communicator_, &communicator_);
\n-
422 }
\n-
\n-
423
\n-
\n-\n-
429 if(this == &other) // don't do anything if objects are the same
\n-
430 return *this;
\n-
431
\n-
432 maxBufferSize_ = other.maxBufferSize_;
\n-
433 interface_ = other.interface_;
\n-
434 MPI_Comm_free(&communicator_);
\n-
435 MPI_Comm_dup(other.communicator_, &communicator_);
\n-
436
\n-
437 return *this;
\n-
438 }
\n-
\n-
439
\n-
459 template<class DataHandle>
\n-
\n-
460 void forward(DataHandle& handle)
\n-
461 {
\n-
462 communicate<true>(handle);
\n-
463 }
\n-
\n-
464
\n-
484 template<class DataHandle>
\n-
\n-
485 void backward(DataHandle& handle)
\n-
486 {
\n-
487 communicate<false>(handle);
\n-
488 }
\n-
\n-
489
\n-
490private:
\n-
491 template<bool FORWARD, class DataHandle>
\n-
492 void communicateSizes(DataHandle& handle,
\n-
493 std::vector<InterfaceTracker>& recv_trackers);
\n-
494
\n-
501 template<bool forward,class DataHandle>
\n-
502 void communicate(DataHandle& handle);
\n-
512 template<bool FORWARD, class DataHandle>
\n-
513 void setupInterfaceTrackers(DataHandle& handle,
\n-
514 std::vector<InterfaceTracker>& send_trackers,
\n-
515 std::vector<InterfaceTracker>& recv_trackers);
\n-
523 template<bool FORWARD, class DataHandle>
\n-
524 void communicateFixedSize(DataHandle& handle);
\n-
532 template<bool FORWARD, class DataHandle>
\n-
533 void communicateVariableSize(DataHandle& handle);
\n-
540 std::size_t maxBufferSize_;
\n-
548 const InterfaceMap* interface_;
\n-
554 MPI_Comm communicator_;
\n-
555};
\n-
\n-
556
\n-
558namespace
\n-
559{
\n-
563template<class DataHandle>
\n-
564class SizeDataHandle
\n-
565{
\n-
566public:
\n-
567 typedef std::size_t DataType;
\n-
568
\n-
569 SizeDataHandle(DataHandle& data,
\n-
570 std::vector<InterfaceTracker>& trackers)
\n-
571 : data_(data), trackers_(trackers), index_()
\n-
572 {}
\n-
573 bool fixedSize()
\n-
574 {
\n-
575 return true;
\n-
576 }
\n-
577 std::size_t size([[maybe_unused]] std::size_t i)
\n-
578 {
\n-
579 return 1;
\n-
580 }
\n-
581 template<class B>
\n-
582 void gather(B& buf, int i)
\n-
583 {
\n-
584 buf.write(data_.size(i));
\n-
585 }
\n-
586 void setReceivingIndex(std::size_t i)
\n-
587 {
\n-
588 index_=i;
\n-
589 }
\n-
590 std::size_t* getSizesPointer()
\n-
591 {
\n-
592 return trackers_[index_].getSizesPointer();
\n-
593 }
\n-
594
\n-
595private:
\n-
596 DataHandle& data_;
\n-
597 std::vector<InterfaceTracker>& trackers_;
\n-
598 int index_;
\n-
599};
\n-
600
\n-
601template<class T>
\n-
602void setReceivingIndex(T&, int)
\n-
603{}
\n-
604
\n-
605template<class T>
\n-
606void setReceivingIndex(SizeDataHandle<T>& t, int i)
\n-
607{
\n-
608 t.setReceivingIndex(i);
\n-
609}
\n-
610
\n-
611
\n-
617template<bool FORWARD>
\n-
618struct InterfaceInformationChooser
\n-
619{
\n-
623 static const InterfaceInformation&
\n-
624 getSend(const std::pair<InterfaceInformation,InterfaceInformation>& info)
\n-
625 {
\n-
626 return info.first;
\n-
627 }
\n-
628
\n-
632 static const InterfaceInformation&
\n-
633 getReceive(const std::pair<InterfaceInformation,InterfaceInformation>& info)
\n-
634 {
\n-
635 return info.second;
\n-
636 }
\n-
637};
\n-
638
\n-
639template<>
\n-
640struct InterfaceInformationChooser<false>
\n-
641{
\n-
642 static const InterfaceInformation&
\n-
643 getSend(const std::pair<InterfaceInformation,InterfaceInformation>& info)
\n-
644 {
\n-
645 return info.second;
\n-
646 }
\n-
647
\n-
648 static const InterfaceInformation&
\n-
649 getReceive(const std::pair<InterfaceInformation,InterfaceInformation>& info)
\n-
650 {
\n-
651 return info.first;
\n-
652 }
\n-
653};
\n-
654
\n-
660template<class DataHandle>
\n-
661struct PackEntries
\n-
662{
\n-
663
\n-
664 int operator()(DataHandle& handle, InterfaceTracker& tracker,
\n-
665 MessageBuffer<typename DataHandle::DataType>& buffer,
\n-
666 [[maybe_unused]] int i) const
\n-
667 {
\n-
668 return operator()(handle,tracker,buffer);
\n-
669 }
\n-
670
\n-
678 int operator()(DataHandle& handle, InterfaceTracker& tracker,
\n-
679 MessageBuffer<typename DataHandle::DataType>& buffer) const
\n-
680 {
\n-
681 if(tracker.fixedSize) // fixed size if variable is >0!
\n-
682 {
\n-
683
\n-
684 std::size_t noIndices=std::min(buffer.size()/tracker.fixedSize, tracker.indicesLeft());
\n-
685 for(std::size_t i=0; i< noIndices; ++i)
\n-
686 {
\n-
687 handle.gather(buffer, tracker.index());
\n-
688 tracker.moveToNextIndex();
\n-
689 }
\n-
690 return noIndices*tracker.fixedSize;
\n-
691 }
\n-
692 else
\n-
693 {
\n-
694 int packed=0;
\n-
695 tracker.skipZeroIndices();
\n-
696 while(!tracker.finished())
\n-
697 if(buffer.hasSpaceForItems(handle.size(tracker.index())))
\n-
698 {
\n-
699 handle.gather(buffer, tracker.index());
\n-
700 packed+=handle.size(tracker.index());
\n-
701 tracker.moveToNextIndex();
\n-
702 }
\n-
703 else
\n-
704 break;
\n-
705 return packed;
\n-
706 }
\n-
707 }
\n-
708};
\n-
709
\n-
715template<class DataHandle>
\n-
716struct UnpackEntries{
\n-
717
\n-
725 bool operator()(DataHandle& handle, InterfaceTracker& tracker,
\n-
726 MessageBuffer<typename DataHandle::DataType>& buffer,
\n-
727 int count=0)
\n-
728 {
\n-
729 if(tracker.fixedSize) // fixed size if variable is >0!
\n-
730 {
\n-
731 std::size_t noIndices=std::min(buffer.size()/tracker.fixedSize, tracker.indicesLeft());
\n-
732
\n-
733 for(std::size_t i=0; i< noIndices; ++i)
\n-
734 {
\n-
735 handle.scatter(buffer, tracker.index(), tracker.fixedSize);
\n-
736 tracker.moveToNextIndex();
\n-
737 }
\n-
738 return tracker.finished();
\n-
739 }
\n-
740 else
\n-
741 {
\n-
742 assert(count);
\n-
743 for(int unpacked=0;unpacked<count;)
\n-
744 {
\n-
745 assert(!tracker.finished());
\n-
746 assert(buffer.hasSpaceForItems(tracker.size()));
\n-
747 handle.scatter(buffer, tracker.index(), tracker.size());
\n-
748 unpacked+=tracker.size();
\n-
749 tracker.moveToNextIndex();
\n-
750 }
\n-
751 return tracker.finished();
\n-
752 }
\n-
753 }
\n-
754};
\n-
755
\n-
756
\n-
760template<class DataHandle>
\n-
761struct UnpackSizeEntries{
\n-
762
\n-
770 bool operator()(SizeDataHandle<DataHandle>& handle, InterfaceTracker& tracker,
\n-
771 MessageBuffer<typename SizeDataHandle<DataHandle>::DataType>& buffer) const
\n-
772 {
\n-
773 std::size_t noIndices=std::min(buffer.size(), tracker.indicesLeft());
\n-
774 std::copy(static_cast<std::size_t*>(buffer), static_cast<std::size_t*>(buffer)+noIndices,
\n-
775 handle.getSizesPointer()+tracker.offset());
\n-
776 tracker.increment(noIndices);
\n-
777 return noIndices;
\n-
778 }
\n-
779 bool operator()(SizeDataHandle<DataHandle>& handle, InterfaceTracker& tracker,
\n-
780 MessageBuffer<typename SizeDataHandle<DataHandle>::DataType>& buffer, int) const
\n-
781 {
\n-
782 return operator()(handle,tracker,buffer);
\n-
783 }
\n-
784};
\n-
785
\n-
793void sendFixedSize(std::vector<InterfaceTracker>& send_trackers,
\n-
794 std::vector<MPI_Request>& send_requests,
\n-
795 std::vector<InterfaceTracker>& recv_trackers,
\n-
796 std::vector<MPI_Request>& recv_requests,
\n-
797 MPI_Comm communicator)
\n-
798{
\n-
799 typedef std::vector<InterfaceTracker>::iterator TIter;
\n-
800 std::vector<MPI_Request>::iterator mIter=recv_requests.begin();
\n-
801
\n-
802 for(TIter iter=recv_trackers.begin(), end=recv_trackers.end(); iter!=end;
\n-
803 ++iter, ++mIter)
\n-
804 {
\n-
805 MPI_Irecv(&(iter->fixedSize), 1, MPITraits<std::size_t>::getType(),
\n-
806 iter->rank(), 933881, communicator, &(*mIter));
\n-
807 }
\n-
808
\n-
809 // Send our size to all neighbours using non-blocking synchronous communication.
\n-
810 std::vector<MPI_Request>::iterator mIter1=send_requests.begin();
\n-
811 for(TIter iter=send_trackers.begin(), end=send_trackers.end();
\n-
812 iter!=end;
\n-
813 ++iter, ++mIter1)
\n-
814 {
\n-
815 MPI_Issend(&(iter->fixedSize), 1, MPITraits<std::size_t>::getType(),
\n-
816 iter->rank(), 933881, communicator, &(*mIter1));
\n-
817 }
\n-
818}
\n-
819
\n-
820
\n-
825template<class DataHandle>
\n-
826struct SetupSendRequest{
\n-
827 void operator()(DataHandle& handle,
\n-
828 InterfaceTracker& tracker,
\n-
829 MessageBuffer<typename DataHandle::DataType>& buffer,
\n-
830 MPI_Request& request,
\n-
831 MPI_Comm comm) const
\n-
832 {
\n-
833 buffer.reset();
\n-
834 int size=PackEntries<DataHandle>()(handle, tracker, buffer);
\n-
835 // Skip indices of zero size.
\n-
836 while(!tracker.finished() && !handle.size(tracker.index()))
\n-
837 tracker.moveToNextIndex();
\n-
838 if(size)
\n-\n-
840 tracker.rank(), 933399, comm, &request);
\n-
841 }
\n-
842};
\n-
843
\n-
844
\n-
849template<class DataHandle>
\n-
850struct SetupRecvRequest{
\n-
851 void operator()(DataHandle& /*handle*/,
\n-
852 InterfaceTracker& tracker,
\n-
853 MessageBuffer<typename DataHandle::DataType>& buffer,
\n-
854 MPI_Request& request,
\n-
855 MPI_Comm comm) const
\n-
856 {
\n-
857 buffer.reset();
\n-
858 if(tracker.indicesLeft())
\n-
859 MPI_Irecv(buffer, buffer.size(), MPITraits<typename DataHandle::DataType>::getType(),
\n-
860 tracker.rank(), 933399, comm, &request);
\n-
861 }
\n-
862};
\n-
863
\n-
867template<class DataHandle>
\n-
868struct NullPackUnpackFunctor
\n-
869{
\n-
870 int operator()(DataHandle&, InterfaceTracker&,
\n-
871 MessageBuffer<typename DataHandle::DataType>&, int)
\n-
872 {
\n-
873 return 0;
\n-
874 }
\n-
875 int operator()(DataHandle&, InterfaceTracker&,
\n-
876 MessageBuffer<typename DataHandle::DataType>&)
\n-
877 {
\n-
878 return 0;
\n-
879 }
\n-
880};
\n-
881
\n-
896template<class DataHandle, class BufferFunctor, class CommunicationFunctor>
\n-
897std::size_t checkAndContinue(DataHandle& handle,
\n-
898 std::vector<InterfaceTracker>& trackers,
\n-
899 std::vector<MPI_Request>& requests,
\n-
900 std::vector<MPI_Request>& requests2,
\n-
901 std::vector<MessageBuffer<typename DataHandle::DataType> >& buffers,
\n-
902 MPI_Comm comm,
\n-
903 BufferFunctor buffer_func,
\n-
904 CommunicationFunctor comm_func,
\n-
905 bool valid=true,
\n-
906 bool getCount=false)
\n-
907{
\n-
908 std::size_t size=requests.size();
\n-
909 std::vector<MPI_Status> statuses(size);
\n-
910 int no_completed;
\n-
911 std::vector<int> indices(size, -1); // the indices for which the communication finished.
\n-
912
\n-
913 MPI_Testsome(size, &(requests[0]), &no_completed, &(indices[0]), &(statuses[0]));
\n-
914 indices.resize(no_completed);
\n-
915 for(std::vector<int>::iterator index=indices.begin(), end=indices.end();
\n-
916 index!=end; ++index)
\n-
917 {
\n-
918 InterfaceTracker& tracker=trackers[*index];
\n-
919 setReceivingIndex(handle, *index);
\n-
920 if(getCount)
\n-
921 {
\n-
922 // Get the number of entries received
\n-
923 int count;
\n-
924 MPI_Get_count(&(statuses[index-indices.begin()]),
\n-\n-
926 &count);
\n-
927 // Communication completed, we can reuse the buffers, e.g. unpack or repack
\n-
928 buffer_func(handle, tracker, buffers[*index], count);
\n-
929 }else
\n-
930 buffer_func(handle, tracker, buffers[*index]);
\n-
931 tracker.skipZeroIndices();
\n-
932 if(!tracker.finished()){
\n-
933 // Maybe start another communication.
\n-
934 comm_func(handle, tracker, buffers[*index], requests2[*index], comm);
\n-
935 tracker.skipZeroIndices();
\n-
936 if(valid)
\n-
937 --no_completed; // communication not finished, decrement counter for finished ones.
\n-
938 }
\n-
939 }
\n-
940 return no_completed;
\n-
941
\n-
942}
\n-
943
\n-
953template<class DataHandle>
\n-
954std::size_t receiveSizeAndSetupReceive(DataHandle& handle,
\n-
955 std::vector<InterfaceTracker>& trackers,
\n-
956 std::vector<MPI_Request>& size_requests,
\n-
957 std::vector<MPI_Request>& data_requests,
\n-
958 std::vector<MessageBuffer<typename DataHandle::DataType> >& buffers,
\n-
959 MPI_Comm comm)
\n-
960{
\n-
961 return checkAndContinue(handle, trackers, size_requests, data_requests, buffers, comm,
\n-
962 NullPackUnpackFunctor<DataHandle>(), SetupRecvRequest<DataHandle>(), false);
\n-
963}
\n-
964
\n-
973template<class DataHandle>
\n-
974std::size_t checkSendAndContinueSending(DataHandle& handle,
\n-
975 std::vector<InterfaceTracker>& trackers,
\n-
976 std::vector<MPI_Request>& requests,
\n-
977 std::vector<MessageBuffer<typename DataHandle::DataType> >& buffers,
\n-
978 MPI_Comm comm)
\n-
979{
\n-
980 return checkAndContinue(handle, trackers, requests, requests, buffers, comm,
\n-
981 NullPackUnpackFunctor<DataHandle>(), SetupSendRequest<DataHandle>());
\n-
982}
\n-
983
\n-
992template<class DataHandle>
\n-
993std::size_t checkReceiveAndContinueReceiving(DataHandle& handle,
\n-
994 std::vector<InterfaceTracker>& trackers,
\n-
995 std::vector<MPI_Request>& requests,
\n-
996 std::vector<MessageBuffer<typename DataHandle::DataType> >& buffers,
\n-
997 MPI_Comm comm)
\n-
998{
\n-
999 return checkAndContinue(handle, trackers, requests, requests, buffers, comm,
\n-
1000 UnpackEntries<DataHandle>(), SetupRecvRequest<DataHandle>(),
\n-
1001 true, !Impl::callFixedSize(handle));
\n-
1002}
\n-
1003
\n-
1004
\n-
1005bool validRecvRequests(const std::vector<MPI_Request> reqs)
\n-
1006{
\n-
1007 for(std::vector<MPI_Request>::const_iterator i=reqs.begin(), end=reqs.end();
\n-
1008 i!=end; ++i)
\n-
1009 if(*i!=MPI_REQUEST_NULL)
\n-
1010 return true;
\n-
1011 return false;
\n-
1012}
\n-
1013
\n-
1024template<class DataHandle, class Functor>
\n-
1025std::size_t setupRequests(DataHandle& handle,
\n-
1026 std::vector<InterfaceTracker>& trackers,
\n-
1027 std::vector<MessageBuffer<typename DataHandle::DataType> >& buffers,
\n-
1028 std::vector<MPI_Request>& requests,
\n-
1029 const Functor& setupFunctor,
\n-
1030 MPI_Comm communicator)
\n-
1031{
\n-
1032 typedef typename std::vector<InterfaceTracker>::iterator TIter;
\n-
1033 typename std::vector<MessageBuffer<typename DataHandle::DataType> >::iterator
\n-
1034 biter=buffers.begin();
\n-
1035 typename std::vector<MPI_Request>::iterator riter=requests.begin();
\n-
1036 std::size_t complete=0;
\n-
1037 for(TIter titer=trackers.begin(), end=trackers.end(); titer!=end; ++titer, ++biter, ++riter)
\n-
1038 {
\n-
1039 setupFunctor(handle, *titer, *biter, *riter, communicator);
\n-
1040 complete+=titer->finished();
\n-
1041 }
\n-
1042 return complete;
\n-
1043}
\n-
1044} // end unnamed namespace
\n-
1045
\n-
1046template<class Allocator>
\n-
1047template<bool FORWARD, class DataHandle>
\n-
1048void VariableSizeCommunicator<Allocator>::setupInterfaceTrackers(DataHandle& handle,
\n-
1049 std::vector<InterfaceTracker>& send_trackers,
\n-
1050 std::vector<InterfaceTracker>& recv_trackers)
\n-
1051{
\n-
1052 if(interface_->size()==0)
\n-
1053 return;
\n-
1054 send_trackers.reserve(interface_->size());
\n-
1055 recv_trackers.reserve(interface_->size());
\n-
1056
\n-
1057 int fixedsize=0;
\n-
1058 if(Impl::callFixedSize(handle))
\n-
1059 ++fixedsize;
\n-
1060
\n-
1061
\n-
1062 typedef typename InterfaceMap::const_iterator IIter;
\n-
1063 for(IIter inf=interface_->begin(), end=interface_->end(); inf!=end; ++inf)
\n-
1064 {
\n-
1065
\n-
1066 if(Impl::callFixedSize(handle) && InterfaceInformationChooser<FORWARD>::getSend(inf->second).size())
\n-
1067 fixedsize=handle.size(InterfaceInformationChooser<FORWARD>::getSend(inf->second)[0]);
\n-
1068 assert(!Impl::callFixedSize(handle)||fixedsize>0);
\n-
1069 send_trackers.push_back(InterfaceTracker(inf->first,
\n-
1070 InterfaceInformationChooser<FORWARD>::getSend(inf->second), fixedsize));
\n-
1071 recv_trackers.push_back(InterfaceTracker(inf->first,
\n-
1072 InterfaceInformationChooser<FORWARD>::getReceive(inf->second), fixedsize, fixedsize==0));
\n-
1073 }
\n-
1074}
\n-
1075
\n-
1076template<class Allocator>
\n-
1077template<bool FORWARD, class DataHandle>
\n-
1078void VariableSizeCommunicator<Allocator>::communicateFixedSize(DataHandle& handle)
\n-
1079{
\n-
1080 std::vector<MPI_Request> size_send_req(interface_->size());
\n-
1081 std::vector<MPI_Request> size_recv_req(interface_->size());
\n-
1082
\n-
1083 std::vector<InterfaceTracker> send_trackers;
\n-
1084 std::vector<InterfaceTracker> recv_trackers;
\n-
1085 setupInterfaceTrackers<FORWARD>(handle,send_trackers, recv_trackers);
\n-
1086 sendFixedSize(send_trackers, size_send_req, recv_trackers, size_recv_req, communicator_);
\n-
1087
\n-
1088 std::vector<MPI_Request> data_send_req(interface_->size(), MPI_REQUEST_NULL);
\n-
1089 std::vector<MPI_Request> data_recv_req(interface_->size(), MPI_REQUEST_NULL);
\n-
1090 typedef typename DataHandle::DataType DataType;
\n-
1091 std::vector<MessageBuffer<DataType> > send_buffers(interface_->size(), MessageBuffer<DataType>(maxBufferSize_)),
\n-
1092 recv_buffers(interface_->size(), MessageBuffer<DataType>(maxBufferSize_));
\n-
1093
\n-
1094
\n-
1095 setupRequests(handle, send_trackers, send_buffers, data_send_req,
\n-
1096 SetupSendRequest<DataHandle>(), communicator_);
\n-
1097
\n-
1098 std::size_t no_size_to_recv, no_to_send, no_to_recv, old_size;
\n-
1099 no_size_to_recv = no_to_send = no_to_recv = old_size = interface_->size();
\n-
1100
\n-
1101 // Skip empty interfaces.
\n-
1102 typedef typename std::vector<InterfaceTracker>::const_iterator Iter;
\n-
1103 for(Iter i=recv_trackers.begin(), end=recv_trackers.end(); i!=end; ++i)
\n-
1104 if(i->empty())
\n-
1105 --no_to_recv;
\n-
1106 for(Iter i=send_trackers.begin(), end=send_trackers.end(); i!=end; ++i)
\n-
1107 if(i->empty())
\n-
1108 --no_to_send;
\n-
1109
\n-
1110 while(no_size_to_recv+no_to_send+no_to_recv)
\n-
1111 {
\n-
1112 // Receive the fixedsize and setup receives accordingly
\n-
1113 if(no_size_to_recv)
\n-
1114 no_size_to_recv -= receiveSizeAndSetupReceive(handle,recv_trackers, size_recv_req,
\n-
1115 data_recv_req, recv_buffers,
\n-
1116 communicator_);
\n-
1117
\n-
1118 // Check send completion and initiate other necessary sends
\n-
1119 if(no_to_send)
\n-
1120 no_to_send -= checkSendAndContinueSending(handle, send_trackers, data_send_req,
\n-
1121 send_buffers, communicator_);
\n-
1122 if(validRecvRequests(data_recv_req))
\n-
1123 // Receive data and setup new unblocking receives if necessary
\n-
1124 no_to_recv -= checkReceiveAndContinueReceiving(handle, recv_trackers, data_recv_req,
\n-
1125 recv_buffers, communicator_);
\n-
1126 }
\n-
1127
\n-
1128 // Wait for completion of sending the size.
\n-
1129 //std::vector<MPI_Status> statuses(interface_->size(), MPI_STATUSES_IGNORE);
\n-
1130 MPI_Waitall(size_send_req.size(), &(size_send_req[0]), MPI_STATUSES_IGNORE);
\n-
1131
\n-
1132}
\n-
1133
\n-
1134template<class Allocator>
\n-
1135template<bool FORWARD, class DataHandle>
\n-
1136void VariableSizeCommunicator<Allocator>::communicateSizes(DataHandle& handle,
\n-
1137 std::vector<InterfaceTracker>& data_recv_trackers)
\n-
1138{
\n-
1139 std::vector<InterfaceTracker> send_trackers;
\n-
1140 std::vector<InterfaceTracker> recv_trackers;
\n-
1141 std::size_t size = interface_->size();
\n-
1142 std::vector<MPI_Request> send_requests(size, MPI_REQUEST_NULL);
\n-
1143 std::vector<MPI_Request> recv_requests(size, MPI_REQUEST_NULL);
\n-
1144 std::vector<MessageBuffer<std::size_t> >
\n-
1145 send_buffers(size, MessageBuffer<std::size_t>(maxBufferSize_)),
\n-
1146 recv_buffers(size, MessageBuffer<std::size_t>(maxBufferSize_));
\n-
1147 SizeDataHandle<DataHandle> size_handle(handle,data_recv_trackers);
\n-
1148 setupInterfaceTrackers<FORWARD>(size_handle,send_trackers, recv_trackers);
\n-
1149 setupRequests(size_handle, send_trackers, send_buffers, send_requests,
\n-
1150 SetupSendRequest<SizeDataHandle<DataHandle> >(), communicator_);
\n-
1151 setupRequests(size_handle, recv_trackers, recv_buffers, recv_requests,
\n-
1152 SetupRecvRequest<SizeDataHandle<DataHandle> >(), communicator_);
\n-
1153
\n-
1154 // Count valid requests that we have to wait for.
\n-
1155 auto valid_req_func =
\n-
1156 [](const MPI_Request& req) { return req != MPI_REQUEST_NULL; };
\n-
1157
\n-
1158 auto size_to_send = std::count_if(send_requests.begin(), send_requests.end(),
\n-
1159 valid_req_func);
\n-
1160 auto size_to_recv = std::count_if(recv_requests.begin(), recv_requests.end(),
\n-
1161 valid_req_func);
\n-
1162
\n-
1163 while(size_to_send+size_to_recv)
\n-
1164 {
\n-
1165 if(size_to_send)
\n-
1166 size_to_send -=
\n-
1167 checkSendAndContinueSending(size_handle, send_trackers, send_requests,
\n-
1168 send_buffers, communicator_);
\n-
1169 if(size_to_recv)
\n-
1170 // Could have done this using checkSendAndContinueSending
\n-
1171 // But the call below is more efficient as UnpackSizeEntries
\n-
1172 // uses std::copy.
\n-
1173 size_to_recv -=
\n-
1174 checkAndContinue(size_handle, recv_trackers, recv_requests, recv_requests,
\n-
1175 recv_buffers, communicator_, UnpackSizeEntries<DataHandle>(),
\n-
1176 SetupRecvRequest<SizeDataHandle<DataHandle> >());
\n-
1177 }
\n-
1178}
\n-
1179
\n-
1180template<class Allocator>
\n-
1181template<bool FORWARD, class DataHandle>
\n-
1182void VariableSizeCommunicator<Allocator>::communicateVariableSize(DataHandle& handle)
\n-
1183{
\n-
1184
\n-
1185 std::vector<InterfaceTracker> send_trackers;
\n-
1186 std::vector<InterfaceTracker> recv_trackers;
\n-
1187 setupInterfaceTrackers<FORWARD>(handle, send_trackers, recv_trackers);
\n-
1188
\n-
1189 std::vector<MPI_Request> send_requests(interface_->size(), MPI_REQUEST_NULL);
\n-
1190 std::vector<MPI_Request> recv_requests(interface_->size(), MPI_REQUEST_NULL);
\n-
1191 typedef typename DataHandle::DataType DataType;
\n-
1192 std::vector<MessageBuffer<DataType> >
\n-
1193 send_buffers(interface_->size(), MessageBuffer<DataType>(maxBufferSize_)),
\n-
1194 recv_buffers(interface_->size(), MessageBuffer<DataType>(maxBufferSize_));
\n-
1195
\n-
1196 communicateSizes<FORWARD>(handle, recv_trackers);
\n-
1197 // Setup requests for sending and receiving.
\n-
1198 setupRequests(handle, send_trackers, send_buffers, send_requests,
\n-
1199 SetupSendRequest<DataHandle>(), communicator_);
\n-
1200 setupRequests(handle, recv_trackers, recv_buffers, recv_requests,
\n-
1201 SetupRecvRequest<DataHandle>(), communicator_);
\n-
1202
\n-
1203 // Determine number of valid requests.
\n-
1204 auto valid_req_func =
\n-
1205 [](const MPI_Request& req) { return req != MPI_REQUEST_NULL;};
\n-
1206
\n-
1207 auto no_to_send = std::count_if(send_requests.begin(), send_requests.end(),
\n-
1208 valid_req_func);
\n-
1209 auto no_to_recv = std::count_if(recv_requests.begin(), recv_requests.end(),
\n-
1210 valid_req_func);
\n-
1211 while(no_to_send+no_to_recv)
\n-
1212 {
\n-
1213 // Check send completion and initiate other necessary sends
\n-
1214 if(no_to_send)
\n-
1215 no_to_send -= checkSendAndContinueSending(handle, send_trackers, send_requests,
\n-
1216 send_buffers, communicator_);
\n-
1217 if(no_to_recv)
\n-
1218 // Receive data and setup new unblocking receives if necessary
\n-
1219 no_to_recv -= checkReceiveAndContinueReceiving(handle, recv_trackers, recv_requests,
\n-
1220 recv_buffers, communicator_);
\n-
1221 }
\n-
1222}
\n-
1223
\n-
1224template<class Allocator>
\n-
1225template<bool FORWARD, class DataHandle>
\n-
1226void VariableSizeCommunicator<Allocator>::communicate(DataHandle& handle)
\n-
1227{
\n-
1228 if( interface_->size() == 0)
\n-
1229 // Simply return as otherwise we will index an empty container
\n-
1230 // either for MPI_Wait_all or MPI_Test_some.
\n-
1231 return;
\n-
1232
\n-
1233 if(Impl::callFixedSize(handle))
\n-
1234 communicateFixedSize<FORWARD>(handle);
\n-
1235 else
\n-
1236 communicateVariableSize<FORWARD>(handle);
\n-
1237}
\n-
1238} // end namespace Dune
\n-
1239
\n-
1240#endif // HAVE_MPI
\n-
1241#endif // DUNE_COMMON_PARALLEL_VARIABLESIZECOMMUNICATOR_HH
\n-
std::size_t fixedSize
The number of data items per index if it is fixed, 0 otherwise.
Definition variablesizecommunicator.hh:264
\n-
Traits classes for mapping types onto MPI_Datatype.
\n-
Infrastructure for concepts.
\n-
MPI_Comm communicator() const
Get the MPI Communicator.
Definition parallel/interface.hh:426
\n-
Dune namespace.
Definition alignedallocator.hh:13
\n-
constexpr std::integral_constant< std::size_t, sizeof...(II)> size(std::integer_sequence< T, II... >)
Return the size of the sequence.
Definition integersequence.hh:75
\n-
constexpr std::bool_constant<(sizeof...(II)==0)> empty(std::integer_sequence< T, II... >)
Checks whether the sequence is empty.
Definition integersequence.hh:80
\n-
static MPI_Datatype getType()
Definition mpitraits.hh:48
\n-
size_t size() const
Get the number of entries in the interface.
Definition parallel/interface.hh:117
\n-
Communication interface between remote and local indices.
Definition parallel/interface.hh:218
\n-
Definition variablesizecommunicator.hh:42
\n-
auto require(H &&h) -> decltype(h.fixedSize())
\n-
A buffered communicator where the amount of data sent does not have to be known a priori.
Definition variablesizecommunicator.hh:331
\n-
VariableSizeCommunicator(const Interface &inf, std::size_t max_buffer_size)
Creates a communicator with a specific maximum buffer size.
Definition variablesizecommunicator.hh:403
\n-
void backward(DataHandle &handle)
Communicate backwards.
Definition variablesizecommunicator.hh:485
\n-
~VariableSizeCommunicator()
Definition variablesizecommunicator.hh:409
\n-
VariableSizeCommunicator(MPI_Comm comm, const InterfaceMap &inf, std::size_t max_buffer_size)
Creates a communicator with a specific maximum buffer size.
Definition variablesizecommunicator.hh:392
\n-
VariableSizeCommunicator(const VariableSizeCommunicator &other)
Copy-constructs a communicator.
Definition variablesizecommunicator.hh:418
\n-
void forward(DataHandle &handle)
Communicate forward.
Definition variablesizecommunicator.hh:460
\n-
VariableSizeCommunicator & operator=(const VariableSizeCommunicator &other)
Copy-assignes a communicator.
Definition variablesizecommunicator.hh:428
\n-
std::map< int, std::pair< InterfaceInformation, InterfaceInformation >, std::less< int >, typename std::allocator_traits< Allocator >::template rebind_alloc< std::pair< const int, std::pair< InterfaceInformation, InterfaceInformation > > > > InterfaceMap
The type of the map from process number to InterfaceInformation for sending and receiving to and from...
Definition variablesizecommunicator.hh:339
\n-
VariableSizeCommunicator(MPI_Comm comm, const InterfaceMap &inf)
Creates a communicator with the default maximum buffer size.
Definition variablesizecommunicator.hh:348
\n-
VariableSizeCommunicator(const Interface &inf)
Creates a communicator with the default maximum buffer size.
Definition variablesizecommunicator.hh:357
\n-
Provides classes for building the communication interface between remote indices.
\n+
14#ifdef DOXYGEN
\n+
32#define DUNE_NO_DEPRECATED_BEGIN ...
\n+
38#define DUNE_NO_DEPRECATED_END ...
\n+
39#else
\n+
40# if defined __clang__
\n+
41# define DUNE_NO_DEPRECATED_BEGIN \\
\n+
42 _Pragma("clang diagnostic push") \\
\n+
43 _Pragma("clang diagnostic ignored \\"-Wdeprecated-declarations\\"")
\n+
44# define DUNE_NO_DEPRECATED_END _Pragma("clang diagnostic pop")
\n+
45# elif defined __INTEL_COMPILER
\n+
46# define DUNE_NO_DEPRECATED_BEGIN \\
\n+
47 _Pragma("warning push") \\
\n+
48 _Pragma("warning(disable:1478)") \\
\n+
49 _Pragma("warning(disable:1786)")
\n+
50# define DUNE_NO_DEPRECATED_END _Pragma("warning pop")
\n+
51# elif defined __GNUC__
\n+
52# define DUNE_NO_DEPRECATED_BEGIN \\
\n+
53 _Pragma("GCC diagnostic push") \\
\n+
54 _Pragma("GCC diagnostic ignored \\"-Wdeprecated-declarations\\"")
\n+
55# define DUNE_NO_DEPRECATED_END _Pragma("GCC diagnostic pop")
\n+
56# else
\n+
57# define DUNE_NO_DEPRECATED_BEGIN /* Noop. */
\n+
58# define DUNE_NO_DEPRECATED_END /* Noop. */
\n+
59# endif
\n+
60#endif
\n+
61
\n+
63
\n+
64#endif
\n
\n \n
\n Generated by \"doxygen\"/ 1.9.8\n
\n \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,1000 +1,46 @@\n dune-common\u00a02.10\n Loading...\n Searching...\n No Matches\n * _\bd_\bu_\bn_\be\n * _\bc_\bo_\bm_\bm_\bo_\bn\n- * _\bp_\ba_\br_\ba_\bl_\bl_\be_\bl\n-variablesizecommunicator.hh\n+deprecated.hh\n _\bG_\bo_\b _\bt_\bo_\b _\bt_\bh_\be_\b _\bd_\bo_\bc_\bu_\bm_\be_\bn_\bt_\ba_\bt_\bi_\bo_\bn_\b _\bo_\bf_\b _\bt_\bh_\bi_\bs_\b _\bf_\bi_\bl_\be_\b.\n 1// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-\n 2// vi: set et ts=4 sw=2 sts=2:\n 3// SPDX-FileCopyrightInfo: Copyright \u00c2\u00a9 DUNE Project contributors, see file\n LICENSE.md in module root\n 4// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception\n-5#ifndef DUNE_COMMON_PARALLEL_VARIABLESIZECOMMUNICATOR_HH\n-6#define DUNE_COMMON_PARALLEL_VARIABLESIZECOMMUNICATOR_HH\n+5#ifndef DUNE_DEPRECATED_HH\n+6#define DUNE_DEPRECATED_HH\n 7\n-8#if HAVE_MPI\n-9\n-10#include \n-11#include \n-12#include \n-13#include \n-14#include \n-15#include \n-16#include \n-17#include \n-18\n-19#include \n-20\n-21#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bc_\bo_\bn_\bc_\be_\bp_\bt_\b._\bh_\bh>\n-22#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bp_\ba_\br_\ba_\bl_\bl_\be_\bl_\b/_\bi_\bn_\bt_\be_\br_\bf_\ba_\bc_\be_\b._\bh_\bh>\n-23#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bp_\ba_\br_\ba_\bl_\bl_\be_\bl_\b/_\bm_\bp_\bi_\bt_\br_\ba_\bi_\bt_\bs_\b._\bh_\bh>\n-24\n-37namespace _\bD_\bu_\bn_\be\n-38{\n-39\n-40namespace Concept {\n-41\n-_\b4_\b2struct _\bH_\ba_\bs_\bF_\bi_\bx_\be_\bd_\bS_\bi_\bz_\be {\n-_\b4_\b3 template auto _\br_\be_\bq_\bu_\bi_\br_\be(H &&h) -> decltype(h.fixedSize());\n-44};\n-45\n-46} // namespace Concept\n-47\n-48namespace Impl {\n-49\n-50template (), int> = 0>\n-52constexpr bool callFixedSize(H &&handle) {\n-53 return handle.fixedSize();\n-54}\n-55\n-56} // namespace Impl\n-57\n-58namespace\n-59{\n-64template >\n-65class MessageBuffer\n-66{\n-67public:\n-72 explicit MessageBuffer(int _\bs_\bi_\bz_\be)\n-73 : buffer_(new T[_\bs_\bi_\bz_\be]), size_(_\bs_\bi_\bz_\be), position_(0)\n-74 {}\n-79 explicit MessageBuffer(const MessageBuffer& o)\n-80 : buffer_(new T[o.size_]), size_(o.size_), position_(o.position_)\n-81 {\n-82 }\n-84 ~MessageBuffer()\n-85 {\n-86 delete[] buffer_;\n-87 }\n-92 void write(const T& data)\n-93 {\n-94 buffer_[position_++]=data;\n-95 }\n-96\n-101 void read(T& data)\n-102 {\n-103 data=buffer_[position_++];\n-104 }\n-105\n-111 void reset()\n-112 {\n-113 position_=0;\n-114 }\n-115\n-120 bool finished()\n-121 {\n-122 return position_==size_;\n-123 }\n-124\n-130 bool hasSpaceForItems(int noItems)\n-131 {\n-132 return position_+noItems<=size_;\n-133 }\n-138 std::size_t _\bs_\bi_\bz_\be() const\n-139 {\n-140 return size_;\n-141 }\n-146 operator T*()\n-147 {\n-148 return buffer_;\n-149 }\n-150\n-151private:\n-155 T* buffer_;\n-159 std::size_t size_;\n-163 std::size_t position_;\n-164};\n-165\n-169class InterfaceTracker\n-170{\n-171public:\n-177 InterfaceTracker(int rank, InterfaceInformation info, std::size_t\n-fixedsize=0,\n-178 bool allocateSizes=false)\n-179 : _\bf_\bi_\bx_\be_\bd_\bS_\bi_\bz_\be(fixedsize),rank_(rank), index_(), interface_(info), sizes_()\n-180 {\n-181 if(allocateSizes)\n-182 {\n-183 sizes_.resize(info.size());\n-184 }\n-185 }\n-186\n-190 void moveToNextIndex()\n-191 {\n-192 index_++;\n-193 assert(index_<=interface_.size());\n-194 skipZeroIndices();\n-195 }\n-200 void increment(std::size_t i)\n-201 {\n-202 index_+=i;\n-203 assert(index_<=interface_.size());\n-204 }\n-209 bool finished() const\n-210 {\n-211 return index_==interface_.size();\n-212 }\n-213\n-214 void skipZeroIndices()\n-215 {\n-216 // skip indices with size zero!\n-217 while(sizes_.size() && index_!=interface_.size() &&!_\bs_\bi_\bz_\be())\n-218 ++index_;\n-219 }\n-220\n-225 std::size_t index() const\n-226 {\n-227 return interface_[index_];\n-228 }\n-232 std::size_t _\bs_\bi_\bz_\be() const\n-233 {\n-234 assert(sizes_.size());\n-235 return sizes_[index_];\n-236 }\n-240 std::size_t* getSizesPointer()\n-241 {\n-242 return &sizes_[0];\n-243 }\n-248 bool _\be_\bm_\bp_\bt_\by() const\n-249 {\n-250 return !interface_.size();\n-251 }\n-252\n-257 std::size_t indicesLeft() const\n-258 {\n-259 return interface_.size()-index_;\n-260 }\n-_\b2_\b6_\b4 std::size_t _\bf_\bi_\bx_\be_\bd_\bS_\bi_\bz_\be;\n-268 int rank() const\n-269 {\n-270 return rank_;\n-271 }\n-275 std::size_t offset() const\n-276 {\n-277 return index_;\n-278 }\n-279private:\n-281 int rank_;\n-283 std::size_t index_;\n-285 InterfaceInformation interface_;\n-286 std::vector sizes_;\n-287};\n-288\n-289\n-290} // end unnamed namespace\n-291\n-329template > >\n-_\b3_\b3_\b0class _\bV_\ba_\br_\bi_\ba_\bb_\bl_\be_\bS_\bi_\bz_\be_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bo_\br\n-331{\n-332public:\n-337 typedef std::map,\n-338 std::less,\n-_\b3_\b3_\b9 typename std::allocator_traits::template rebind_alloc< std::\n-pair > > >\n-_\bI_\bn_\bt_\be_\br_\bf_\ba_\bc_\be_\bM_\ba_\bp;\n-340\n-341#ifndef DUNE_PARALLEL_MAX_COMMUNICATION_BUFFER_SIZE\n-_\b3_\b4_\b8 _\bV_\ba_\br_\bi_\ba_\bb_\bl_\be_\bS_\bi_\bz_\be_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bo_\br(MPI_Comm comm, const _\bI_\bn_\bt_\be_\br_\bf_\ba_\bc_\be_\bM_\ba_\bp& inf)\n-349 : maxBufferSize_(32768), interface_(&inf)\n-350 {\n-351 MPI_Comm_dup(comm, &communicator_);\n-352 }\n-_\b3_\b5_\b7 _\bV_\ba_\br_\bi_\ba_\bb_\bl_\be_\bS_\bi_\bz_\be_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bo_\br(const _\bI_\bn_\bt_\be_\br_\bf_\ba_\bc_\be& inf)\n-358 : maxBufferSize_(32768), interface_(&inf.interfaces())\n-359 {\n-360 MPI_Comm_dup(inf._\bc_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bo_\br(), &communicator_);\n-361 }\n-362#else\n-369 _\bV_\ba_\br_\bi_\ba_\bb_\bl_\be_\bS_\bi_\bz_\be_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bo_\br(MPI_Comm comm, _\bI_\bn_\bt_\be_\br_\bf_\ba_\bc_\be_\bM_\ba_\bp& inf)\n-370 : maxBufferSize_(DUNE_PARALLEL_MAX_COMMUNICATION_BUFFER_SIZE),\n-371 interface_(&inf)\n-372 {\n-373 MPI_Comm_dup(comm, &communicator_);\n-374 }\n-379 VariableSizeCommunicator(const Interface& inf)\n-380 : maxBufferSize_(DUNE_PARALLEL_MAX_COMMUNICATION_BUFFER_SIZE),\n-381 interface_(&inf.interfaces())\n-382 {\n-383 MPI_Comm_dup(inf.communicator(), &communicator_);\n-384 }\n-385#endif\n-_\b3_\b9_\b2 _\bV_\ba_\br_\bi_\ba_\bb_\bl_\be_\bS_\bi_\bz_\be_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bo_\br(MPI_Comm comm, const _\bI_\bn_\bt_\be_\br_\bf_\ba_\bc_\be_\bM_\ba_\bp& inf, std::\n-size_t max_buffer_size)\n-393 : maxBufferSize_(max_buffer_size), interface_(&inf)\n-394 {\n-395 MPI_Comm_dup(comm, &communicator_);\n-396 }\n-397\n-_\b4_\b0_\b3 _\bV_\ba_\br_\bi_\ba_\bb_\bl_\be_\bS_\bi_\bz_\be_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bo_\br(const _\bI_\bn_\bt_\be_\br_\bf_\ba_\bc_\be& inf, std::size_t max_buffer_size)\n-404 : maxBufferSize_(max_buffer_size), interface_(&inf.interfaces())\n-405 {\n-406 MPI_Comm_dup(inf._\bc_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bo_\br(), &communicator_);\n-407 }\n-408\n-_\b4_\b0_\b9 _\b~_\bV_\ba_\br_\bi_\ba_\bb_\bl_\be_\bS_\bi_\bz_\be_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bo_\br()\n-410 {\n-411 MPI_Comm_free(&communicator_);\n-412 }\n-413\n-_\b4_\b1_\b8 _\bV_\ba_\br_\bi_\ba_\bb_\bl_\be_\bS_\bi_\bz_\be_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bo_\br(const _\bV_\ba_\br_\bi_\ba_\bb_\bl_\be_\bS_\bi_\bz_\be_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bo_\br& other) {\n-419 maxBufferSize_ = other.maxBufferSize_;\n-420 interface_ = other.interface_;\n-421 MPI_Comm_dup(other.communicator_, &communicator_);\n-422 }\n-423\n-_\b4_\b2_\b8 _\bV_\ba_\br_\bi_\ba_\bb_\bl_\be_\bS_\bi_\bz_\be_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bo_\br& _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b=(const _\bV_\ba_\br_\bi_\ba_\bb_\bl_\be_\bS_\bi_\bz_\be_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bo_\br& other)\n-{\n-429 if(this == &other) // don't do anything if objects are the same\n-430 return *this;\n-431\n-432 maxBufferSize_ = other.maxBufferSize_;\n-433 interface_ = other.interface_;\n-434 MPI_Comm_free(&communicator_);\n-435 MPI_Comm_dup(other.communicator_, &communicator_);\n-436\n-437 return *this;\n-438 }\n-439\n-459 template\n-_\b4_\b6_\b0 void _\bf_\bo_\br_\bw_\ba_\br_\bd(DataHandle& handle)\n-461 {\n-462 communicate(handle);\n-463 }\n-464\n-484 template\n-_\b4_\b8_\b5 void _\bb_\ba_\bc_\bk_\bw_\ba_\br_\bd(DataHandle& handle)\n-486 {\n-487 communicate(handle);\n-488 }\n-489\n-490private:\n-491 template\n-492 void communicateSizes(DataHandle& handle,\n-493 std::vector& recv_trackers);\n-494\n-501 template\n-502 void communicate(DataHandle& handle);\n-512 template\n-513 void setupInterfaceTrackers(DataHandle& handle,\n-514 std::vector& send_trackers,\n-515 std::vector& recv_trackers);\n-523 template\n-524 void communicateFixedSize(DataHandle& handle);\n-532 template\n-533 void communicateVariableSize(DataHandle& handle);\n-540 std::size_t maxBufferSize_;\n-548 const _\bI_\bn_\bt_\be_\br_\bf_\ba_\bc_\be_\bM_\ba_\bp* interface_;\n-554 MPI_Comm communicator_;\n-555};\n-556\n-558namespace\n-559{\n-563template\n-564class SizeDataHandle\n-565{\n-566public:\n-567 typedef std::size_t DataType;\n-568\n-569 SizeDataHandle(DataHandle& data,\n-570 std::vector& trackers)\n-571 : data_(data), trackers_(trackers), index_()\n-572 {}\n-573 bool _\bf_\bi_\bx_\be_\bd_\bS_\bi_\bz_\be()\n-574 {\n-575 return true;\n-576 }\n-577 std::size_t _\bs_\bi_\bz_\be([[maybe_unused]] std::size_t i)\n-578 {\n-579 return 1;\n-580 }\n-581 template\n-582 void gather(B& buf, int i)\n-583 {\n-584 buf.write(data_.size(i));\n-585 }\n-586 void setReceivingIndex(std::size_t i)\n-587 {\n-588 index_=i;\n-589 }\n-590 std::size_t* getSizesPointer()\n-591 {\n-592 return trackers_[index_].getSizesPointer();\n-593 }\n-594\n-595private:\n-596 DataHandle& data_;\n-597 std::vector& trackers_;\n-598 int index_;\n-599};\n-600\n-601template\n-602void setReceivingIndex(T&, int)\n-603{}\n-604\n-605template\n-606void setReceivingIndex(SizeDataHandle& t, int i)\n-607{\n-608 t.setReceivingIndex(i);\n-609}\n-610\n-611\n-617template\n-618struct InterfaceInformationChooser\n-619{\n-623 static const InterfaceInformation&\n-624 getSend(const std::pair& info)\n-625 {\n-626 return info.first;\n-627 }\n-628\n-632 static const InterfaceInformation&\n-633 getReceive(const std::pair&\n-info)\n-634 {\n-635 return info.second;\n-636 }\n-637};\n-638\n-639template<>\n-640struct InterfaceInformationChooser\n-641{\n-642 static const InterfaceInformation&\n-643 getSend(const std::pair& info)\n-644 {\n-645 return info.second;\n-646 }\n-647\n-648 static const InterfaceInformation&\n-649 getReceive(const std::pair&\n-info)\n-650 {\n-651 return info.first;\n-652 }\n-653};\n-654\n-660template\n-661struct PackEntries\n-662{\n-663\n-664 int operator()(DataHandle& handle, InterfaceTracker& tracker,\n-665 MessageBuffer& buffer,\n-666 [[maybe_unused]] int i) const\n-667 {\n-668 return operator()(handle,tracker,buffer);\n-669 }\n-670\n-678 int operator()(DataHandle& handle, InterfaceTracker& tracker,\n-679 MessageBuffer& buffer) const\n-680 {\n-681 if(tracker.fixedSize) // fixed size if variable is >0!\n-682 {\n-683\n-684 std::size_t noIndices=std::min(buffer.size()/tracker.fixedSize,\n-tracker.indicesLeft());\n-685 for(std::size_t i=0; i< noIndices; ++i)\n-686 {\n-687 handle.gather(buffer, tracker.index());\n-688 tracker.moveToNextIndex();\n-689 }\n-690 return noIndices*tracker.fixedSize;\n-691 }\n-692 else\n-693 {\n-694 int packed=0;\n-695 tracker.skipZeroIndices();\n-696 while(!tracker.finished())\n-697 if(buffer.hasSpaceForItems(handle.size(tracker.index())))\n-698 {\n-699 handle.gather(buffer, tracker.index());\n-700 packed+=handle.size(tracker.index());\n-701 tracker.moveToNextIndex();\n-702 }\n-703 else\n-704 break;\n-705 return packed;\n-706 }\n-707 }\n-708};\n-709\n-715template\n-716struct UnpackEntries{\n-717\n-725 bool operator()(DataHandle& handle, InterfaceTracker& tracker,\n-726 MessageBuffer& buffer,\n-727 int count=0)\n-728 {\n-729 if(tracker.fixedSize) // fixed size if variable is >0!\n-730 {\n-731 std::size_t noIndices=std::min(buffer.size()/tracker.fixedSize,\n-tracker.indicesLeft());\n-732\n-733 for(std::size_t i=0; i< noIndices; ++i)\n-734 {\n-735 handle.scatter(buffer, tracker.index(), tracker.fixedSize);\n-736 tracker.moveToNextIndex();\n-737 }\n-738 return tracker.finished();\n-739 }\n-740 else\n-741 {\n-742 assert(count);\n-743 for(int unpacked=0;unpacked\n-761struct UnpackSizeEntries{\n-762\n-770 bool operator()(SizeDataHandle& handle, InterfaceTracker&\n-tracker,\n-771 MessageBuffer::DataType>& buffer) const\n-772 {\n-773 std::size_t noIndices=std::min(buffer.size(), tracker.indicesLeft());\n-774 std::copy(static_cast(buffer), static_cast\n-(buffer)+noIndices,\n-775 handle.getSizesPointer()+tracker.offset());\n-776 tracker.increment(noIndices);\n-777 return noIndices;\n-778 }\n-779 bool operator()(SizeDataHandle& handle, InterfaceTracker&\n-tracker,\n-780 MessageBuffer::DataType>& buffer, int)\n-const\n-781 {\n-782 return operator()(handle,tracker,buffer);\n-783 }\n-784};\n-785\n-793void sendFixedSize(std::vector& send_trackers,\n-794 std::vector& send_requests,\n-795 std::vector& recv_trackers,\n-796 std::vector& recv_requests,\n-797 MPI_Comm communicator)\n-798{\n-799 typedef std::vector::iterator TIter;\n-800 std::vector::iterator mIter=recv_requests.begin();\n-801\n-802 for(TIter iter=recv_trackers.begin(), end=recv_trackers.end(); iter!=end;\n-803 ++iter, ++mIter)\n-804 {\n-805 MPI_Irecv(&(iter->fixedSize), 1, _\bM_\bP_\bI_\bT_\br_\ba_\bi_\bt_\bs_\b<_\bs_\bt_\bd_\b:_\b:_\bs_\bi_\bz_\be_\b__\bt_\b>_\b:_\b:_\bg_\be_\bt_\bT_\by_\bp_\be(),\n-806 iter->rank(), 933881, communicator, &(*mIter));\n-807 }\n-808\n-809 // Send our size to all neighbours using non-blocking synchronous\n-communication.\n-810 std::vector::iterator mIter1=send_requests.begin();\n-811 for(TIter iter=send_trackers.begin(), end=send_trackers.end();\n-812 iter!=end;\n-813 ++iter, ++mIter1)\n-814 {\n-815 MPI_Issend(&(iter->fixedSize), 1, _\bM_\bP_\bI_\bT_\br_\ba_\bi_\bt_\bs_\b<_\bs_\bt_\bd_\b:_\b:_\bs_\bi_\bz_\be_\b__\bt_\b>_\b:_\b:_\bg_\be_\bt_\bT_\by_\bp_\be(),\n-816 iter->rank(), 933881, communicator, &(*mIter1));\n-817 }\n-818}\n-819\n-820\n-825template\n-826struct SetupSendRequest{\n-827 void operator()(DataHandle& handle,\n-828 InterfaceTracker& tracker,\n-829 MessageBuffer& buffer,\n-830 MPI_Request& request,\n-831 MPI_Comm comm) const\n-832 {\n-833 buffer.reset();\n-834 int _\bs_\bi_\bz_\be=PackEntries()(handle, tracker, buffer);\n-835 // Skip indices of zero size.\n-836 while(!tracker.finished() && !handle.size(tracker.index()))\n-837 tracker.moveToNextIndex();\n-838 if(_\bs_\bi_\bz_\be)\n-839 MPI_Issend(buffer, _\bs_\bi_\bz_\be, _\bM_\bP_\bI_\bT_\br_\ba_\bi_\bt_\bs_\b<_\bt_\by_\bp_\be_\bn_\ba_\bm_\be_\b _\bD_\ba_\bt_\ba_\bH_\ba_\bn_\bd_\bl_\be_\b:_\b:_\bD_\ba_\bt_\ba_\bT_\by_\bp_\be_\b>_\b:_\b:_\bg_\be_\bt_\bT_\by_\bp_\be\n-(),\n-840 tracker.rank(), 933399, comm, &request);\n-841 }\n-842};\n-843\n-844\n-849template\n-850struct SetupRecvRequest{\n-851 void operator()(DataHandle& /*handle*/,\n-852 InterfaceTracker& tracker,\n-853 MessageBuffer& buffer,\n-854 MPI_Request& request,\n-855 MPI_Comm comm) const\n-856 {\n-857 buffer.reset();\n-858 if(tracker.indicesLeft())\n-859 MPI_Irecv(buffer, buffer.size(), _\bM_\bP_\bI_\bT_\br_\ba_\bi_\bt_\bs_\b<_\bt_\by_\bp_\be_\bn_\ba_\bm_\be_\b _\bD_\ba_\bt_\ba_\bH_\ba_\bn_\bd_\bl_\be_\b:_\b:_\bD_\ba_\bt_\ba_\bT_\by_\bp_\be_\b>_\b:_\b:\n-_\bg_\be_\bt_\bT_\by_\bp_\be(),\n-860 tracker.rank(), 933399, comm, &request);\n-861 }\n-862};\n-863\n-867template\n-868struct NullPackUnpackFunctor\n-869{\n-870 int operator()(DataHandle&, InterfaceTracker&,\n-871 MessageBuffer&, int)\n-872 {\n-873 return 0;\n-874 }\n-875 int operator()(DataHandle&, InterfaceTracker&,\n-876 MessageBuffer&)\n-877 {\n-878 return 0;\n-879 }\n-880};\n-881\n-896template\n-897std::size_t checkAndContinue(DataHandle& handle,\n-898 std::vector& trackers,\n-899 std::vector& requests,\n-900 std::vector& requests2,\n-901 std::vector >& buffers,\n-902 MPI_Comm comm,\n-903 BufferFunctor buffer_func,\n-904 CommunicationFunctor comm_func,\n-905 bool valid=true,\n-906 bool getCount=false)\n-907{\n-908 std::size_t _\bs_\bi_\bz_\be=requests.size();\n-909 std::vector statuses(_\bs_\bi_\bz_\be);\n-910 int no_completed;\n-911 std::vector indices(_\bs_\bi_\bz_\be, -1); // the indices for which the\n-communication finished.\n-912\n-913 MPI_Testsome(_\bs_\bi_\bz_\be, &(requests[0]), &no_completed, &(indices[0]), &(statuses\n-[0]));\n-914 indices.resize(no_completed);\n-915 for(std::vector::iterator index=indices.begin(), end=indices.end();\n-916 index!=end; ++index)\n-917 {\n-918 InterfaceTracker& tracker=trackers[*index];\n-919 setReceivingIndex(handle, *index);\n-920 if(getCount)\n-921 {\n-922 // Get the number of entries received\n-923 int count;\n-924 MPI_Get_count(&(statuses[index-indices.begin()]),\n-925 _\bM_\bP_\bI_\bT_\br_\ba_\bi_\bt_\bs_\b<_\bt_\by_\bp_\be_\bn_\ba_\bm_\be_\b _\bD_\ba_\bt_\ba_\bH_\ba_\bn_\bd_\bl_\be_\b:_\b:_\bD_\ba_\bt_\ba_\bT_\by_\bp_\be_\b>_\b:_\b:_\bg_\be_\bt_\bT_\by_\bp_\be(),\n-926 &count);\n-927 // Communication completed, we can reuse the buffers, e.g. unpack or repack\n-928 buffer_func(handle, tracker, buffers[*index], count);\n-929 }else\n-930 buffer_func(handle, tracker, buffers[*index]);\n-931 tracker.skipZeroIndices();\n-932 if(!tracker.finished()){\n-933 // Maybe start another communication.\n-934 comm_func(handle, tracker, buffers[*index], requests2[*index], comm);\n-935 tracker.skipZeroIndices();\n-936 if(valid)\n-937 --no_completed; // communication not finished, decrement counter for\n-finished ones.\n-938 }\n-939 }\n-940 return no_completed;\n-941\n-942}\n-943\n-953template\n-954std::size_t receiveSizeAndSetupReceive(DataHandle& handle,\n-955 std::vector& trackers,\n-956 std::vector& size_requests,\n-957 std::vector& data_requests,\n-958 std::vector >& buffers,\n-959 MPI_Comm comm)\n-960{\n-961 return checkAndContinue(handle, trackers, size_requests, data_requests,\n-buffers, comm,\n-962 NullPackUnpackFunctor(), SetupRecvRequest(),\n-false);\n-963}\n-964\n-973template\n-974std::size_t checkSendAndContinueSending(DataHandle& handle,\n-975 std::vector& trackers,\n-976 std::vector& requests,\n-977 std::vector >& buffers,\n-978 MPI_Comm comm)\n-979{\n-980 return checkAndContinue(handle, trackers, requests, requests, buffers,\n-comm,\n-981 NullPackUnpackFunctor(), SetupSendRequest());\n-982}\n-983\n-992template\n-993std::size_t checkReceiveAndContinueReceiving(DataHandle& handle,\n-994 std::vector& trackers,\n-995 std::vector& requests,\n-996 std::vector >& buffers,\n-997 MPI_Comm comm)\n-998{\n-999 return checkAndContinue(handle, trackers, requests, requests, buffers,\n-comm,\n-1000 UnpackEntries(), SetupRecvRequest(),\n-1001 true, !Impl::callFixedSize(handle));\n-1002}\n-1003\n-1004\n-1005bool validRecvRequests(const std::vector reqs)\n-1006{\n-1007 for(std::vector::const_iterator i=reqs.begin(), end=reqs.end\n-();\n-1008 i!=end; ++i)\n-1009 if(*i!=MPI_REQUEST_NULL)\n-1010 return true;\n-1011 return false;\n-1012}\n-1013\n-1024template\n-1025std::size_t setupRequests(DataHandle& handle,\n-1026 std::vector& trackers,\n-1027 std::vector >& buffers,\n-1028 std::vector& requests,\n-1029 const Functor& setupFunctor,\n-1030 MPI_Comm communicator)\n-1031{\n-1032 typedef typename std::vector::iterator TIter;\n-1033 typename std::vector >::\n-iterator\n-1034 biter=buffers.begin();\n-1035 typename std::vector::iterator riter=requests.begin();\n-1036 std::size_t complete=0;\n-1037 for(TIter titer=trackers.begin(), end=trackers.end(); titer!=end; ++titer,\n-++biter, ++riter)\n-1038 {\n-1039 setupFunctor(handle, *titer, *biter, *riter, communicator);\n-1040 complete+=titer->finished();\n-1041 }\n-1042 return complete;\n-1043}\n-1044} // end unnamed namespace\n-1045\n-1046template\n-1047template\n-1048void VariableSizeCommunicator::setupInterfaceTrackers\n-(DataHandle& handle,\n-1049 std::vector& send_trackers,\n-1050 std::vector& recv_trackers)\n-1051{\n-1052 if(interface_->_\bs_\bi_\bz_\be()==0)\n-1053 return;\n-1054 send_trackers.reserve(interface_->_\bs_\bi_\bz_\be());\n-1055 recv_trackers.reserve(interface_->_\bs_\bi_\bz_\be());\n-1056\n-1057 int fixedsize=0;\n-1058 if(Impl::callFixedSize(handle))\n-1059 ++fixedsize;\n-1060\n-1061\n-1062 typedef typename InterfaceMap::const_iterator IIter;\n-1063 for(IIter inf=interface_->begin(), end=interface_->end(); inf!=end; ++inf)\n-1064 {\n-1065\n-1066 if(Impl::callFixedSize(handle) && InterfaceInformationChooser::\n-getSend(inf->second).size())\n-1067 fixedsize=handle.size(InterfaceInformationChooser::getSend(inf-\n->second)[0]);\n-1068 assert(!Impl::callFixedSize(handle)||fixedsize>0);\n-1069 send_trackers.push_back(InterfaceTracker(inf->first,\n-1070 InterfaceInformationChooser::getSend(inf->second), fixedsize));\n-1071 recv_trackers.push_back(InterfaceTracker(inf->first,\n-1072 InterfaceInformationChooser::getReceive(inf->second), fixedsize,\n-fixedsize==0));\n-1073 }\n-1074}\n-1075\n-1076template\n-1077template\n-1078void VariableSizeCommunicator::communicateFixedSize(DataHandle&\n-handle)\n-1079{\n-1080 std::vector size_send_req(interface_->_\bs_\bi_\bz_\be());\n-1081 std::vector size_recv_req(interface_->_\bs_\bi_\bz_\be());\n-1082\n-1083 std::vector send_trackers;\n-1084 std::vector recv_trackers;\n-1085 setupInterfaceTrackers(handle,send_trackers, recv_trackers);\n-1086 sendFixedSize(send_trackers, size_send_req, recv_trackers, size_recv_req,\n-communicator_);\n-1087\n-1088 std::vector data_send_req(interface_->_\bs_\bi_\bz_\be(),\n-MPI_REQUEST_NULL);\n-1089 std::vector data_recv_req(interface_->_\bs_\bi_\bz_\be(),\n-MPI_REQUEST_NULL);\n-1090 typedef typename DataHandle::DataType DataType;\n-1091 std::vector > send_buffers(interface_->_\bs_\bi_\bz_\be(),\n-MessageBuffer(maxBufferSize_)),\n-1092 recv_buffers(interface_->_\bs_\bi_\bz_\be(), MessageBuffer(maxBufferSize_));\n-1093\n-1094\n-1095 setupRequests(handle, send_trackers, send_buffers, data_send_req,\n-1096 SetupSendRequest(), communicator_);\n-1097\n-1098 std::size_t no_size_to_recv, no_to_send, no_to_recv, old_size;\n-1099 no_size_to_recv = no_to_send = no_to_recv = old_size = interface_->_\bs_\bi_\bz_\be();\n-1100\n-1101 // Skip empty interfaces.\n-1102 typedef typename std::vector::const_iterator Iter;\n-1103 for(Iter i=recv_trackers.begin(), end=recv_trackers.end(); i!=end; ++i)\n-1104 if(i->empty())\n-1105 --no_to_recv;\n-1106 for(Iter i=send_trackers.begin(), end=send_trackers.end(); i!=end; ++i)\n-1107 if(i->empty())\n-1108 --no_to_send;\n-1109\n-1110 while(no_size_to_recv+no_to_send+no_to_recv)\n-1111 {\n-1112 // Receive the fixedsize and setup receives accordingly\n-1113 if(no_size_to_recv)\n-1114 no_size_to_recv -= receiveSizeAndSetupReceive(handle,recv_trackers,\n-size_recv_req,\n-1115 data_recv_req, recv_buffers,\n-1116 communicator_);\n-1117\n-1118 // Check send completion and initiate other necessary sends\n-1119 if(no_to_send)\n-1120 no_to_send -= checkSendAndContinueSending(handle, send_trackers,\n-data_send_req,\n-1121 send_buffers, communicator_);\n-1122 if(validRecvRequests(data_recv_req))\n-1123 // Receive data and setup new unblocking receives if necessary\n-1124 no_to_recv -= checkReceiveAndContinueReceiving(handle, recv_trackers,\n-data_recv_req,\n-1125 recv_buffers, communicator_);\n-1126 }\n-1127\n-1128 // Wait for completion of sending the size.\n-1129 //std::vector statuses(interface_->size(),\n-MPI_STATUSES_IGNORE);\n-1130 MPI_Waitall(size_send_req.size(), &(size_send_req[0]),\n-MPI_STATUSES_IGNORE);\n-1131\n-1132}\n-1133\n-1134template\n-1135template\n-1136void VariableSizeCommunicator::communicateSizes(DataHandle&\n-handle,\n-1137 std::vector& data_recv_trackers)\n-1138{\n-1139 std::vector send_trackers;\n-1140 std::vector recv_trackers;\n-1141 std::size_t _\bs_\bi_\bz_\be = interface_->_\bs_\bi_\bz_\be();\n-1142 std::vector send_requests(_\bs_\bi_\bz_\be, MPI_REQUEST_NULL);\n-1143 std::vector recv_requests(_\bs_\bi_\bz_\be, MPI_REQUEST_NULL);\n-1144 std::vector >\n-1145 send_buffers(_\bs_\bi_\bz_\be, MessageBuffer(maxBufferSize_)),\n-1146 recv_buffers(_\bs_\bi_\bz_\be, MessageBuffer(maxBufferSize_));\n-1147 SizeDataHandle size_handle(handle,data_recv_trackers);\n-1148 setupInterfaceTrackers(size_handle,send_trackers, recv_trackers);\n-1149 setupRequests(size_handle, send_trackers, send_buffers, send_requests,\n-1150 SetupSendRequest >(), communicator_);\n-1151 setupRequests(size_handle, recv_trackers, recv_buffers, recv_requests,\n-1152 SetupRecvRequest >(), communicator_);\n-1153\n-1154 // Count valid requests that we have to wait for.\n-1155 auto valid_req_func =\n-1156 [](const MPI_Request& req) { return req != MPI_REQUEST_NULL; };\n-1157\n-1158 auto size_to_send = std::count_if(send_requests.begin(), send_requests.end\n-(),\n-1159 valid_req_func);\n-1160 auto size_to_recv = std::count_if(recv_requests.begin(), recv_requests.end\n-(),\n-1161 valid_req_func);\n-1162\n-1163 while(size_to_send+size_to_recv)\n-1164 {\n-1165 if(size_to_send)\n-1166 size_to_send -=\n-1167 checkSendAndContinueSending(size_handle, send_trackers, send_requests,\n-1168 send_buffers, communicator_);\n-1169 if(size_to_recv)\n-1170 // Could have done this using checkSendAndContinueSending\n-1171 // But the call below is more efficient as UnpackSizeEntries\n-1172 // uses std::copy.\n-1173 size_to_recv -=\n-1174 checkAndContinue(size_handle, recv_trackers, recv_requests, recv_requests,\n-1175 recv_buffers, communicator_, UnpackSizeEntries(),\n-1176 SetupRecvRequest >());\n-1177 }\n-1178}\n-1179\n-1180template\n-1181template\n-1182void VariableSizeCommunicator::communicateVariableSize\n-(DataHandle& handle)\n-1183{\n-1184\n-1185 std::vector send_trackers;\n-1186 std::vector recv_trackers;\n-1187 setupInterfaceTrackers(handle, send_trackers, recv_trackers);\n-1188\n-1189 std::vector send_requests(interface_->_\bs_\bi_\bz_\be(),\n-MPI_REQUEST_NULL);\n-1190 std::vector recv_requests(interface_->_\bs_\bi_\bz_\be(),\n-MPI_REQUEST_NULL);\n-1191 typedef typename DataHandle::DataType DataType;\n-1192 std::vector >\n-1193 send_buffers(interface_->_\bs_\bi_\bz_\be(), MessageBuffer(maxBufferSize_)),\n-1194 recv_buffers(interface_->_\bs_\bi_\bz_\be(), MessageBuffer(maxBufferSize_));\n-1195\n-1196 communicateSizes(handle, recv_trackers);\n-1197 // Setup requests for sending and receiving.\n-1198 setupRequests(handle, send_trackers, send_buffers, send_requests,\n-1199 SetupSendRequest(), communicator_);\n-1200 setupRequests(handle, recv_trackers, recv_buffers, recv_requests,\n-1201 SetupRecvRequest(), communicator_);\n-1202\n-1203 // Determine number of valid requests.\n-1204 auto valid_req_func =\n-1205 [](const MPI_Request& req) { return req != MPI_REQUEST_NULL;};\n-1206\n-1207 auto no_to_send = std::count_if(send_requests.begin(), send_requests.end\n-(),\n-1208 valid_req_func);\n-1209 auto no_to_recv = std::count_if(recv_requests.begin(), recv_requests.end\n-(),\n-1210 valid_req_func);\n-1211 while(no_to_send+no_to_recv)\n-1212 {\n-1213 // Check send completion and initiate other necessary sends\n-1214 if(no_to_send)\n-1215 no_to_send -= checkSendAndContinueSending(handle, send_trackers,\n-send_requests,\n-1216 send_buffers, communicator_);\n-1217 if(no_to_recv)\n-1218 // Receive data and setup new unblocking receives if necessary\n-1219 no_to_recv -= checkReceiveAndContinueReceiving(handle, recv_trackers,\n-recv_requests,\n-1220 recv_buffers, communicator_);\n-1221 }\n-1222}\n-1223\n-1224template\n-1225template\n-1226void VariableSizeCommunicator::communicate(DataHandle& handle)\n-1227{\n-1228 if( interface_->_\bs_\bi_\bz_\be() == 0)\n-1229 // Simply return as otherwise we will index an empty container\n-1230 // either for MPI_Wait_all or MPI_Test_some.\n-1231 return;\n-1232\n-1233 if(Impl::callFixedSize(handle))\n-1234 communicateFixedSize(handle);\n-1235 else\n-1236 communicateVariableSize(handle);\n-1237}\n-1238} // end namespace Dune\n-1239\n-1240#endif // HAVE_MPI\n-1241#endif // DUNE_COMMON_PARALLEL_VARIABLESIZECOMMUNICATOR_HH\n-_\bf_\bi_\bx_\be_\bd_\bS_\bi_\bz_\be\n-std::size_t fixedSize\n-The number of data items per index if it is fixed, 0 otherwise.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn variablesizecommunicator.hh:264\n-_\bm_\bp_\bi_\bt_\br_\ba_\bi_\bt_\bs_\b._\bh_\bh\n-Traits classes for mapping types onto MPI_Datatype.\n-_\bc_\bo_\bn_\bc_\be_\bp_\bt_\b._\bh_\bh\n-Infrastructure for concepts.\n-_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bt_\be_\br_\bf_\ba_\bc_\be_\b:_\b:_\bc_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bo_\br\n-MPI_Comm communicator() const\n-Get the MPI Communicator.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn parallel/interface.hh:426\n-_\bD_\bu_\bn_\be\n-Dune namespace.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn alignedallocator.hh:13\n-_\bD_\bu_\bn_\be_\b:_\b:_\bs_\bi_\bz_\be\n-constexpr std::integral_constant< std::size_t, sizeof...(II)> size(std::\n-integer_sequence< T, II... >)\n-Return the size of the sequence.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn integersequence.hh:75\n-_\bD_\bu_\bn_\be_\b:_\b:_\be_\bm_\bp_\bt_\by\n-constexpr std::bool_constant<(sizeof...(II)==0)> empty(std::integer_sequence<\n-T, II... >)\n-Checks whether the sequence is empty.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn integersequence.hh:80\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\bP_\bI_\bT_\br_\ba_\bi_\bt_\bs_\b:_\b:_\bg_\be_\bt_\bT_\by_\bp_\be\n-static MPI_Datatype getType()\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mpitraits.hh:48\n-_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bt_\be_\br_\bf_\ba_\bc_\be_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\bs_\bi_\bz_\be\n-size_t size() const\n-Get the number of entries in the interface.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn parallel/interface.hh:117\n-_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bt_\be_\br_\bf_\ba_\bc_\be\n-Communication interface between remote and local indices.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn parallel/interface.hh:218\n-_\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bn_\bc_\be_\bp_\bt_\b:_\b:_\bH_\ba_\bs_\bF_\bi_\bx_\be_\bd_\bS_\bi_\bz_\be\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn variablesizecommunicator.hh:42\n-_\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bn_\bc_\be_\bp_\bt_\b:_\b:_\bH_\ba_\bs_\bF_\bi_\bx_\be_\bd_\bS_\bi_\bz_\be_\b:_\b:_\br_\be_\bq_\bu_\bi_\br_\be\n-auto require(H &&h) -> decltype(h.fixedSize())\n-_\bD_\bu_\bn_\be_\b:_\b:_\bV_\ba_\br_\bi_\ba_\bb_\bl_\be_\bS_\bi_\bz_\be_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bo_\br\n-A buffered communicator where the amount of data sent does not have to be known\n-a priori.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn variablesizecommunicator.hh:331\n-_\bD_\bu_\bn_\be_\b:_\b:_\bV_\ba_\br_\bi_\ba_\bb_\bl_\be_\bS_\bi_\bz_\be_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bo_\br_\b:_\b:_\bV_\ba_\br_\bi_\ba_\bb_\bl_\be_\bS_\bi_\bz_\be_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bo_\br\n-VariableSizeCommunicator(const Interface &inf, std::size_t max_buffer_size)\n-Creates a communicator with a specific maximum buffer size.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn variablesizecommunicator.hh:403\n-_\bD_\bu_\bn_\be_\b:_\b:_\bV_\ba_\br_\bi_\ba_\bb_\bl_\be_\bS_\bi_\bz_\be_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bo_\br_\b:_\b:_\bb_\ba_\bc_\bk_\bw_\ba_\br_\bd\n-void backward(DataHandle &handle)\n-Communicate backwards.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn variablesizecommunicator.hh:485\n-_\bD_\bu_\bn_\be_\b:_\b:_\bV_\ba_\br_\bi_\ba_\bb_\bl_\be_\bS_\bi_\bz_\be_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bo_\br_\b:_\b:_\b~_\bV_\ba_\br_\bi_\ba_\bb_\bl_\be_\bS_\bi_\bz_\be_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bo_\br\n-~VariableSizeCommunicator()\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn variablesizecommunicator.hh:409\n-_\bD_\bu_\bn_\be_\b:_\b:_\bV_\ba_\br_\bi_\ba_\bb_\bl_\be_\bS_\bi_\bz_\be_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bo_\br_\b:_\b:_\bV_\ba_\br_\bi_\ba_\bb_\bl_\be_\bS_\bi_\bz_\be_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bo_\br\n-VariableSizeCommunicator(MPI_Comm comm, const InterfaceMap &inf, std::size_t\n-max_buffer_size)\n-Creates a communicator with a specific maximum buffer size.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn variablesizecommunicator.hh:392\n-_\bD_\bu_\bn_\be_\b:_\b:_\bV_\ba_\br_\bi_\ba_\bb_\bl_\be_\bS_\bi_\bz_\be_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bo_\br_\b:_\b:_\bV_\ba_\br_\bi_\ba_\bb_\bl_\be_\bS_\bi_\bz_\be_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bo_\br\n-VariableSizeCommunicator(const VariableSizeCommunicator &other)\n-Copy-constructs a communicator.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn variablesizecommunicator.hh:418\n-_\bD_\bu_\bn_\be_\b:_\b:_\bV_\ba_\br_\bi_\ba_\bb_\bl_\be_\bS_\bi_\bz_\be_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bo_\br_\b:_\b:_\bf_\bo_\br_\bw_\ba_\br_\bd\n-void forward(DataHandle &handle)\n-Communicate forward.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn variablesizecommunicator.hh:460\n-_\bD_\bu_\bn_\be_\b:_\b:_\bV_\ba_\br_\bi_\ba_\bb_\bl_\be_\bS_\bi_\bz_\be_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bo_\br_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b=\n-VariableSizeCommunicator & operator=(const VariableSizeCommunicator &other)\n-Copy-assignes a communicator.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn variablesizecommunicator.hh:428\n-_\bD_\bu_\bn_\be_\b:_\b:_\bV_\ba_\br_\bi_\ba_\bb_\bl_\be_\bS_\bi_\bz_\be_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bo_\br_\b:_\b:_\bI_\bn_\bt_\be_\br_\bf_\ba_\bc_\be_\bM_\ba_\bp\n-std::map< int, std::pair< InterfaceInformation, InterfaceInformation >, std::\n-less< int >, typename std::allocator_traits< Allocator >::template\n-rebind_alloc< std::pair< const int, std::pair< InterfaceInformation,\n-InterfaceInformation > > > > InterfaceMap\n-The type of the map from process number to InterfaceInformation for sending and\n-receiving to and from...\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn variablesizecommunicator.hh:339\n-_\bD_\bu_\bn_\be_\b:_\b:_\bV_\ba_\br_\bi_\ba_\bb_\bl_\be_\bS_\bi_\bz_\be_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bo_\br_\b:_\b:_\bV_\ba_\br_\bi_\ba_\bb_\bl_\be_\bS_\bi_\bz_\be_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bo_\br\n-VariableSizeCommunicator(MPI_Comm comm, const InterfaceMap &inf)\n-Creates a communicator with the default maximum buffer size.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn variablesizecommunicator.hh:348\n-_\bD_\bu_\bn_\be_\b:_\b:_\bV_\ba_\br_\bi_\ba_\bb_\bl_\be_\bS_\bi_\bz_\be_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bo_\br_\b:_\b:_\bV_\ba_\br_\bi_\ba_\bb_\bl_\be_\bS_\bi_\bz_\be_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bo_\br\n-VariableSizeCommunicator(const Interface &inf)\n-Creates a communicator with the default maximum buffer size.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn variablesizecommunicator.hh:357\n-_\bi_\bn_\bt_\be_\br_\bf_\ba_\bc_\be_\b._\bh_\bh\n-Provides classes for building the communication interface between remote\n-indices.\n+14#ifdef DOXYGEN\n+_\b3_\b2#define DUNE_NO_DEPRECATED_BEGIN ...\n+_\b3_\b8#define DUNE_NO_DEPRECATED_END ...\n+39#else\n+40# if defined __clang__\n+41# define DUNE_NO_DEPRECATED_BEGIN \\\n+42 _Pragma(\"clang diagnostic push\") \\\n+43 _Pragma(\"clang diagnostic ignored \\\"-Wdeprecated-declarations\\\"\")\n+44# define DUNE_NO_DEPRECATED_END _Pragma(\"clang diagnostic pop\")\n+45# elif defined __INTEL_COMPILER\n+46# define DUNE_NO_DEPRECATED_BEGIN \\\n+47 _Pragma(\"warning push\") \\\n+48 _Pragma(\"warning(disable:1478)\") \\\n+49 _Pragma(\"warning(disable:1786)\")\n+50# define DUNE_NO_DEPRECATED_END _Pragma(\"warning pop\")\n+51# elif defined __GNUC__\n+52# define DUNE_NO_DEPRECATED_BEGIN \\\n+53 _Pragma(\"GCC diagnostic push\") \\\n+54 _Pragma(\"GCC diagnostic ignored \\\"-Wdeprecated-declarations\\\"\")\n+55# define DUNE_NO_DEPRECATED_END _Pragma(\"GCC diagnostic pop\")\n+56# else\n+57# define DUNE_NO_DEPRECATED_BEGIN /* Noop. */\n+58# define DUNE_NO_DEPRECATED_END /* Noop. */\n+59# endif\n+60#endif\n+61\n+63\n+64#endif\n ===============================================================================\n Generated by\u00a0_\b[_\bd_\bo_\bx_\by_\bg_\be_\bn_\b] 1.9.8\n"}]}, {"source1": "./usr/share/doc/libdune-common-doc/doxygen/a00035.html", "source2": "./usr/share/doc/libdune-common-doc/doxygen/a00035.html", "unified_diff": "@@ -1,15 +1,15 @@\n \n \n \n \n \n \n \n-dune-common: mpidata.hh File Reference\n+dune-common: ios_state.hh File Reference\n \n \n \n \n \n \n \n@@ -65,62 +65,46 @@\n \n \n \n \n \n \n \n
\n \n-
mpidata.hh File Reference
\n+Namespaces
\n+
ios_state.hh File Reference
\n \n
\n \n-

Interface class to translate objects to a MPI_Datatype, void* and size used for MPI calls. \n+

Utility class for storing and resetting stream attributes. \n More...

\n-
#include <vector>
\n-#include <string>
\n-#include <type_traits>
\n-#include <dune/common/typetraits.hh>
\n-#include <dune/common/std/type_traits.hh>
\n-#include <dune/common/parallel/mpitraits.hh>
\n+
#include <ios>
\n
\n

Go to the source code of this file.

\n \n \n-\n-\n-\n-\n-\n+\n+\n \n

\n Classes

struct  Dune::MPIData< T, Enable >
 
struct  Dune::MPIData< void >
 
struct  Dune::MPIData< T, std::void_t< std::tuple< decltype(std::declval< T >().data()), decltype(std::declval< T >().size()), typename std::decay_t< T >::value_type > > >
class  Dune::ios_base_all_saver
 Utility class for storing and resetting stream attributes. More...
 
\n \n \n \n \n-

\n Namespaces

namespace  Dune
 Dune namespace.
 
\n-\n-\n-\n-\n

\n-Functions

template<class T >
auto Dune::getMPIData (T &t)
 
\n

Detailed Description

\n-

Interface class to translate objects to a MPI_Datatype, void* and size used for MPI calls.

\n-

Furthermore it can be used to resize the object if possible. This makes it possible to receive a message with variable size. See Communication::rrecv.

\n-

To 'register' a new dynamic type for MPI communication specialize MPIData or overload getMPIData.

\n+

Utility class for storing and resetting stream attributes.

\n+
Author
Markus Blatt
\n
\n \n
\n Generated by \"doxygen\"/ 1.9.8\n
\n \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,45 +1,26 @@\n dune-common\u00a02.10\n Loading...\n Searching...\n No Matches\n * _\bd_\bu_\bn_\be\n * _\bc_\bo_\bm_\bm_\bo_\bn\n- * _\bp_\ba_\br_\ba_\bl_\bl_\be_\bl\n-_\bC_\bl_\ba_\bs_\bs_\be_\bs | _\bN_\ba_\bm_\be_\bs_\bp_\ba_\bc_\be_\bs | _\bF_\bu_\bn_\bc_\bt_\bi_\bo_\bn_\bs\n-mpidata.hh File Reference\n-_\bC_\bo_\bm_\bm_\bo_\bn \u00bb _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\b _\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn\n-Interface class to translate objects to a MPI_Datatype, void* and size used for\n-MPI calls. _\bM_\bo_\br_\be_\b._\b._\b.\n-#include \n-#include \n-#include \n-#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bt_\by_\bp_\be_\bt_\br_\ba_\bi_\bt_\bs_\b._\bh_\bh>\n-#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bs_\bt_\bd_\b/_\bt_\by_\bp_\be_\b__\bt_\br_\ba_\bi_\bt_\bs_\b._\bh_\bh>\n-#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bp_\ba_\br_\ba_\bl_\bl_\be_\bl_\b/_\bm_\bp_\bi_\bt_\br_\ba_\bi_\bt_\bs_\b._\bh_\bh>\n+_\bC_\bl_\ba_\bs_\bs_\be_\bs | _\bN_\ba_\bm_\be_\bs_\bp_\ba_\bc_\be_\bs\n+ios_state.hh File Reference\n+_\bC_\bo_\bm_\bm_\bo_\bn\n+Utility class for storing and resetting stream attributes. _\bM_\bo_\br_\be_\b._\b._\b.\n+#include \n _\bG_\bo_\b _\bt_\bo_\b _\bt_\bh_\be_\b _\bs_\bo_\bu_\br_\bc_\be_\b _\bc_\bo_\bd_\be_\b _\bo_\bf_\b _\bt_\bh_\bi_\bs_\b _\bf_\bi_\bl_\be_\b.\n C\bCl\bla\bas\bss\bse\bes\bs\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bM_\bP_\bI_\bD_\ba_\bt_\ba_\b<_\b _\bT_\b,_\b _\bE_\bn_\ba_\bb_\bl_\be_\b _\b>\n-\u00a0\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bM_\bP_\bI_\bD_\ba_\bt_\ba_\b<_\b _\bv_\bo_\bi_\bd_\b _\b>\n-\u00a0\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bM_\bP_\bI_\bD_\ba_\bt_\ba_\b<_\b _\bT_\b,_\b _\bs_\bt_\bd_\b:_\b:_\bv_\bo_\bi_\bd_\b__\bt_\b<_\b _\bs_\bt_\bd_\b:_\b:_\bt_\bu_\bp_\bl_\be_\b<_\b _\bd_\be_\bc_\bl_\bt_\by_\bp_\be_\b(_\bs_\bt_\bd_\b:_\b:_\bd_\be_\bc_\bl_\bv_\ba_\bl_\b<_\b _\bT_\b _\b>\n- _\b(_\b)_\b._\bd_\ba_\bt_\ba_\b(_\b)_\b)_\b,_\b _\bd_\be_\bc_\bl_\bt_\by_\bp_\be_\b(_\bs_\bt_\bd_\b:_\b:_\bd_\be_\bc_\bl_\bv_\ba_\bl_\b<_\b _\bT_\b _\b>_\b(_\b)_\b._\bs_\bi_\bz_\be_\b(_\b)_\b)_\b,_\b _\bt_\by_\bp_\be_\bn_\ba_\bm_\be_\b _\bs_\bt_\bd_\b:_\b:\n- _\bd_\be_\bc_\ba_\by_\b__\bt_\b<_\b _\bT_\b _\b>_\b:_\b:_\bv_\ba_\bl_\bu_\be_\b__\bt_\by_\bp_\be_\b _\b>_\b _\b>_\b _\b>\n+class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bi_\bo_\bs_\b__\bb_\ba_\bs_\be_\b__\ba_\bl_\bl_\b__\bs_\ba_\bv_\be_\br\n+\u00a0 Utility class for storing and resetting stream attributes. _\bM_\bo_\br_\be_\b._\b._\b.\n \u00a0\n N\bNa\bam\bme\bes\bsp\bpa\bac\bce\bes\bs\n namespace \u00a0 _\bD_\bu_\bn_\be\n \u00a0 _\bD_\bu_\bn_\be namespace.\n \u00a0\n-F\bFu\bun\bnc\bct\bti\bio\bon\bns\bs\n-template\n-auto\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bg_\be_\bt_\bM_\bP_\bI_\bD_\ba_\bt_\ba (T &t)\n-\u00a0\n *\b**\b**\b**\b**\b* D\bDe\bet\bta\bai\bil\ble\bed\bd D\bDe\bes\bsc\bcr\bri\bip\bpt\bti\bio\bon\bn *\b**\b**\b**\b**\b*\n-Interface class to translate objects to a MPI_Datatype, void* and size used for\n-MPI calls.\n-Furthermore it can be used to resize the object if possible. This makes it\n-possible to receive a message with variable size. See Communication::rrecv.\n-To 'register' a new dynamic type for MPI communication specialize MPIData or\n-overload getMPIData.\n+Utility class for storing and resetting stream attributes.\n+ Author\n+ Markus Blatt\n ===============================================================================\n Generated by\u00a0_\b[_\bd_\bo_\bx_\by_\bg_\be_\bn_\b] 1.9.8\n"}]}, {"source1": "./usr/share/doc/libdune-common-doc/doxygen/a00035_source.html", "source2": "./usr/share/doc/libdune-common-doc/doxygen/a00035_source.html", "unified_diff": "@@ -1,15 +1,15 @@\n \n \n \n \n \n \n \n-dune-common: mpidata.hh Source File\n+dune-common: ios_state.hh Source File\n \n \n \n \n \n \n \n@@ -70,197 +70,59 @@\n
\n
\n \n \n \n \n \n
\n-
mpidata.hh
\n+
ios_state.hh
\n
\n
\n Go to the documentation of this file.
1// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
\n
2// vi: set et ts=4 sw=2 sts=2:
\n
3// SPDX-FileCopyrightInfo: Copyright \u00a9 DUNE Project contributors, see file LICENSE.md in module root
\n
4// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception
\n-
5
\n-
6#ifndef DUNE_COMMON_PARALLEL_MPIDATA_HH
\n-
7#define DUNE_COMMON_PARALLEL_MPIDATA_HH
\n-
8
\n-
9#if HAVE_MPI
\n-
10
\n-
11#include <vector>
\n-
12#include <string>
\n-
13#include <type_traits>
\n-
14
\n-\n-\n-\n-
18
\n-
38namespace Dune{
\n-
39
\n-
40 template<class, class = void>
\n-
41 struct MPIData;
\n-
42
\n-
43 template<class T>
\n-
\n-
44 auto getMPIData(T& t){
\n-
45 return MPIData<T>(t);
\n-
46 }
\n-
\n-
47
\n-
48 // Default implementation for static datatypes
\n-
49 template<class T, class Enable>
\n-
\n-
50 struct MPIData
\n-
51 {
\n-
52 friend auto getMPIData<T>(T&);
\n-
53 protected:
\n-\n-
55
\n-
\n-
56 MPIData(T& t)
\n-
57 : data_(t)
\n-
58 {}
\n-
\n-
59
\n-
60 public:
\n-
\n-
61 void* ptr() const {
\n-
62 return (void*)&data_;
\n-
63 }
\n-
\n-
64
\n-
65 // indicates whether the datatype can be resized
\n-
66 static constexpr bool static_size = true;
\n-
67
\n-
\n-
68 int size() const{
\n-
69 return 1;
\n-
70 }
\n-
\n-
71
\n-
\n-
72 MPI_Datatype type() const {
\n-
73 return MPITraits<std::decay_t<T>>::getType();
\n-
74 }
\n-
\n-
75 };
\n+
5#ifndef DUNE_COMMON_IOS_STATE_HH
\n+
6#define DUNE_COMMON_IOS_STATE_HH
\n+
7
\n+
8#include <ios>
\n+
9
\n+
10namespace Dune {
\n+
\n+\n+
34 {
\n+
35 public:
\n+
37 typedef std::ios_base state_type;
\n+
38
\n+\n+
49
\n+\n+
54
\n+
61 void restore();
\n+
62
\n+
63 private:
\n+
65 state_type& ios;
\n+
67 state_type::fmtflags oldflags;
\n+
69 std::streamsize oldprec;
\n+
71 std::streamsize oldwidth;
\n+
72 };
\n
\n+
73
\n+
75}
\n
76
\n-
77 // dummy implementation for void
\n-
78 template<>
\n-
\n-
79 struct MPIData<void>{
\n-
80 protected:
\n-\n-
82
\n-
83 public:
\n-
\n-
84 void* ptr(){
\n-
85 return nullptr;
\n-
86 }
\n-
\n-
\n-
87 int size(){
\n-
88 return 0;
\n-
89 }
\n-
\n-
90 void get(){}
\n-
\n-
91 MPI_Datatype type() const{
\n-
92 return MPI_INT;
\n-
93 }
\n-
\n-
94 };
\n-
\n-
95
\n-
96 // specializations:
\n-
97 // std::vector of static sized elements or std::string
\n-
98 template<class T>
\n-
\n-
99 struct MPIData<T, std::void_t<std::tuple<decltype(std::declval<T>().data()),
\n-
100 decltype(std::declval<T>().size()),
\n-
101 typename std::decay_t<T>::value_type>>>{
\n-
102 private:
\n-
103 template<class U>
\n-
104 using hasResizeOp = decltype(std::declval<U>().resize(0));
\n-
105
\n-
106 protected:
\n-
107 friend auto getMPIData<T>(T&);
\n-
\n-\n-
109 : data_(t)
\n-
110 {}
\n-
\n-
111 public:
\n-
112 static constexpr bool static_size = std::is_const<T>::value || !Std::is_detected_v<hasResizeOp, T>;
\n-
\n-
113 void* ptr() {
\n-
114 return (void*) data_.data();
\n-
115 }
\n-
\n-
\n-
116 int size() {
\n-
117 return data_.size();
\n-
118 }
\n-
\n-
\n-
119 MPI_Datatype type() const{
\n-\n-
121 }
\n-
\n-
122
\n-
123 template<class S = T>
\n-
\n-
124 auto /*void*/ resize(int size)
\n-
125 -> std::enable_if_t<!std::is_const<S>::value || !Std::is_detected_v<hasResizeOp, S>>
\n-
126 {
\n-
127 data_.resize(size);
\n-
128 }
\n-
\n-
129
\n-
130 protected:
\n-\n-
132 };
\n-
\n-
133
\n-
134}
\n-
135
\n-
140#endif // HAVE_MPI
\n-
141#endif // DUNE_COMMON_PARALLEL_MPIDATA_HH
\n-
Traits classes for mapping types onto MPI_Datatype.
\n-\n-
Traits for type conversions and type information.
\n-
typename Impl::voider< Types... >::type void_t
Is void for all valid input types. The workhorse for C++11 SFINAE-techniques.
Definition typetraits.hh:40
\n-
STL namespace.
\n+
77#endif // DUNE_COMMON_IOS_STATE_HH
\n+
~ios_base_all_saver()
Destructor that restores the flags stored by the constructor.
Definition ios_state.cc:20
\n+
void restore()
Restore flags now.
Definition ios_state.cc:25
\n+
std::ios_base state_type
Export type of object we save the state for.
Definition ios_state.hh:37
\n
Dune namespace.
Definition alignedallocator.hh:13
\n-
auto getMPIData(T &t)
Definition mpidata.hh:44
\n-
A traits class describing the mapping of types onto MPI_Datatypes.
Definition mpitraits.hh:41
\n-
Definition mpidata.hh:51
\n-
T & data_
Definition mpidata.hh:54
\n-
MPI_Datatype type() const
Definition mpidata.hh:72
\n-
void * ptr() const
Definition mpidata.hh:61
\n-
int size() const
Definition mpidata.hh:68
\n-
static constexpr bool static_size
Definition mpidata.hh:66
\n-
MPIData(T &t)
Definition mpidata.hh:56
\n-
void get()
Definition mpidata.hh:90
\n-
MPIData()
Definition mpidata.hh:81
\n-
int size()
Definition mpidata.hh:87
\n-
void * ptr()
Definition mpidata.hh:84
\n-
MPI_Datatype type() const
Definition mpidata.hh:91
\n-\n-\n-\n-\n-
auto resize(int size) -> std::enable_if_t<!std::is_const< S >::value||!Std::is_detected_v< hasResizeOp, S > >
Definition mpidata.hh:124
\n-\n+
Utility class for storing and resetting stream attributes.
Definition ios_state.hh:34
\n
\n \n
\n Generated by \"doxygen\"/ 1.9.8\n
\n \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,218 +1,60 @@\n dune-common\u00a02.10\n Loading...\n Searching...\n No Matches\n * _\bd_\bu_\bn_\be\n * _\bc_\bo_\bm_\bm_\bo_\bn\n- * _\bp_\ba_\br_\ba_\bl_\bl_\be_\bl\n-mpidata.hh\n+ios_state.hh\n _\bG_\bo_\b _\bt_\bo_\b _\bt_\bh_\be_\b _\bd_\bo_\bc_\bu_\bm_\be_\bn_\bt_\ba_\bt_\bi_\bo_\bn_\b _\bo_\bf_\b _\bt_\bh_\bi_\bs_\b _\bf_\bi_\bl_\be_\b.\n 1// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-\n 2// vi: set et ts=4 sw=2 sts=2:\n 3// SPDX-FileCopyrightInfo: Copyright \u00c2\u00a9 DUNE Project contributors, see file\n LICENSE.md in module root\n 4// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception\n-5\n-6#ifndef DUNE_COMMON_PARALLEL_MPIDATA_HH\n-7#define DUNE_COMMON_PARALLEL_MPIDATA_HH\n-8\n-9#if HAVE_MPI\n-10\n-11#include \n-12#include \n-13#include \n-14\n-15#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bt_\by_\bp_\be_\bt_\br_\ba_\bi_\bt_\bs_\b._\bh_\bh>\n-16#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bs_\bt_\bd_\b/_\bt_\by_\bp_\be_\b__\bt_\br_\ba_\bi_\bt_\bs_\b._\bh_\bh>\n-17#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bp_\ba_\br_\ba_\bl_\bl_\be_\bl_\b/_\bm_\bp_\bi_\bt_\br_\ba_\bi_\bt_\bs_\b._\bh_\bh>\n-18\n-38namespace _\bD_\bu_\bn_\be{\n-39\n-40 template\n-41 struct MPIData;\n-42\n-43 template\n-_\b4_\b4 auto _\bg_\be_\bt_\bM_\bP_\bI_\bD_\ba_\bt_\ba(T& t){\n-45 return _\bM_\bP_\bI_\bD_\ba_\bt_\ba_\b<_\bT_\b>(t);\n-46 }\n-47\n-48 // Default implementation for static datatypes\n-49 template\n-_\b5_\b0 struct _\bM_\bP_\bI_\bD_\ba_\bt_\ba\n-51 {\n-52 friend auto getMPIData(T&);\n-53 protected:\n-_\b5_\b4 T& _\bd_\ba_\bt_\ba_\b_;\n-55\n-_\b5_\b6 _\bM_\bP_\bI_\bD_\ba_\bt_\ba(T& t)\n-57 : _\bd_\ba_\bt_\ba_\b_(t)\n-58 {}\n-59\n-60 public:\n-_\b6_\b1 void* _\bp_\bt_\br() const {\n-62 return (void*)&_\bd_\ba_\bt_\ba_\b_;\n-63 }\n-64\n-65 // indicates whether the datatype can be resized\n-_\b6_\b6 static constexpr bool _\bs_\bt_\ba_\bt_\bi_\bc_\b__\bs_\bi_\bz_\be = true;\n-67\n-_\b6_\b8 int _\bs_\bi_\bz_\be() const{\n-69 return 1;\n-70 }\n-71\n-_\b7_\b2 MPI_Datatype _\bt_\by_\bp_\be() const {\n-73 return _\bM_\bP_\bI_\bT_\br_\ba_\bi_\bt_\bs_\b<_\bs_\bt_\bd_\b:_\b:_\bd_\be_\bc_\ba_\by_\b__\bt_\b<_\bT_\b>>::getType();\n-74 }\n-75 };\n+5#ifndef DUNE_COMMON_IOS_STATE_HH\n+6#define DUNE_COMMON_IOS_STATE_HH\n+7\n+8#include \n+9\n+10namespace _\bD_\bu_\bn_\be {\n+_\b3_\b3 class _\bi_\bo_\bs_\b__\bb_\ba_\bs_\be_\b__\ba_\bl_\bl_\b__\bs_\ba_\bv_\be_\br\n+34 {\n+35 public:\n+_\b3_\b7 typedef std::ios_base _\bs_\bt_\ba_\bt_\be_\b__\bt_\by_\bp_\be;\n+38\n+48 _\bi_\bo_\bs_\b__\bb_\ba_\bs_\be_\b__\ba_\bl_\bl_\b__\bs_\ba_\bv_\be_\br(_\bs_\bt_\ba_\bt_\be_\b__\bt_\by_\bp_\be& ios_);\n+49\n+53 _\b~_\bi_\bo_\bs_\b__\bb_\ba_\bs_\be_\b__\ba_\bl_\bl_\b__\bs_\ba_\bv_\be_\br();\n+54\n+61 void _\br_\be_\bs_\bt_\bo_\br_\be();\n+62\n+63 private:\n+65 _\bs_\bt_\ba_\bt_\be_\b__\bt_\by_\bp_\be& ios;\n+67 state_type::fmtflags oldflags;\n+69 std::streamsize oldprec;\n+71 std::streamsize oldwidth;\n+72 };\n+73\n+75}\n 76\n-77 // dummy implementation for void\n-78 template<>\n-_\b7_\b9 struct _\bM_\bP_\bI_\bD_\ba_\bt_\ba{\n-80 protected:\n-_\b8_\b1 _\bM_\bP_\bI_\bD_\ba_\bt_\ba() {}\n-82\n-83 public:\n-_\b8_\b4 void* _\bp_\bt_\br(){\n-85 return nullptr;\n-86 }\n-_\b8_\b7 int _\bs_\bi_\bz_\be(){\n-88 return 0;\n-89 }\n-_\b9_\b0 void _\bg_\be_\bt(){}\n-_\b9_\b1 MPI_Datatype _\bt_\by_\bp_\be() const{\n-92 return MPI_INT;\n-93 }\n-94 };\n-95\n-96 // specializations:\n-97 // std::vector of static sized elements or std::string\n-98 template\n-_\b9_\b9 struct _\bM_\bP_\bI_\bD_\ba_\bt_\ba().data()),\n-100 decltype(std::declval().size()),\n-101 typename std::decay_t::value_type>>>{\n-102 private:\n-103 template\n-104 using hasResizeOp = decltype(std::declval().resize(0));\n-105\n-106 protected:\n-107 friend auto getMPIData(T&);\n-_\b1_\b0_\b8 _\bM_\bP_\bI_\bD_\ba_\bt_\ba(T& t)\n-109 : _\bd_\ba_\bt_\ba_\b_(t)\n-110 {}\n-111 public:\n-_\b1_\b1_\b2 static constexpr bool _\bs_\bt_\ba_\bt_\bi_\bc_\b__\bs_\bi_\bz_\be = std::is_const::value || !Std::\n-is_detected_v;\n-_\b1_\b1_\b3 void* _\bp_\bt_\br() {\n-114 return (void*) _\bd_\ba_\bt_\ba_\b_.data();\n-115 }\n-_\b1_\b1_\b6 int _\bs_\bi_\bz_\be() {\n-117 return _\bd_\ba_\bt_\ba_\b_.size();\n-118 }\n-_\b1_\b1_\b9 MPI_Datatype _\bt_\by_\bp_\be() const{\n-120 return _\bM_\bP_\bI_\bT_\br_\ba_\bi_\bt_\bs_\b<_\bt_\by_\bp_\be_\bn_\ba_\bm_\be_\b _\bs_\bt_\bd_\b:_\b:_\bd_\be_\bc_\ba_\by_\b__\bt_\b<_\bT_\b>_\b:_\b:_\bv_\ba_\bl_\bu_\be_\b__\bt_\by_\bp_\be>::getType();\n-121 }\n-122\n-123 template\n-_\b1_\b2_\b4 auto /*void*/ _\br_\be_\bs_\bi_\bz_\be(int _\bs_\bi_\bz_\be)\n-125 -> std::enable_if_t::value || !Std::\n-is_detected_v>\n-126 {\n-127 _\bd_\ba_\bt_\ba_\b_.resize(_\bs_\bi_\bz_\be);\n-128 }\n-129\n-130 protected:\n-_\b1_\b3_\b1 T& _\bd_\ba_\bt_\ba_\b_;\n-132 };\n-133\n-134}\n-135\n-140#endif // HAVE_MPI\n-141#endif // DUNE_COMMON_PARALLEL_MPIDATA_HH\n-_\bm_\bp_\bi_\bt_\br_\ba_\bi_\bt_\bs_\b._\bh_\bh\n-Traits classes for mapping types onto MPI_Datatype.\n-_\bt_\by_\bp_\be_\b__\bt_\br_\ba_\bi_\bt_\bs_\b._\bh_\bh\n-_\bt_\by_\bp_\be_\bt_\br_\ba_\bi_\bt_\bs_\b._\bh_\bh\n-Traits for type conversions and type information.\n-_\bD_\bu_\bn_\be_\b:_\b:_\bv_\bo_\bi_\bd_\b__\bt\n-typename Impl::voider< Types... >::type void_t\n-Is void for all valid input types. The workhorse for C++11 SFINAE-techniques.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn typetraits.hh:40\n-_\bs_\bt_\bd\n-STL namespace.\n+77#endif // DUNE_COMMON_IOS_STATE_HH\n+_\bD_\bu_\bn_\be_\b:_\b:_\bi_\bo_\bs_\b__\bb_\ba_\bs_\be_\b__\ba_\bl_\bl_\b__\bs_\ba_\bv_\be_\br_\b:_\b:_\b~_\bi_\bo_\bs_\b__\bb_\ba_\bs_\be_\b__\ba_\bl_\bl_\b__\bs_\ba_\bv_\be_\br\n+~ios_base_all_saver()\n+Destructor that restores the flags stored by the constructor.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn ios_state.cc:20\n+_\bD_\bu_\bn_\be_\b:_\b:_\bi_\bo_\bs_\b__\bb_\ba_\bs_\be_\b__\ba_\bl_\bl_\b__\bs_\ba_\bv_\be_\br_\b:_\b:_\br_\be_\bs_\bt_\bo_\br_\be\n+void restore()\n+Restore flags now.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn ios_state.cc:25\n+_\bD_\bu_\bn_\be_\b:_\b:_\bi_\bo_\bs_\b__\bb_\ba_\bs_\be_\b__\ba_\bl_\bl_\b__\bs_\ba_\bv_\be_\br_\b:_\b:_\bs_\bt_\ba_\bt_\be_\b__\bt_\by_\bp_\be\n+std::ios_base state_type\n+Export type of object we save the state for.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn ios_state.hh:37\n _\bD_\bu_\bn_\be\n Dune namespace.\n D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn alignedallocator.hh:13\n-_\bD_\bu_\bn_\be_\b:_\b:_\bg_\be_\bt_\bM_\bP_\bI_\bD_\ba_\bt_\ba\n-auto getMPIData(T &t)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mpidata.hh:44\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\bP_\bI_\bT_\br_\ba_\bi_\bt_\bs\n-A traits class describing the mapping of types onto MPI_Datatypes.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mpitraits.hh:41\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\bP_\bI_\bD_\ba_\bt_\ba\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mpidata.hh:51\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\bP_\bI_\bD_\ba_\bt_\ba_\b:_\b:_\bd_\ba_\bt_\ba_\b_\n-T & data_\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mpidata.hh:54\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\bP_\bI_\bD_\ba_\bt_\ba_\b:_\b:_\bt_\by_\bp_\be\n-MPI_Datatype type() const\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mpidata.hh:72\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\bP_\bI_\bD_\ba_\bt_\ba_\b:_\b:_\bp_\bt_\br\n-void * ptr() const\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mpidata.hh:61\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\bP_\bI_\bD_\ba_\bt_\ba_\b:_\b:_\bs_\bi_\bz_\be\n-int size() const\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mpidata.hh:68\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\bP_\bI_\bD_\ba_\bt_\ba_\b:_\b:_\bs_\bt_\ba_\bt_\bi_\bc_\b__\bs_\bi_\bz_\be\n-static constexpr bool static_size\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mpidata.hh:66\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\bP_\bI_\bD_\ba_\bt_\ba_\b:_\b:_\bM_\bP_\bI_\bD_\ba_\bt_\ba\n-MPIData(T &t)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mpidata.hh:56\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\bP_\bI_\bD_\ba_\bt_\ba_\b<_\b _\bv_\bo_\bi_\bd_\b _\b>_\b:_\b:_\bg_\be_\bt\n-void get()\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mpidata.hh:90\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\bP_\bI_\bD_\ba_\bt_\ba_\b<_\b _\bv_\bo_\bi_\bd_\b _\b>_\b:_\b:_\bM_\bP_\bI_\bD_\ba_\bt_\ba\n-MPIData()\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mpidata.hh:81\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\bP_\bI_\bD_\ba_\bt_\ba_\b<_\b _\bv_\bo_\bi_\bd_\b _\b>_\b:_\b:_\bs_\bi_\bz_\be\n-int size()\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mpidata.hh:87\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\bP_\bI_\bD_\ba_\bt_\ba_\b<_\b _\bv_\bo_\bi_\bd_\b _\b>_\b:_\b:_\bp_\bt_\br\n-void * ptr()\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mpidata.hh:84\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\bP_\bI_\bD_\ba_\bt_\ba_\b<_\b _\bv_\bo_\bi_\bd_\b _\b>_\b:_\b:_\bt_\by_\bp_\be\n-MPI_Datatype type() const\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mpidata.hh:91\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\bP_\bI_\bD_\ba_\bt_\ba_\b<_\b _\bT_\b,_\b _\bs_\bt_\bd_\b:_\b:_\bv_\bo_\bi_\bd_\b__\bt_\b<_\b _\bs_\bt_\bd_\b:_\b:_\bt_\bu_\bp_\bl_\be_\b<_\b _\bd_\be_\bc_\bl_\bt_\by_\bp_\be_\b(_\bs_\bt_\bd_\b:_\b:_\bd_\be_\bc_\bl_\bv_\ba_\bl_\b<_\b _\bT_\b _\b>_\b(_\b)_\b._\bd_\ba_\bt_\ba\n-_\b(_\b)_\b)_\b,_\b _\bd_\be_\bc_\bl_\bt_\by_\bp_\be_\b(_\bs_\bt_\bd_\b:_\b:_\bd_\be_\bc_\bl_\bv_\ba_\bl_\b<_\b _\bT_\b _\b>_\b(_\b)_\b._\bs_\bi_\bz_\be_\b(_\b)_\b)_\b,_\b _\bt_\by_\bp_\be_\bn_\ba_\bm_\be_\b _\bs_\bt_\bd_\b:_\b:_\bd_\be_\bc_\ba_\by_\b__\bt_\b<_\b _\bT_\b _\b>_\b:_\b:\n-_\bv_\ba_\bl_\bu_\be_\b__\bt_\by_\bp_\be_\b _\b>_\b _\b>_\b _\b>_\b:_\b:_\bM_\bP_\bI_\bD_\ba_\bt_\ba\n-MPIData(T &t)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mpidata.hh:108\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\bP_\bI_\bD_\ba_\bt_\ba_\b<_\b _\bT_\b,_\b _\bs_\bt_\bd_\b:_\b:_\bv_\bo_\bi_\bd_\b__\bt_\b<_\b _\bs_\bt_\bd_\b:_\b:_\bt_\bu_\bp_\bl_\be_\b<_\b _\bd_\be_\bc_\bl_\bt_\by_\bp_\be_\b(_\bs_\bt_\bd_\b:_\b:_\bd_\be_\bc_\bl_\bv_\ba_\bl_\b<_\b _\bT_\b _\b>_\b(_\b)_\b._\bd_\ba_\bt_\ba\n-_\b(_\b)_\b)_\b,_\b _\bd_\be_\bc_\bl_\bt_\by_\bp_\be_\b(_\bs_\bt_\bd_\b:_\b:_\bd_\be_\bc_\bl_\bv_\ba_\bl_\b<_\b _\bT_\b _\b>_\b(_\b)_\b._\bs_\bi_\bz_\be_\b(_\b)_\b)_\b,_\b _\bt_\by_\bp_\be_\bn_\ba_\bm_\be_\b _\bs_\bt_\bd_\b:_\b:_\bd_\be_\bc_\ba_\by_\b__\bt_\b<_\b _\bT_\b _\b>_\b:_\b:\n-_\bv_\ba_\bl_\bu_\be_\b__\bt_\by_\bp_\be_\b _\b>_\b _\b>_\b _\b>_\b:_\b:_\bp_\bt_\br\n-void * ptr()\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mpidata.hh:113\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\bP_\bI_\bD_\ba_\bt_\ba_\b<_\b _\bT_\b,_\b _\bs_\bt_\bd_\b:_\b:_\bv_\bo_\bi_\bd_\b__\bt_\b<_\b _\bs_\bt_\bd_\b:_\b:_\bt_\bu_\bp_\bl_\be_\b<_\b _\bd_\be_\bc_\bl_\bt_\by_\bp_\be_\b(_\bs_\bt_\bd_\b:_\b:_\bd_\be_\bc_\bl_\bv_\ba_\bl_\b<_\b _\bT_\b _\b>_\b(_\b)_\b._\bd_\ba_\bt_\ba\n-_\b(_\b)_\b)_\b,_\b _\bd_\be_\bc_\bl_\bt_\by_\bp_\be_\b(_\bs_\bt_\bd_\b:_\b:_\bd_\be_\bc_\bl_\bv_\ba_\bl_\b<_\b _\bT_\b _\b>_\b(_\b)_\b._\bs_\bi_\bz_\be_\b(_\b)_\b)_\b,_\b _\bt_\by_\bp_\be_\bn_\ba_\bm_\be_\b _\bs_\bt_\bd_\b:_\b:_\bd_\be_\bc_\ba_\by_\b__\bt_\b<_\b _\bT_\b _\b>_\b:_\b:\n-_\bv_\ba_\bl_\bu_\be_\b__\bt_\by_\bp_\be_\b _\b>_\b _\b>_\b _\b>_\b:_\b:_\bs_\bi_\bz_\be\n-int size()\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mpidata.hh:116\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\bP_\bI_\bD_\ba_\bt_\ba_\b<_\b _\bT_\b,_\b _\bs_\bt_\bd_\b:_\b:_\bv_\bo_\bi_\bd_\b__\bt_\b<_\b _\bs_\bt_\bd_\b:_\b:_\bt_\bu_\bp_\bl_\be_\b<_\b _\bd_\be_\bc_\bl_\bt_\by_\bp_\be_\b(_\bs_\bt_\bd_\b:_\b:_\bd_\be_\bc_\bl_\bv_\ba_\bl_\b<_\b _\bT_\b _\b>_\b(_\b)_\b._\bd_\ba_\bt_\ba\n-_\b(_\b)_\b)_\b,_\b _\bd_\be_\bc_\bl_\bt_\by_\bp_\be_\b(_\bs_\bt_\bd_\b:_\b:_\bd_\be_\bc_\bl_\bv_\ba_\bl_\b<_\b _\bT_\b _\b>_\b(_\b)_\b._\bs_\bi_\bz_\be_\b(_\b)_\b)_\b,_\b _\bt_\by_\bp_\be_\bn_\ba_\bm_\be_\b _\bs_\bt_\bd_\b:_\b:_\bd_\be_\bc_\ba_\by_\b__\bt_\b<_\b _\bT_\b _\b>_\b:_\b:\n-_\bv_\ba_\bl_\bu_\be_\b__\bt_\by_\bp_\be_\b _\b>_\b _\b>_\b _\b>_\b:_\b:_\bd_\ba_\bt_\ba_\b_\n-T & data_\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mpidata.hh:131\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\bP_\bI_\bD_\ba_\bt_\ba_\b<_\b _\bT_\b,_\b _\bs_\bt_\bd_\b:_\b:_\bv_\bo_\bi_\bd_\b__\bt_\b<_\b _\bs_\bt_\bd_\b:_\b:_\bt_\bu_\bp_\bl_\be_\b<_\b _\bd_\be_\bc_\bl_\bt_\by_\bp_\be_\b(_\bs_\bt_\bd_\b:_\b:_\bd_\be_\bc_\bl_\bv_\ba_\bl_\b<_\b _\bT_\b _\b>_\b(_\b)_\b._\bd_\ba_\bt_\ba\n-_\b(_\b)_\b)_\b,_\b _\bd_\be_\bc_\bl_\bt_\by_\bp_\be_\b(_\bs_\bt_\bd_\b:_\b:_\bd_\be_\bc_\bl_\bv_\ba_\bl_\b<_\b _\bT_\b _\b>_\b(_\b)_\b._\bs_\bi_\bz_\be_\b(_\b)_\b)_\b,_\b _\bt_\by_\bp_\be_\bn_\ba_\bm_\be_\b _\bs_\bt_\bd_\b:_\b:_\bd_\be_\bc_\ba_\by_\b__\bt_\b<_\b _\bT_\b _\b>_\b:_\b:\n-_\bv_\ba_\bl_\bu_\be_\b__\bt_\by_\bp_\be_\b _\b>_\b _\b>_\b _\b>_\b:_\b:_\br_\be_\bs_\bi_\bz_\be\n-auto resize(int size) -> std::enable_if_t::value||!Std::\n-is_detected_v< hasResizeOp, S > >\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mpidata.hh:124\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\bP_\bI_\bD_\ba_\bt_\ba_\b<_\b _\bT_\b,_\b _\bs_\bt_\bd_\b:_\b:_\bv_\bo_\bi_\bd_\b__\bt_\b<_\b _\bs_\bt_\bd_\b:_\b:_\bt_\bu_\bp_\bl_\be_\b<_\b _\bd_\be_\bc_\bl_\bt_\by_\bp_\be_\b(_\bs_\bt_\bd_\b:_\b:_\bd_\be_\bc_\bl_\bv_\ba_\bl_\b<_\b _\bT_\b _\b>_\b(_\b)_\b._\bd_\ba_\bt_\ba\n-_\b(_\b)_\b)_\b,_\b _\bd_\be_\bc_\bl_\bt_\by_\bp_\be_\b(_\bs_\bt_\bd_\b:_\b:_\bd_\be_\bc_\bl_\bv_\ba_\bl_\b<_\b _\bT_\b _\b>_\b(_\b)_\b._\bs_\bi_\bz_\be_\b(_\b)_\b)_\b,_\b _\bt_\by_\bp_\be_\bn_\ba_\bm_\be_\b _\bs_\bt_\bd_\b:_\b:_\bd_\be_\bc_\ba_\by_\b__\bt_\b<_\b _\bT_\b _\b>_\b:_\b:\n-_\bv_\ba_\bl_\bu_\be_\b__\bt_\by_\bp_\be_\b _\b>_\b _\b>_\b _\b>_\b:_\b:_\bt_\by_\bp_\be\n-MPI_Datatype type() const\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mpidata.hh:119\n+_\bD_\bu_\bn_\be_\b:_\b:_\bi_\bo_\bs_\b__\bb_\ba_\bs_\be_\b__\ba_\bl_\bl_\b__\bs_\ba_\bv_\be_\br\n+Utility class for storing and resetting stream attributes.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn ios_state.hh:34\n ===============================================================================\n Generated by\u00a0_\b[_\bd_\bo_\bx_\by_\bg_\be_\bn_\b] 1.9.8\n"}]}, {"source1": "./usr/share/doc/libdune-common-doc/doxygen/a00038.html", "source2": "./usr/share/doc/libdune-common-doc/doxygen/a00038.html", "unified_diff": "@@ -1,15 +1,15 @@\n \n \n \n \n \n \n \n-dune-common: mpi_collective_benchmark.cc File Reference\n+dune-common: variablesizecommunicator.hh File Reference\n \n \n \n \n \n \n \n@@ -65,333 +65,76 @@\n
\n \n \n \n \n \n \n
\n \n-
mpi_collective_benchmark.cc File Reference
\n+Classes |\n+Namespaces
\n+
variablesizecommunicator.hh File Reference
\n \n
\n-
#include <chrono>
\n+\n+

A communicator that only needs to know the number of elements per index at the sender side. \n+More...

\n+
#include <algorithm>
\n+#include <cassert>
\n+#include <cstddef>
\n #include <functional>
\n-#include <iostream>
\n-#include <iomanip>
\n-#include <string>
\n-#include <thread>
\n-#include <tuple>
\n+#include <map>
\n+#include <memory>
\n+#include <utility>
\n #include <vector>
\n-#include <dune/common/exceptions.hh>
\n-#include <dune/common/timer.hh>
\n-#include <dune/common/parametertree.hh>
\n-#include <dune/common/parametertreeparser.hh>
\n-#include <dune/common/parallel/future.hh>
\n-#include <dune/common/parallel/mpihelper.hh>
\n-
\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n+#include <mpi.h>
\n+#include <dune/common/concept.hh>
\n+#include <dune/common/parallel/interface.hh>
\n+#include <dune/common/parallel/mpitraits.hh>
\n+\n+

Go to the source code of this file.

\n+

\n-Functions

template<class CC >
void communicate (CC &cc)
 
template<class CC >
Dune::Future< void > startCommunication (CC &cc)
 
template<class CC >
double runBlocking (CC &cc)
 
template<class CC >
double runNonblockingWait (CC &cc)
 
std::tuple< double, double > runNonblockingSleep (decltype(Dune::MPIHelper::getCommunication())&cc, std::chrono::duration< double > wait_time)
 
std::tuple< double, double > runNonblockingActive (decltype(Dune::MPIHelper::getCommunication())&cc, std::chrono::duration< double > wait_time)
 
std::tuple< double, double > determineOverlap (std::function< std::tuple< double, double >(std::chrono::duration< double >)> fun)
 
void printHeader ()
 
void run (int s)
 
int main (int argc, char **argv)
 
\n+\n+\n+\n+\n+\n+\n

\n+Classes

struct  Dune::Concept::HasFixedSize
 
class  Dune::VariableSizeCommunicator< Allocator >
 A buffered communicator where the amount of data sent does not have to be known a priori. More...
 
\n-\n-\n-\n-\n-\n-\n+\n+\n+\n+\n+\n+\n+\n

\n-Variables

Dune::ParameterTree options
 Benchmark for measure the possible overlap of computation and communication at MPI collective communications.
 
std::vector< std::string > all_methods
 

\n+Namespaces

namespace  Dune
 Dune namespace.
 
namespace  Dune::Concept
 Namespace for concepts.
 
\n-

Function Documentation

\n-\n-

◆ communicate()

\n-\n-
\n-
\n-
\n-template<class CC >
\n- \n- \n- \n- \n- \n- \n- \n- \n-
void communicate (CC & cc)
\n-
\n-\n-
\n-
\n-\n-

◆ determineOverlap()

\n-\n-
\n-
\n- \n- \n- \n- \n- \n- \n- \n- \n-
std::tuple< double, double > determineOverlap (std::function< std::tuple< double, double >(std::chrono::duration< double >)> fun)
\n-
\n-\n-
\n-
\n-\n-

◆ main()

\n-\n-
\n-
\n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n-
int main (int argc,
char ** argv 
)
\n-
\n-\n-
\n-
\n-\n-

◆ printHeader()

\n-\n-
\n-
\n- \n- \n- \n- \n- \n- \n- \n-
void printHeader ()
\n-
\n-\n-
\n-
\n-\n-

◆ run()

\n-\n-
\n-
\n- \n- \n- \n- \n- \n- \n- \n- \n-
void run (int s)
\n-
\n-\n-
\n-
\n-\n-

◆ runBlocking()

\n-\n-
\n-
\n-
\n-template<class CC >
\n- \n- \n- \n- \n- \n- \n- \n- \n-
double runBlocking (CC & cc)
\n-
\n-\n-
\n-
\n-\n-

◆ runNonblockingActive()

\n-\n-
\n-
\n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n-
std::tuple< double, double > runNonblockingActive (decltype(Dune::MPIHelper::getCommunication())& cc,
std::chrono::duration< double > wait_time 
)
\n-
\n-\n-
\n-
\n-\n-

◆ runNonblockingSleep()

\n-\n-
\n-
\n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n-
std::tuple< double, double > runNonblockingSleep (decltype(Dune::MPIHelper::getCommunication())& cc,
std::chrono::duration< double > wait_time 
)
\n-
\n-\n-
\n-
\n-\n-

◆ runNonblockingWait()

\n-\n-
\n-
\n-
\n-template<class CC >
\n- \n- \n- \n- \n- \n- \n- \n- \n-
double runNonblockingWait (CC & cc)
\n-
\n-\n-
\n-
\n-\n-

◆ startCommunication()

\n-\n-
\n-
\n-
\n-template<class CC >
\n- \n- \n- \n- \n- \n- \n- \n- \n-
Dune::Future< void > startCommunication (CC & cc)
\n-
\n-\n-
\n-
\n-

Variable Documentation

\n-\n-

◆ all_methods

\n-\n-
\n-
\n- \n- \n- \n- \n-
std::vector<std::string> all_methods
\n-
\n-Initial value:
= {"allreduce",
\n-
"barrier",
\n-
"broadcast",
\n-
"gather",
\n-
"allgather",
\n-
"scatter"}
\n-
\n-
\n-
\n-\n-

◆ options

\n+

Detailed Description

\n+

A communicator that only needs to know the number of elements per index at the sender side.

\n+
Author
Markus Blatt
\n+

Variable Documentation

\n+\n+

◆ fixedSize

\n \n
\n
\n \n \n- \n+ \n \n
Dune::ParameterTree optionsstd::size_t fixedSize
\n
\n \n-

Benchmark for measure the possible overlap of computation and communication at MPI collective communications.

\n-

This benchmark is inspired by the sandia micro benchmark: W. Lawry, C. Wilson, A. Maccabe, R. Brightwell. COMB: A Portable Benchmark Suite for Assessing MPI Overlap. In Proceedings of the IEEE International Conference on Cluster Computing (CLUSTER 2002), p. 472, 2002. http://www.cs.sandia.gov/smb/overhead.html

\n-

The following communication times are measured: Blocking: Blocking call. E.g. MPI_Allreduce Nonblocking_wait (NB_Wait): Nonblocking (e.g. MPI_Iallreduce) call directly followed by MPI_Wait. Nonblocking_sleep (NB_Sleep): Nonblocking call followed by a busy wait until the work time has passed. Then MPI_Wait. Nonblocking_active (NB_active): Nonblocking call followed by a basy wait where in every iteration MPI_Test is called until the work time has passed. The MPI_wait.

\n-

The overhead is computed as the time for the Nonblocking call plus the time for MPI_Wait. The iteration time is the time for the whole communication. The available part of the communication time(avail(%)) is computed as 1-(overhead/base_t), where base_t is the time for calling the method with wait time = 0. The overhead is determined by increasing the work time successive until it is the dominant factor in the iteration time. Then the overhead is computed as iter_t-work_t.

\n-

Usage: mpirun ./mpi_collective_benchmark [options]

\n-

options: -method: default: allreduce. possible methods: allreduce, barrier, broadcast, gather, allgather, scatter -iterations: default: 10000. Number of iterations for measure the time for one communication -allMethods: default:0. If 1 iterates over all available methods -startSize: default: n, where n is the size of MPI_COMM_WORLD. runs the benchmark for different communicator sizes, starting with startSize. After every run the size is doubled. Finally one run is made for the whole communicator. -verbose: default: 0. If 1 prints intermediate information while determining the overhead. -threshold: default: 2. The threshold when the work time is the dominant factor in the iteration time. (Similar to the threshold in the sandia benchmark) -nohdr: default: 0. Suppress output of the header.

\n-

options can be set either in the options.ini file or can be pass at the command-line (-key value).

\n-

To get a good 'available' value for the NB_sleep communication, some MPI implementation need to spawn an extra thread. With MPICH you can activate this by setting the environment variable MPI_ASYNC_PROGRESS to 1, with IntelMPI the variable is called I_MPI_ASYNC_PROGRESS. (https://software.intel.com/en-us/mpi-developer-reference-linux-asynchronous-progress-control)

\n+

The number of data items per index if it is fixed, 0 otherwise.

\n \n
\n
\n
\n \n
\n Generated by \"doxygen\"/ 1.9.8\n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,151 +1,50 @@\n dune-common\u00a02.10\n Loading...\n Searching...\n No Matches\n * _\bd_\bu_\bn_\be\n * _\bc_\bo_\bm_\bm_\bo_\bn\n * _\bp_\ba_\br_\ba_\bl_\bl_\be_\bl\n- * _\bb_\be_\bn_\bc_\bh_\bm_\ba_\br_\bk\n-_\bF_\bu_\bn_\bc_\bt_\bi_\bo_\bn_\bs | _\bV_\ba_\br_\bi_\ba_\bb_\bl_\be_\bs\n-mpi_collective_benchmark.cc File Reference\n-#include \n+_\bC_\bl_\ba_\bs_\bs_\be_\bs | _\bN_\ba_\bm_\be_\bs_\bp_\ba_\bc_\be_\bs\n+variablesizecommunicator.hh File Reference\n+_\bC_\bo_\bm_\bm_\bo_\bn \u00bb _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\b _\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn \u00bb _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\b _\bC_\bo_\bm_\bp_\bu_\bt_\bi_\bn_\bg_\b _\bb_\ba_\bs_\be_\bd_\b _\bo_\bn_\b _\bI_\bn_\bd_\be_\bx_\bs_\be_\bt_\bs\n+A communicator that only needs to know the number of elements per index at the\n+sender side. _\bM_\bo_\br_\be_\b._\b._\b.\n+#include \n+#include \n+#include \n #include \n-#include \n-#include \n-#include \n-#include \n-#include \n+#include \n+#include \n+#include \n #include \n-#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\be_\bx_\bc_\be_\bp_\bt_\bi_\bo_\bn_\bs_\b._\bh_\bh>\n-#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bt_\bi_\bm_\be_\br_\b._\bh_\bh>\n-#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bp_\ba_\br_\ba_\bm_\be_\bt_\be_\br_\bt_\br_\be_\be_\b._\bh_\bh>\n-#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bp_\ba_\br_\ba_\bm_\be_\bt_\be_\br_\bt_\br_\be_\be_\bp_\ba_\br_\bs_\be_\br_\b._\bh_\bh>\n-#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bp_\ba_\br_\ba_\bl_\bl_\be_\bl_\b/_\bf_\bu_\bt_\bu_\br_\be_\b._\bh_\bh>\n-#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bp_\ba_\br_\ba_\bl_\bl_\be_\bl_\b/_\bm_\bp_\bi_\bh_\be_\bl_\bp_\be_\br_\b._\bh_\bh>\n-F\bFu\bun\bnc\bct\bti\bio\bon\bns\bs\n-template\n- void\u00a0 _\bc_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\be (CC &cc)\n-\u00a0\n-template\n- _\bD_\bu_\bn_\be_\b:_\b:_\bF_\bu_\bt_\bu_\br_\be< void >\u00a0 _\bs_\bt_\ba_\br_\bt_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn (CC &cc)\n-\u00a0\n-template\n- double\u00a0 _\br_\bu_\bn_\bB_\bl_\bo_\bc_\bk_\bi_\bn_\bg (CC &cc)\n-\u00a0\n-template\n- double\u00a0 _\br_\bu_\bn_\bN_\bo_\bn_\bb_\bl_\bo_\bc_\bk_\bi_\bn_\bg_\bW_\ba_\bi_\bt (CC &cc)\n-\u00a0\n-std::tuple< double, double >\u00a0 _\br_\bu_\bn_\bN_\bo_\bn_\bb_\bl_\bo_\bc_\bk_\bi_\bn_\bg_\bS_\bl_\be_\be_\bp (decltype(_\bD_\bu_\bn_\be_\b:_\b:_\bM_\bP_\bI_\bH_\be_\bl_\bp_\be_\br_\b:_\b:\n- _\bg_\be_\bt_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn())&cc, std::chrono::duration<\n- double > wait_time)\n-\u00a0\n-std::tuple< double, double >\u00a0 _\br_\bu_\bn_\bN_\bo_\bn_\bb_\bl_\bo_\bc_\bk_\bi_\bn_\bg_\bA_\bc_\bt_\bi_\bv_\be (decltype(_\bD_\bu_\bn_\be_\b:_\b:_\bM_\bP_\bI_\bH_\be_\bl_\bp_\be_\br_\b:_\b:\n- _\bg_\be_\bt_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn())&cc, std::chrono::duration<\n- double > wait_time)\n-\u00a0\n-std::tuple< double, double >\u00a0 _\bd_\be_\bt_\be_\br_\bm_\bi_\bn_\be_\bO_\bv_\be_\br_\bl_\ba_\bp (std::function< std::tuple<\n- double, double >(std::chrono::duration< double\n- >)> fun)\n-\u00a0\n- void\u00a0 _\bp_\br_\bi_\bn_\bt_\bH_\be_\ba_\bd_\be_\br ()\n-\u00a0\n- void\u00a0 _\br_\bu_\bn (int s)\n-\u00a0\n- int\u00a0 _\bm_\ba_\bi_\bn (int argc, char **argv)\n-\u00a0\n-V\bVa\bar\bri\bia\bab\bbl\ble\bes\bs\n- _\bD_\bu_\bn_\be_\b:_\b:_\bP_\ba_\br_\ba_\bm_\be_\bt_\be_\br_\bT_\br_\be_\be\u00a0 _\bo_\bp_\bt_\bi_\bo_\bn_\bs\n- Benchmark for measure the possible overlap of\n-\u00a0 computation and communication at MPI collective\n- communications.\n-\u00a0\n-std::vector< std::string >\u00a0 _\ba_\bl_\bl_\b__\bm_\be_\bt_\bh_\bo_\bd_\bs\n-\u00a0\n-*\b**\b**\b**\b**\b* F\bFu\bun\bnc\bct\bti\bio\bon\bn D\bDo\boc\bcu\bum\bme\ben\bnt\bta\bat\bti\bio\bon\bn *\b**\b**\b**\b**\b*\n-*\b**\b**\b**\b**\b* _\b?\b\u25c6_\b?\b\u00a0c\bco\bom\bmm\bmu\bun\bni\bic\bca\bat\bte\be(\b()\b) *\b**\b**\b**\b**\b*\n-template\n-void communicate ( CC &\u00a0 c\bcc\bc )\n-*\b**\b**\b**\b**\b* _\b?\b\u25c6_\b?\b\u00a0d\bde\bet\bte\ber\brm\bmi\bin\bne\beO\bOv\bve\ber\brl\bla\bap\bp(\b()\b) *\b**\b**\b**\b**\b*\n-std::tuple< double, double > ( std::function< std::tuple< double, double f\bfu\bun\bn )\n-determineOverlap >(std::chrono::duration< double >)>\u00a0\n-*\b**\b**\b**\b**\b* _\b?\b\u25c6_\b?\b\u00a0m\bma\bai\bin\bn(\b()\b) *\b**\b**\b**\b**\b*\n-int main ( int\u00a0 a\bar\brg\bgc\bc,\n- char **\u00a0 a\bar\brg\bgv\bv\u00a0\n- )\n-*\b**\b**\b**\b**\b* _\b?\b\u25c6_\b?\b\u00a0p\bpr\bri\bin\bnt\btH\bHe\bea\bad\bde\ber\br(\b()\b) *\b**\b**\b**\b**\b*\n-void printHeader ( )\n-*\b**\b**\b**\b**\b* _\b?\b\u25c6_\b?\b\u00a0r\bru\bun\bn(\b()\b) *\b**\b**\b**\b**\b*\n-void run ( int\u00a0 s\bs )\n-*\b**\b**\b**\b**\b* _\b?\b\u25c6_\b?\b\u00a0r\bru\bun\bnB\bBl\blo\boc\bck\bki\bin\bng\bg(\b()\b) *\b**\b**\b**\b**\b*\n-template\n-double runBlocking ( CC &\u00a0 c\bcc\bc )\n-*\b**\b**\b**\b**\b* _\b?\b\u25c6_\b?\b\u00a0r\bru\bun\bnN\bNo\bon\bnb\bbl\blo\boc\bck\bki\bin\bng\bgA\bAc\bct\bti\biv\bve\be(\b()\b) *\b**\b**\b**\b**\b*\n-std::tuple< double, double > ( decltype(_\bD_\bu_\bn_\be_\b:_\b:_\bM_\bP_\bI_\bH_\be_\bl_\bp_\be_\br_\b:_\b: c\bcc\bc,\n-runNonblockingActive _\bg_\be_\bt_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn())&\u00a0\n- std::chrono::duration< double >\u00a0 w\bwa\bai\bit\bt_\b_t\bti\bim\bme\be\u00a0\n- )\n-*\b**\b**\b**\b**\b* _\b?\b\u25c6_\b?\b\u00a0r\bru\bun\bnN\bNo\bon\bnb\bbl\blo\boc\bck\bki\bin\bng\bgS\bSl\ble\bee\bep\bp(\b()\b) *\b**\b**\b**\b**\b*\n-std::tuple< double, double > ( decltype(_\bD_\bu_\bn_\be_\b:_\b:_\bM_\bP_\bI_\bH_\be_\bl_\bp_\be_\br_\b:_\b: c\bcc\bc,\n-runNonblockingSleep _\bg_\be_\bt_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn())&\u00a0\n- std::chrono::duration< double >\u00a0 w\bwa\bai\bit\bt_\b_t\bti\bim\bme\be\u00a0\n- )\n-*\b**\b**\b**\b**\b* _\b?\b\u25c6_\b?\b\u00a0r\bru\bun\bnN\bNo\bon\bnb\bbl\blo\boc\bck\bki\bin\bng\bgW\bWa\bai\bit\bt(\b()\b) *\b**\b**\b**\b**\b*\n-template\n-double runNonblockingWait ( CC &\u00a0 c\bcc\bc )\n-*\b**\b**\b**\b**\b* _\b?\b\u25c6_\b?\b\u00a0s\bst\bta\bar\brt\btC\bCo\bom\bmm\bmu\bun\bni\bic\bca\bat\bti\bio\bon\bn(\b()\b) *\b**\b**\b**\b**\b*\n-template\n-_\bD_\bu_\bn_\be_\b:_\b:_\bF_\bu_\bt_\bu_\br_\be< void > startCommunication ( CC &\u00a0 c\bcc\bc )\n+#include \n+#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bc_\bo_\bn_\bc_\be_\bp_\bt_\b._\bh_\bh>\n+#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bp_\ba_\br_\ba_\bl_\bl_\be_\bl_\b/_\bi_\bn_\bt_\be_\br_\bf_\ba_\bc_\be_\b._\bh_\bh>\n+#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bp_\ba_\br_\ba_\bl_\bl_\be_\bl_\b/_\bm_\bp_\bi_\bt_\br_\ba_\bi_\bt_\bs_\b._\bh_\bh>\n+_\bG_\bo_\b _\bt_\bo_\b _\bt_\bh_\be_\b _\bs_\bo_\bu_\br_\bc_\be_\b _\bc_\bo_\bd_\be_\b _\bo_\bf_\b _\bt_\bh_\bi_\bs_\b _\bf_\bi_\bl_\be_\b.\n+C\bCl\bla\bas\bss\bse\bes\bs\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bn_\bc_\be_\bp_\bt_\b:_\b:_\bH_\ba_\bs_\bF_\bi_\bx_\be_\bd_\bS_\bi_\bz_\be\n+\u00a0\n+ class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bV_\ba_\br_\bi_\ba_\bb_\bl_\be_\bS_\bi_\bz_\be_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bo_\br_\b<_\b _\bA_\bl_\bl_\bo_\bc_\ba_\bt_\bo_\br_\b _\b>\n+\u00a0 A buffered communicator where the amount of data sent does not have to\n+ be known a priori. _\bM_\bo_\br_\be_\b._\b._\b.\n+\u00a0\n+N\bNa\bam\bme\bes\bsp\bpa\bac\bce\bes\bs\n+namespace \u00a0 _\bD_\bu_\bn_\be\n+\u00a0 _\bD_\bu_\bn_\be namespace.\n+\u00a0\n+namespace \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bn_\bc_\be_\bp_\bt\n+\u00a0 Namespace for concepts.\n+\u00a0\n+*\b**\b**\b**\b**\b* D\bDe\bet\bta\bai\bil\ble\bed\bd D\bDe\bes\bsc\bcr\bri\bip\bpt\bti\bio\bon\bn *\b**\b**\b**\b**\b*\n+A communicator that only needs to know the number of elements per index at the\n+sender side.\n+ Author\n+ Markus Blatt\n *\b**\b**\b**\b**\b* V\bVa\bar\bri\bia\bab\bbl\ble\be D\bDo\boc\bcu\bum\bme\ben\bnt\bta\bat\bti\bio\bon\bn *\b**\b**\b**\b**\b*\n-*\b**\b**\b**\b**\b* _\b?\b\u25c6_\b?\b\u00a0a\bal\bll\bl_\b_m\bme\bet\bth\bho\bod\bds\bs *\b**\b**\b**\b**\b*\n-std::vector all_methods\n-I\bIn\bni\bit\bti\bia\bal\bl v\bva\bal\blu\bue\be:\b:\n-= {\"allreduce\",\n-\"barrier\",\n-\"broadcast\",\n-\"gather\",\n-\"allgather\",\n-\"scatter\"}\n-*\b**\b**\b**\b**\b* _\b?\b\u25c6_\b?\b\u00a0o\bop\bpt\bti\bio\bon\bns\bs *\b**\b**\b**\b**\b*\n-_\bD_\bu_\bn_\be_\b:_\b:_\bP_\ba_\br_\ba_\bm_\be_\bt_\be_\br_\bT_\br_\be_\be options\n-Benchmark for measure the possible overlap of computation and communication at\n-MPI collective communications.\n-This benchmark is inspired by the sandia micro benchmark: W. Lawry, C. Wilson,\n-A. Maccabe, R. Brightwell. COMB: A Portable Benchmark Suite for Assessing MPI\n-Overlap. In Proceedings of the IEEE International Conference on Cluster\n-Computing (CLUSTER 2002), p. 472, 2002. _\bh_\bt_\bt_\bp_\b:_\b/_\b/_\bw_\bw_\bw_\b._\bc_\bs_\b._\bs_\ba_\bn_\bd_\bi_\ba_\b._\bg_\bo_\bv_\b/_\bs_\bm_\bb_\b/\n-_\bo_\bv_\be_\br_\bh_\be_\ba_\bd_\b._\bh_\bt_\bm_\bl\n-The following communication times are measured: Blocking: Blocking call. E.g.\n-MPI_Allreduce Nonblocking_wait (NB_Wait): Nonblocking (e.g. MPI_Iallreduce)\n-call directly followed by MPI_Wait. Nonblocking_sleep (NB_Sleep): Nonblocking\n-call followed by a busy wait until the work time has passed. Then MPI_Wait.\n-Nonblocking_active (NB_active): Nonblocking call followed by a basy wait where\n-in every iteration MPI_Test is called until the work time has passed. The\n-MPI_wait.\n-The overhead is computed as the time for the Nonblocking call plus the time for\n-MPI_Wait. The iteration time is the time for the whole communication. The\n-available part of the communication time(avail(%)) is computed as 1-(overhead/\n-base_t), where base_t is the time for calling the method with wait time = 0.\n-The overhead is determined by increasing the work time successive until it is\n-the dominant factor in the iteration time. Then the overhead is computed as\n-iter_t-work_t.\n-Usage: mpirun ./mpi_collective_benchmark [options]\n-options: -method: default: allreduce. possible methods: allreduce, barrier,\n-broadcast, gather, allgather, scatter -iterations: default: 10000. Number of\n-iterations for measure the time for one communication -allMethods: default:0.\n-If 1 iterates over all available methods -startSize: default: n, where n is the\n-size of MPI_COMM_WORLD. runs the benchmark for different communicator sizes,\n-starting with startSize. After every run the size is doubled. Finally one run\n-is made for the whole communicator. -verbose: default: 0. If 1 prints\n-intermediate information while determining the overhead. -threshold: default:\n-2. The threshold when the work time is the dominant factor in the iteration\n-time. (Similar to the threshold in the sandia benchmark) -nohdr: default: 0.\n-Suppress output of the header.\n-options can be set either in the options.ini file or can be pass at the\n-command-line (-key value).\n-To get a good 'available' value for the NB_sleep communication, some MPI\n-implementation need to spawn an extra thread. With MPICH you can activate this\n-by setting the environment variable MPI_ASYNC_PROGRESS to 1, with IntelMPI the\n-variable is called I_MPI_ASYNC_PROGRESS. (_\bh_\bt_\bt_\bp_\bs_\b:_\b/_\b/_\bs_\bo_\bf_\bt_\bw_\ba_\br_\be_\b._\bi_\bn_\bt_\be_\bl_\b._\bc_\bo_\bm_\b/_\be_\bn_\b-_\bu_\bs_\b/_\bm_\bp_\bi_\b-\n-_\bd_\be_\bv_\be_\bl_\bo_\bp_\be_\br_\b-_\br_\be_\bf_\be_\br_\be_\bn_\bc_\be_\b-_\bl_\bi_\bn_\bu_\bx_\b-_\ba_\bs_\by_\bn_\bc_\bh_\br_\bo_\bn_\bo_\bu_\bs_\b-_\bp_\br_\bo_\bg_\br_\be_\bs_\bs_\b-_\bc_\bo_\bn_\bt_\br_\bo_\bl)\n+*\b**\b**\b**\b**\b* _\b?\b\u25c6_\b?\b\u00a0f\bfi\bix\bxe\bed\bdS\bSi\biz\bze\be *\b**\b**\b**\b**\b*\n+std::size_t fixedSize\n+The number of data items per index if it is fixed, 0 otherwise.\n ===============================================================================\n Generated by\u00a0_\b[_\bd_\bo_\bx_\by_\bg_\be_\bn_\b] 1.9.8\n"}]}, {"source1": "./usr/share/doc/libdune-common-doc/doxygen/a00041.html", "source2": "./usr/share/doc/libdune-common-doc/doxygen/a00041.html", "unified_diff": "@@ -1,15 +1,15 @@\n \n \n \n \n \n \n \n-dune-common: mpihelper.hh File Reference\n+dune-common: mpipack.hh File Reference\n \n \n \n \n \n \n \n@@ -72,66 +72,45 @@\n
  • dune
  • common
  • parallel
  • \n
    \n \n
    \n \n-
    mpihelper.hh File Reference
    \n+
    mpipack.hh File Reference
    \n
    \n
    \n \n-

    Helpers for dealing with MPI. \n+

    See MPI_Pack. \n More...

    \n-
    #include <cassert>
    \n-#include <mutex>
    \n+
    #include <type_traits>
    \n+#include <vector>
    \n #include <mpi.h>
    \n-#include <dune/common/exceptions.hh>
    \n-#include <dune/common/visibility.hh>
    \n-#include <dune/common/parallel/communication.hh>
    \n-#include <dune/common/parallel/mpicommunication.hh>
    \n-#include <dune/common/stdstreams.hh>
    \n+#include <dune/common/parallel/mpicommunication.hh>
    \n+#include <dune/common/parallel/mpidata.hh>
    \n
    \n

    Go to the source code of this file.

    \n \n \n-\n-\n+\n \n-\n-\n+\n \n

    \n Classes

    class  Dune::FakeMPIHelper
     A fake mpi helper. More...
    class  Dune::MPIPack
     
    class  Dune::MPIHelper
     A real mpi helper. More...
    struct  Dune::MPIData< P, std::enable_if_t< std::is_same< std::remove_const_t< P >, MPIPack >::value > >
     
    \n \n \n \n \n

    \n Namespaces

    namespace  Dune
     Dune namespace.
     
    \n

    Detailed Description

    \n-

    Helpers for dealing with MPI.

    \n-

    Basically there are two helpers available:

    \n-
    FakeMPIHelper
    \n-
    A class adhering to the interface of MPIHelper that does not need MPI at all. This can be used to create a sequential program even if MPI is used to compile it.
    \n-
    MPIHelper
    \n-
    A real MPI helper. When the singleton gets instantiated MPI_Init will be called and before the program exits MPI_Finalize will be called.
    \n-
    \n-

    Example of who to use these classes:

    \n-

    A program that is parallel if compiled with MPI and sequential otherwise:

    int main(int argc, char** argv){
    \n-
    typedef Dune::MPIHelper MPIHelper;
    \n-
    MPIHelper::instance(argc, argv);
    \n-
    typename MPIHelper::MPICommunicator world =
    \n-
    MPIHelper::getCommunicator();
    \n-
    ...
    \n-
    int main(int argc, char **argv)
    Definition mpi_collective_benchmark.cc:297
    \n-
    A real mpi helper.
    Definition mpihelper.hh:181
    \n-

    If one wants to have sequential program even if the code is compiled with mpi then one simply has to exchange the typedef with

    typedef Dune::MPIHelper FakeMPIHelper;
    \n-

    .

    \n-

    For checking whether we really use MPI or just fake please use MPIHelper::isFake (this is also possible at compile time!)

    \n+

    See MPI_Pack.

    \n+

    This Wrapper class takes care of the memory management and provides methods to pack and unpack objects. All objects that can be used for MPI communication can also be packed and unpacked to/from MPIPack.

    \n+
    Author
    Nils-Arne Dreier
    \n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -2,62 +2,35 @@\n Loading...\n Searching...\n No Matches\n * _\bd_\bu_\bn_\be\n * _\bc_\bo_\bm_\bm_\bo_\bn\n * _\bp_\ba_\br_\ba_\bl_\bl_\be_\bl\n _\bC_\bl_\ba_\bs_\bs_\be_\bs | _\bN_\ba_\bm_\be_\bs_\bp_\ba_\bc_\be_\bs\n-mpihelper.hh File Reference\n+mpipack.hh File Reference\n _\bC_\bo_\bm_\bm_\bo_\bn \u00bb _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\b _\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn\n-Helpers for dealing with MPI. _\bM_\bo_\br_\be_\b._\b._\b.\n-#include \n-#include \n+See MPI_Pack. _\bM_\bo_\br_\be_\b._\b._\b.\n+#include \n+#include \n #include \n-#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\be_\bx_\bc_\be_\bp_\bt_\bi_\bo_\bn_\bs_\b._\bh_\bh>\n-#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bv_\bi_\bs_\bi_\bb_\bi_\bl_\bi_\bt_\by_\b._\bh_\bh>\n-#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bp_\ba_\br_\ba_\bl_\bl_\be_\bl_\b/_\bc_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b._\bh_\bh>\n #include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bp_\ba_\br_\ba_\bl_\bl_\be_\bl_\b/_\bm_\bp_\bi_\bc_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b._\bh_\bh>\n-#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bs_\bt_\bd_\bs_\bt_\br_\be_\ba_\bm_\bs_\b._\bh_\bh>\n+#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bp_\ba_\br_\ba_\bl_\bl_\be_\bl_\b/_\bm_\bp_\bi_\bd_\ba_\bt_\ba_\b._\bh_\bh>\n _\bG_\bo_\b _\bt_\bo_\b _\bt_\bh_\be_\b _\bs_\bo_\bu_\br_\bc_\be_\b _\bc_\bo_\bd_\be_\b _\bo_\bf_\b _\bt_\bh_\bi_\bs_\b _\bf_\bi_\bl_\be_\b.\n C\bCl\bla\bas\bss\bse\bes\bs\n-class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bF_\ba_\bk_\be_\bM_\bP_\bI_\bH_\be_\bl_\bp_\be_\br\n-\u00a0 A fake mpi helper. _\bM_\bo_\br_\be_\b._\b._\b.\n+ class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bM_\bP_\bI_\bP_\ba_\bc_\bk\n \u00a0\n-class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bM_\bP_\bI_\bH_\be_\bl_\bp_\be_\br\n-\u00a0 A real mpi helper. _\bM_\bo_\br_\be_\b._\b._\b.\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bM_\bP_\bI_\bD_\ba_\bt_\ba_\b<_\b _\bP_\b,_\b _\bs_\bt_\bd_\b:_\b:_\be_\bn_\ba_\bb_\bl_\be_\b__\bi_\bf_\b__\bt_\b<_\b _\bs_\bt_\bd_\b:_\b:_\bi_\bs_\b__\bs_\ba_\bm_\be_\b<_\b _\bs_\bt_\bd_\b:_\b:_\br_\be_\bm_\bo_\bv_\be_\b__\bc_\bo_\bn_\bs_\bt_\b__\bt_\b<\n+ _\bP_\b _\b>_\b,_\b _\bM_\bP_\bI_\bP_\ba_\bc_\bk_\b _\b>_\b:_\b:_\bv_\ba_\bl_\bu_\be_\b _\b>_\b _\b>\n \u00a0\n N\bNa\bam\bme\bes\bsp\bpa\bac\bce\bes\bs\n namespace \u00a0 _\bD_\bu_\bn_\be\n \u00a0 _\bD_\bu_\bn_\be namespace.\n \u00a0\n *\b**\b**\b**\b**\b* D\bDe\bet\bta\bai\bil\ble\bed\bd D\bDe\bes\bsc\bcr\bri\bip\bpt\bti\bio\bon\bn *\b**\b**\b**\b**\b*\n-Helpers for dealing with MPI.\n-Basically there are two helpers available:\n- FakeMPIHelper\n- A class adhering to the interface of MPIHelper that does not need MPI at\n- all. This can be used to create a sequential program even if MPI is used\n- to compile it.\n- MPIHelper\n- A real MPI helper. When the singleton gets instantiated MPI_Init will be\n- called and before the program exits MPI_Finalize will be called.\n-Example of who to use these classes:\n-A program that is parallel if compiled with MPI and sequential otherwise:\n-int _\bm_\ba_\bi_\bn(int argc, char** argv){\n-typedef _\bD_\bu_\bn_\be_\b:_\b:_\bM_\bP_\bI_\bH_\be_\bl_\bp_\be_\br MPIHelper;\n-MPIHelper::instance(argc, argv);\n-typename MPIHelper::MPICommunicator world =\n-MPIHelper::getCommunicator();\n-...\n-_\bm_\ba_\bi_\bn\n-int main(int argc, char **argv)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mpi_collective_benchmark.cc:297\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\bP_\bI_\bH_\be_\bl_\bp_\be_\br\n-A real mpi helper.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mpihelper.hh:181\n-If one wants to have sequential program even if the code is compiled with mpi\n-then one simply has to exchange the typedef with\n-typedef _\bD_\bu_\bn_\be_\b:_\b:_\bM_\bP_\bI_\bH_\be_\bl_\bp_\be_\br FakeMPIHelper;\n-.\n-For checking whether we really use MPI or just fake please use MPIHelper::\n-isFake (this is also possible at compile time!)\n+See MPI_Pack.\n+This Wrapper class takes care of the memory management and provides methods to\n+pack and unpack objects. All objects that can be used for MPI communication can\n+also be packed and unpacked to/from MPIPack.\n+ Author\n+ Nils-Arne Dreier\n ===============================================================================\n Generated by\u00a0_\b[_\bd_\bo_\bx_\by_\bg_\be_\bn_\b] 1.9.8\n"}]}, {"source1": "./usr/share/doc/libdune-common-doc/doxygen/a00041_source.html", "source2": "./usr/share/doc/libdune-common-doc/doxygen/a00041_source.html", "unified_diff": "@@ -1,15 +1,15 @@\n \n \n \n \n \n \n \n-dune-common: mpihelper.hh Source File\n+dune-common: mpipack.hh Source File\n \n \n \n \n \n \n \n@@ -74,257 +74,283 @@\n \n \n
    \n
    \n-
    mpihelper.hh
    \n+
    mpipack.hh
    \n
    \n
    \n Go to the documentation of this file.
    1// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
    \n
    2// vi: set et ts=4 sw=2 sts=2:
    \n
    3// SPDX-FileCopyrightInfo: Copyright \u00a9 DUNE Project contributors, see file LICENSE.md in module root
    \n
    4// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception
    \n-
    5#ifndef DUNE_COMMON_PARALLEL_MPIHELPER_HH
    \n-
    6#define DUNE_COMMON_PARALLEL_MPIHELPER_HH
    \n-
    7
    \n-
    8#include <cassert>
    \n-
    9#include <mutex>
    \n-
    10
    \n-
    11#if HAVE_MPI
    \n-
    12#include <mpi.h>
    \n-
    13#endif
    \n-
    14
    \n-\n-\n-\n-\n-
    19
    \n-
    20#if HAVE_MPI
    \n-\n-
    22#endif
    \n-
    23
    \n-
    24namespace Dune
    \n-
    25{
    \n-
    \n-\n-
    76 {
    \n-
    77 public:
    \n-
    82 constexpr static bool isFake = true;
    \n-
    83
    \n-\n-
    88
    \n-
    \n-\n-
    96 {
    \n-
    97 static MPICommunicator comm;
    \n-
    98 return comm;
    \n-
    99 }
    \n-
    \n-
    100
    \n-
    \n-\n-
    108 {
    \n-
    109 return getCommunicator();
    \n-
    110 }
    \n+
    20#ifndef DUNE_COMMON_PARALLEL_MPIPACK_HH
    \n+
    21#define DUNE_COMMON_PARALLEL_MPIPACK_HH
    \n+
    22
    \n+
    23#if HAVE_MPI
    \n+
    24
    \n+
    25#include <type_traits>
    \n+
    26#include <vector>
    \n+
    27
    \n+
    28#include <mpi.h>
    \n+
    29
    \n+\n+\n+
    32
    \n+
    33
    \n+
    34namespace Dune {
    \n+
    35
    \n+
    \n+
    36 class MPIPack {
    \n+
    37 std::vector<char> _buffer;
    \n+
    38 int _position;
    \n+
    39 MPI_Comm _comm;
    \n+
    40
    \n+
    41 friend struct MPIData<MPIPack>;
    \n+
    42 friend struct MPIData<const MPIPack>;
    \n+
    43 public:
    \n+
    \n+
    44 MPIPack(Communication<MPI_Comm> comm, std::size_t size = 0)
    \n+
    45 : _buffer(size)
    \n+
    46 , _position(0)
    \n+
    47 , _comm(comm)
    \n+
    48 {}
    \n+
    \n+
    49
    \n+
    50 // Its not valid to copy a MPIPack but you can move it
    \n+
    51 MPIPack(const MPIPack&) = delete;
    \n+
    52 MPIPack& operator = (const MPIPack& other) = delete;
    \n+
    53 MPIPack(MPIPack&&) = default;
    \n+
    54 MPIPack& operator = (MPIPack&& other) = default;
    \n+
    55
    \n+
    61 template<class T>
    \n+
    \n+
    62 void pack(const T& data){
    \n+
    63 auto mpidata = getMPIData(data);
    \n+
    64 int size = getPackSize(mpidata.size(), _comm, mpidata.type());
    \n+
    65 constexpr bool has_static_size = decltype(getMPIData(std::declval<T&>()))::static_size;
    \n+
    66 if(!has_static_size)
    \n+
    67 size += getPackSize(1, _comm, MPI_INT);
    \n+
    68 if (_position + size > 0 && size_t(_position + size) > _buffer.size()) // resize buffer if necessary
    \n+
    69 _buffer.resize(_position + size);
    \n+
    70 if(!has_static_size){
    \n+
    71 int size = mpidata.size();
    \n+
    72 MPI_Pack(&size, 1, MPI_INT, _buffer.data(), _buffer.size(),
    \n+
    73 &_position, _comm);
    \n+
    74 }
    \n+
    75 MPI_Pack(mpidata.ptr(), mpidata.size(),
    \n+
    76 mpidata.type(), _buffer.data(), _buffer.size(),
    \n+
    77 &_position, _comm);
    \n+
    78 }
    \n+
    \n+
    79
    \n+
    84 template<class T>
    \n+
    \n+
    85 auto /*void*/ unpack(T& data)
    \n+
    86 -> std::enable_if_t<decltype(getMPIData(data))::static_size, void>
    \n+
    87 {
    \n+
    88 auto mpidata = getMPIData(data);
    \n+
    89 MPI_Unpack(_buffer.data(), _buffer.size(), &_position,
    \n+
    90 mpidata.ptr(), mpidata.size(),
    \n+
    91 mpidata.type(), _comm);
    \n+
    92 }
    \n+
    \n+
    93
    \n+
    98 template<class T>
    \n+
    \n+
    99 auto /*void*/ unpack(T& data)
    \n+
    100 -> std::enable_if_t<!decltype(getMPIData(data))::static_size, void>
    \n+
    101 {
    \n+
    102 auto mpidata = getMPIData(data);
    \n+
    103 int size = 0;
    \n+
    104 MPI_Unpack(_buffer.data(), _buffer.size(), &_position,
    \n+
    105 &size, 1,
    \n+
    106 MPI_INT, _comm);
    \n+
    107 mpidata.resize(size);
    \n+
    108 MPI_Unpack(_buffer.data(), _buffer.size(), &_position,
    \n+
    109 mpidata.ptr(), mpidata.size(),
    \n+
    110 mpidata.type(), _comm);
    \n+
    111 }
    \n
    \n-
    111
    \n
    112
    \n
    113
    \n-
    119 [[deprecated("getCollectionCommunication is deprecated. Use getCommunication instead.")]]
    \n-\n-
    124
    \n-\n-
    \n-\n-
    127 {
    \n-\n-
    129 }
    \n-
    \n-
    130
    \n-
    \n-
    146 DUNE_EXPORT static FakeMPIHelper& instance([[maybe_unused]] int argc,
    \n-
    147 [[maybe_unused]] char** argv)
    \n-
    148 {
    \n-
    149 return instance();
    \n-
    150 }
    \n-
    \n-
    151
    \n-
    \n-\n-
    153 {
    \n-
    154 static FakeMPIHelper singleton;
    \n-
    155 return singleton;
    \n-
    156 }
    \n-
    \n-
    157
    \n-
    161 int rank () const { return 0; }
    \n-
    165 int size () const { return 1; }
    \n-
    166
    \n-
    167 private:
    \n-
    168 FakeMPIHelper() {}
    \n-
    169 FakeMPIHelper(const FakeMPIHelper&);
    \n-
    170 FakeMPIHelper& operator=(const FakeMPIHelper);
    \n-
    171 };
    \n-
    \n-
    172
    \n-
    173#if HAVE_MPI
    \n-
    \n-\n-
    181 {
    \n-
    182 public:
    \n-
    187 constexpr static bool isFake = false;
    \n-
    188
    \n-
    192 typedef MPI_Comm MPICommunicator;
    \n-
    193
    \n-
    \n-\n-
    201 {
    \n-
    202 return MPI_COMM_WORLD;
    \n-
    203 }
    \n-
    \n-
    204
    \n-
    \n-\n-
    212 {
    \n-
    213 return MPI_COMM_SELF;
    \n-
    214 }
    \n-
    \n-
    215
    \n-
    221 [[deprecated("getCollectionCommunication is deprecated. Use getCommunication instead.")]]
    \n-\n-
    \n-\n-
    224 {
    \n-\n-
    226 }
    \n+
    115 template<typename T>
    \n+
    \n+
    116 friend MPIPack& operator << (MPIPack& p, const T& t){
    \n+
    117 p.pack(t);
    \n+
    118 return p;
    \n+
    119 }
    \n+
    \n+
    120
    \n+
    122 template<typename T>
    \n+
    \n+
    123 friend MPIPack& operator >> (MPIPack& p, T& t){
    \n+
    124 p.unpack(t);
    \n+
    125 return p;
    \n+
    126 }
    \n+
    \n+
    127
    \n+
    129 template<typename T>
    \n+
    \n+
    130 MPIPack& read(T& t){
    \n+
    131 unpack(t);
    \n+
    132 return *this;
    \n+
    133 }
    \n+
    \n+
    134
    \n+
    136 template<typename T>
    \n+
    \n+
    137 MPIPack& write(const T& t){
    \n+
    138 pack(t);
    \n+
    139 return *this;
    \n+
    140 }
    \n+
    \n+
    141
    \n+
    \n+
    145 void resize(size_t size){
    \n+
    146 _buffer.resize(size);
    \n+
    147 }
    \n+
    \n+
    148
    \n+
    \n+
    151 void enlarge(int s) {
    \n+
    152 _buffer.resize(_buffer.size() + s);
    \n+
    153 }
    \n+
    \n+
    154
    \n+
    \n+
    157 size_t size() const {
    \n+
    158 return _buffer.size();
    \n+
    159 }
    \n+
    \n+
    160
    \n+
    \n+
    164 void seek(int p){
    \n+
    165 _position = p;
    \n+
    166 }
    \n+
    \n+
    167
    \n+
    \n+
    171 int tell() const{
    \n+
    172 return _position;
    \n+
    173 }
    \n+
    \n+
    174
    \n+
    \n+
    177 bool eof() const{
    \n+
    178 return std::size_t(_position)==_buffer.size();
    \n+
    179 }
    \n+
    \n+
    180
    \n+
    \n+
    184 static int getPackSize(int len, const MPI_Comm& comm, const MPI_Datatype& dt){
    \n+
    185 int size;
    \n+
    186 MPI_Pack_size(len, dt, comm, &size);
    \n+
    187 return size;
    \n+
    188 }
    \n+
    \n+
    189
    \n+
    \n+
    190 friend bool operator==(const MPIPack& a, const MPIPack& b) {
    \n+
    191 return a._buffer == b._buffer && a._comm == b._comm;
    \n+
    192 }
    \n+
    \n+
    \n+
    193 friend bool operator!=(const MPIPack& a, const MPIPack& b) {
    \n+
    194 return !(a==b);
    \n+
    195 }
    \n+
    \n+
    196
    \n+
    197 };
    \n+
    \n+
    198
    \n+
    199 template<class P>
    \n+
    \n+
    200 struct MPIData<P, std::enable_if_t<std::is_same<std::remove_const_t<P>, MPIPack>::value>> {
    \n+
    201 protected:
    \n+
    202 friend auto getMPIData<P>(P& t);
    \n+
    \n+
    203 MPIData(P& t) :
    \n+
    204 data_(t)
    \n+
    205 {}
    \n+
    \n+
    206 public:
    \n+
    207 static constexpr bool static_size = std::is_const<P>::value;
    \n+
    208
    \n+
    \n+
    209 void* ptr() {
    \n+
    210 return (void*) data_._buffer.data();
    \n+
    211 }
    \n+
    \n+
    212
    \n+
    \n+
    213 int size() {
    \n+
    214 return data_.size();
    \n+
    215 }
    \n+
    \n+
    216
    \n+
    \n+
    217 MPI_Datatype type() const{
    \n+
    218 return MPI_PACKED;
    \n+
    219 }
    \n+
    \n+
    220
    \n+
    \n+
    221 void resize(int size){
    \n+
    222 data_.resize(size);
    \n+
    223 }
    \n+
    \n+
    224 protected:
    \n+\n+
    226 };
    \n
    \n
    227
    \n-\n-
    \n-\n-
    230 {
    \n-\n-
    232 }
    \n-
    \n-
    \n-
    252 DUNE_EXPORT static MPIHelper& instance(int& argc, char**& argv)
    \n-
    253 {
    \n-
    254 return instance(&argc, &argv);
    \n-
    255 }
    \n-
    \n-
    256
    \n-
    \n-
    284 DUNE_EXPORT static MPIHelper& instance(int* argc = nullptr, char*** argv = nullptr)
    \n-
    285 {
    \n-
    286 assert((argc == nullptr) == (argv == nullptr));
    \n-
    287 static MPIHelper instance{argc, argv};
    \n-
    288 return instance;
    \n-
    289 }
    \n-
    \n-
    290
    \n-
    294 int rank () const { return rank_; }
    \n-
    298 int size () const { return size_; }
    \n-
    299
    \n-
    \n-\n-
    302 {
    \n-
    303 int wasFinalized = -1;
    \n-
    304 MPI_Finalized( &wasFinalized );
    \n-
    305 if(!wasFinalized && initializedHere_)
    \n-
    306 {
    \n-
    307 MPI_Finalize();
    \n-
    308 dverb << "Called MPI_Finalize on p=" << rank_ << "!" <<std::endl;
    \n-
    309 }
    \n-
    310
    \n-
    311 }
    \n-
    \n-
    312
    \n-
    313 private:
    \n-
    314 int rank_;
    \n-
    315 int size_;
    \n-
    316 bool initializedHere_;
    \n-
    317 void prevent_warning(int){}
    \n-
    318
    \n-
    320 MPIHelper(int* argc, char*** argv)
    \n-
    321 : initializedHere_(false)
    \n-
    322 {
    \n-
    323 int wasInitialized = -1;
    \n-
    324 MPI_Initialized( &wasInitialized );
    \n-
    325 if(!wasInitialized)
    \n-
    326 {
    \n-
    327 rank_ = -1;
    \n-
    328 size_ = -1;
    \n-
    329 static int is_initialized = MPI_Init(argc, argv);
    \n-
    330 prevent_warning(is_initialized);
    \n-
    331 initializedHere_ = true;
    \n-
    332 }
    \n-
    333
    \n-
    334 MPI_Comm_rank(MPI_COMM_WORLD,&rank_);
    \n-
    335 MPI_Comm_size(MPI_COMM_WORLD,&size_);
    \n-
    336
    \n-
    337 assert( rank_ >= 0 );
    \n-
    338 assert( size_ >= 1 );
    \n-
    339
    \n-
    340 dverb << "Called MPI_Init on p=" << rank_ << "!" << std::endl;
    \n-
    341 }
    \n-
    342
    \n-
    343 MPIHelper(const MPIHelper&);
    \n-
    344 MPIHelper& operator=(const MPIHelper);
    \n-
    345 };
    \n-
    \n-
    346#else // !HAVE_MPI
    \n-
    347 // We do not have MPI therefore FakeMPIHelper
    \n-
    348 // is the MPIHelper
    \n-
    353 typedef FakeMPIHelper MPIHelper;
    \n-
    354
    \n-
    355#endif // !HAVE_MPI
    \n-
    356
    \n-
    357} // end namespace Dune
    \n-
    358
    \n-
    359#endif // DUNE_COMMON_PARALLEL_MPIHELPER_HH
    \n-
    Definition of macros controlling symbol visibility at the ABI level.
    \n-
    #define DUNE_EXPORT
    Export a symbol as part of the public ABI.
    Definition visibility.hh:20
    \n-
    Implements an utility class that provides collective communication methods for sequential programs.
    \n-
    Implements an utility class that provides MPI's collective communication methods.
    \n-
    Standard Dune debug streams.
    \n-
    A few common exception classes.
    \n-
    DVerbType dverb(std::cout)
    Singleton of verbose debug stream.
    Definition stdstreams.hh:117
    \n+
    228} // end namespace Dune
    \n+
    229
    \n+
    230#endif // HAVE_MPI
    \n+
    231#endif // DUNE_COMMON_PARALLEL_MPIPACK_HH
    \n+
    Interface class to translate objects to a MPI_Datatype, void* and size used for MPI calls.
    \n+
    Implements an utility class that provides MPI's collective communication methods.
    \n+
    STL namespace.
    \n
    Dune namespace.
    Definition alignedallocator.hh:13
    \n-
    Definition communication.hh:46
    \n+
    auto getMPIData(T &t)
    Definition mpidata.hh:44
    \n
    Collective communication interface and sequential default implementation.
    Definition communication.hh:100
    \n-
    A fake mpi helper.
    Definition mpihelper.hh:76
    \n-
    static DUNE_EXPORT MPICommunicator getCommunicator()
    get the default communicator
    Definition mpihelper.hh:95
    \n-
    int size() const
    return rank of process, i.e. one
    Definition mpihelper.hh:165
    \n-
    static Communication< MPICommunicator > getCollectiveCommunication()
    Definition mpihelper.hh:120
    \n-
    static MPICommunicator getLocalCommunicator()
    get a local communicator
    Definition mpihelper.hh:107
    \n-
    No_Comm MPICommunicator
    The type of the mpi communicator.
    Definition mpihelper.hh:87
    \n-
    static DUNE_EXPORT FakeMPIHelper & instance(int argc, char **argv)
    Get the singleton instance of the helper.
    Definition mpihelper.hh:146
    \n-
    static DUNE_EXPORT FakeMPIHelper & instance()
    Definition mpihelper.hh:152
    \n-
    static Communication< MPICommunicator > getCommunication()
    Definition mpihelper.hh:126
    \n-
    static constexpr bool isFake
    Are we fake (i.e. pretend to have MPI support but are compiled without.)
    Definition mpihelper.hh:82
    \n-
    int rank() const
    return rank of process, i.e. zero
    Definition mpihelper.hh:161
    \n-
    A real mpi helper.
    Definition mpihelper.hh:181
    \n-
    int size() const
    return number of processes
    Definition mpihelper.hh:298
    \n-
    static constexpr bool isFake
    Are we fake (i. e. pretend to have MPI support but are compiled without.
    Definition mpihelper.hh:187
    \n-
    static DUNE_EXPORT MPIHelper & instance(int *argc=nullptr, char ***argv=nullptr)
    Get the singleton instance of the helper.
    Definition mpihelper.hh:284
    \n-
    static DUNE_EXPORT MPIHelper & instance(int &argc, char **&argv)
    Get the singleton instance of the helper.
    Definition mpihelper.hh:252
    \n-
    static Communication< MPICommunicator > getCommunication()
    Definition mpihelper.hh:229
    \n-
    ~MPIHelper()
    calls MPI_Finalize
    Definition mpihelper.hh:301
    \n-
    int rank() const
    return rank of process
    Definition mpihelper.hh:294
    \n-
    MPI_Comm MPICommunicator
    The type of the mpi communicator.
    Definition mpihelper.hh:192
    \n-
    static MPICommunicator getCommunicator()
    get the default communicator
    Definition mpihelper.hh:200
    \n-
    static MPICommunicator getLocalCommunicator()
    get a local communicator
    Definition mpihelper.hh:211
    \n-
    static Communication< MPICommunicator > getCollectiveCommunication()
    Definition mpihelper.hh:223
    \n+
    Definition mpidata.hh:51
    \n+
    T & data_
    Definition mpidata.hh:54
    \n+
    int size() const
    Definition mpidata.hh:68
    \n+
    static constexpr bool static_size
    Definition mpidata.hh:66
    \n+
    Definition mpipack.hh:36
    \n+
    void enlarge(int s)
    Enlarges the internal buffer.
    Definition mpipack.hh:151
    \n+
    friend MPIPack & operator>>(MPIPack &p, T &t)
    Unpacks data from the object.
    Definition mpipack.hh:123
    \n+
    friend MPIPack & operator<<(MPIPack &p, const T &t)
    Packs the data into the object. Enlarges the internal buffer if necessary.
    Definition mpipack.hh:116
    \n+
    friend bool operator!=(const MPIPack &a, const MPIPack &b)
    Definition mpipack.hh:193
    \n+
    size_t size() const
    Returns the size of the internal buffer.
    Definition mpipack.hh:157
    \n+
    MPIPack & operator=(const MPIPack &other)=delete
    \n+
    MPIPack(Communication< MPI_Comm > comm, std::size_t size=0)
    Definition mpipack.hh:44
    \n+
    void pack(const T &data)
    Packs the data into the object. Enlarges the internal buffer if necessary.
    Definition mpipack.hh:62
    \n+
    auto unpack(T &data) -> std::enable_if_t<!decltype(getMPIData(data))::static_size, void >
    Unpacks data from the object.
    Definition mpipack.hh:99
    \n+
    auto unpack(T &data) -> std::enable_if_t< decltype(getMPIData(data))::static_size, void >
    Unpacks data from the object.
    Definition mpipack.hh:85
    \n+
    friend bool operator==(const MPIPack &a, const MPIPack &b)
    Definition mpipack.hh:190
    \n+
    MPIPack(const MPIPack &)=delete
    \n+
    void seek(int p)
    Sets the position in the buffer where the next pack/unpack operation should take place.
    Definition mpipack.hh:164
    \n+
    bool eof() const
    Checks whether the end of the buffer is reached.
    Definition mpipack.hh:177
    \n+
    void resize(size_t size)
    Resizes the internal buffer.
    Definition mpipack.hh:145
    \n+
    int tell() const
    Gets the position in the buffer where the next pack/unpack operation should take place.
    Definition mpipack.hh:171
    \n+
    MPIPack(MPIPack &&)=default
    \n+
    MPIPack & read(T &t)
    Unpacks data from the object.
    Definition mpipack.hh:130
    \n+
    static int getPackSize(int len, const MPI_Comm &comm, const MPI_Datatype &dt)
    Returns the size of the data needed to store the data in an MPIPack. See MPI_Pack_size.
    Definition mpipack.hh:184
    \n+
    MPIPack & write(const T &t)
    Packs the data into the object. Enlarges the internal buffer if necessary.
    Definition mpipack.hh:137
    \n+\n+\n+\n+\n+\n+\n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,306 +1,327 @@\n dune-common\u00a02.10\n Loading...\n Searching...\n No Matches\n * _\bd_\bu_\bn_\be\n * _\bc_\bo_\bm_\bm_\bo_\bn\n * _\bp_\ba_\br_\ba_\bl_\bl_\be_\bl\n-mpihelper.hh\n+mpipack.hh\n _\bG_\bo_\b _\bt_\bo_\b _\bt_\bh_\be_\b _\bd_\bo_\bc_\bu_\bm_\be_\bn_\bt_\ba_\bt_\bi_\bo_\bn_\b _\bo_\bf_\b _\bt_\bh_\bi_\bs_\b _\bf_\bi_\bl_\be_\b.\n 1// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-\n 2// vi: set et ts=4 sw=2 sts=2:\n 3// SPDX-FileCopyrightInfo: Copyright \u00c2\u00a9 DUNE Project contributors, see file\n LICENSE.md in module root\n 4// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception\n-5#ifndef DUNE_COMMON_PARALLEL_MPIHELPER_HH\n-6#define DUNE_COMMON_PARALLEL_MPIHELPER_HH\n-7\n-8#include \n-9#include \n-10\n-11#if HAVE_MPI\n-12#include \n-13#endif\n-14\n-15#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\be_\bx_\bc_\be_\bp_\bt_\bi_\bo_\bn_\bs_\b._\bh_\bh>\n-16#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bv_\bi_\bs_\bi_\bb_\bi_\bl_\bi_\bt_\by_\b._\bh_\bh>\n-17#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bp_\ba_\br_\ba_\bl_\bl_\be_\bl_\b/_\bc_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b._\bh_\bh>\n-18#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bp_\ba_\br_\ba_\bl_\bl_\be_\bl_\b/_\bm_\bp_\bi_\bc_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b._\bh_\bh>\n-19\n-20#if HAVE_MPI\n-21#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bs_\bt_\bd_\bs_\bt_\br_\be_\ba_\bm_\bs_\b._\bh_\bh>\n-22#endif\n-23\n-24namespace _\bD_\bu_\bn_\be\n-25{\n-_\b7_\b5 class _\bF_\ba_\bk_\be_\bM_\bP_\bI_\bH_\be_\bl_\bp_\be_\br\n-76 {\n-77 public:\n-_\b8_\b2 constexpr static bool _\bi_\bs_\bF_\ba_\bk_\be = true;\n-83\n-_\b8_\b7 typedef _\bN_\bo_\b__\bC_\bo_\bm_\bm _\bM_\bP_\bI_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bo_\br;\n-88\n-_\b9_\b5 _\bD_\bU_\bN_\bE_\b__\bE_\bX_\bP_\bO_\bR_\bT static _\bM_\bP_\bI_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bo_\br _\bg_\be_\bt_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bo_\br ()\n-96 {\n-97 static _\bM_\bP_\bI_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bo_\br comm;\n-98 return comm;\n-99 }\n-100\n-_\b1_\b0_\b7 static _\bM_\bP_\bI_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bo_\br _\bg_\be_\bt_\bL_\bo_\bc_\ba_\bl_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bo_\br ()\n-108 {\n-109 return _\bg_\be_\bt_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bo_\br();\n-110 }\n-111\n+20#ifndef DUNE_COMMON_PARALLEL_MPIPACK_HH\n+21#define DUNE_COMMON_PARALLEL_MPIPACK_HH\n+22\n+23#if HAVE_MPI\n+24\n+25#include \n+26#include \n+27\n+28#include \n+29\n+30#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bp_\ba_\br_\ba_\bl_\bl_\be_\bl_\b/_\bm_\bp_\bi_\bc_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b._\bh_\bh>\n+31#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bp_\ba_\br_\ba_\bl_\bl_\be_\bl_\b/_\bm_\bp_\bi_\bd_\ba_\bt_\ba_\b._\bh_\bh>\n+32\n+33\n+34namespace _\bD_\bu_\bn_\be {\n+35\n+_\b3_\b6 class _\bM_\bP_\bI_\bP_\ba_\bc_\bk {\n+37 std::vector _buffer;\n+38 int _position;\n+_\b3_\b9 MPI_Comm _comm;\n+40\n+41 friend struct _\bM_\bP_\bI_\bD_\ba_\bt_\ba<_\bM_\bP_\bI_\bP_\ba_\bc_\bk>;\n+42 friend struct _\bM_\bP_\bI_\bD_\ba_\bt_\ba;\n+43 public:\n+_\b4_\b4 _\bM_\bP_\bI_\bP_\ba_\bc_\bk(_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b<_\bM_\bP_\bI_\b__\bC_\bo_\bm_\bm_\b> comm, std::size_t _\bs_\bi_\bz_\be = 0)\n+45 : _buffer(_\bs_\bi_\bz_\be)\n+46 , _position(0)\n+47 , _comm(comm)\n+48 {}\n+49\n+50 // Its not valid to copy a MPIPack but you can move it\n+_\b5_\b1 _\bM_\bP_\bI_\bP_\ba_\bc_\bk(const _\bM_\bP_\bI_\bP_\ba_\bc_\bk&) = delete;\n+_\b5_\b2 _\bM_\bP_\bI_\bP_\ba_\bc_\bk& _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b _\b=_\b (const _\bM_\bP_\bI_\bP_\ba_\bc_\bk& other) = delete;\n+_\b5_\b3 _\bM_\bP_\bI_\bP_\ba_\bc_\bk(_\bM_\bP_\bI_\bP_\ba_\bc_\bk&&) = default;\n+_\b5_\b4 _\bM_\bP_\bI_\bP_\ba_\bc_\bk& _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b _\b=_\b (_\bM_\bP_\bI_\bP_\ba_\bc_\bk&& other) = default;\n+55\n+61 template\n+_\b6_\b2 void _\bp_\ba_\bc_\bk(const T& data){\n+63 auto mpidata = _\bg_\be_\bt_\bM_\bP_\bI_\bD_\ba_\bt_\ba(data);\n+64 int _\bs_\bi_\bz_\be = _\bg_\be_\bt_\bP_\ba_\bc_\bk_\bS_\bi_\bz_\be(mpidata.size(), _comm, mpidata.type());\n+65 constexpr bool has_static_size = decltype(_\bg_\be_\bt_\bM_\bP_\bI_\bD_\ba_\bt_\ba(std::declval()))::\n+static_size;\n+66 if(!has_static_size)\n+67 _\bs_\bi_\bz_\be += _\bg_\be_\bt_\bP_\ba_\bc_\bk_\bS_\bi_\bz_\be(1, _comm, MPI_INT);\n+68 if (_position + _\bs_\bi_\bz_\be > 0 && size_t(_position + _\bs_\bi_\bz_\be) > _buffer.size()) /\n+/ resize buffer if necessary\n+69 _buffer.resize(_position + _\bs_\bi_\bz_\be);\n+70 if(!has_static_size){\n+71 int _\bs_\bi_\bz_\be = mpidata.size();\n+72 MPI_Pack(&_\bs_\bi_\bz_\be, 1, MPI_INT, _buffer.data(), _buffer.size(),\n+73 &_position, _comm);\n+74 }\n+75 MPI_Pack(mpidata.ptr(), mpidata.size(),\n+76 mpidata.type(), _buffer.data(), _buffer.size(),\n+77 &_position, _comm);\n+78 }\n+79\n+84 template\n+_\b8_\b5 auto /*void*/ _\bu_\bn_\bp_\ba_\bc_\bk(T& data)\n+86 -> std::enable_if_t\n+87 {\n+88 auto mpidata = _\bg_\be_\bt_\bM_\bP_\bI_\bD_\ba_\bt_\ba(data);\n+89 MPI_Unpack(_buffer.data(), _buffer.size(), &_position,\n+90 mpidata.ptr(), mpidata.size(),\n+91 mpidata.type(), _comm);\n+92 }\n+93\n+98 template\n+_\b9_\b9 auto /*void*/ _\bu_\bn_\bp_\ba_\bc_\bk(T& data)\n+100 -> std::enable_if_t\n+101 {\n+102 auto mpidata = _\bg_\be_\bt_\bM_\bP_\bI_\bD_\ba_\bt_\ba(data);\n+103 int _\bs_\bi_\bz_\be = 0;\n+104 MPI_Unpack(_buffer.data(), _buffer.size(), &_position,\n+105 &_\bs_\bi_\bz_\be, 1,\n+106 MPI_INT, _comm);\n+107 mpidata.resize(_\bs_\bi_\bz_\be);\n+108 MPI_Unpack(_buffer.data(), _buffer.size(), &_position,\n+109 mpidata.ptr(), mpidata.size(),\n+110 mpidata.type(), _comm);\n+111 }\n 112\n 113\n-119 [[deprecated(\"getCollectionCommunication is deprecated. Use\n-getCommunication instead.\")]]\n-_\b1_\b2_\b0 static _\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b<_\bM_\bP_\bI_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bo_\br_\b> _\bg_\be_\bt_\bC_\bo_\bl_\bl_\be_\bc_\bt_\bi_\bv_\be_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn()\n-121 {\n-122 return _\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b<_\bM_\bP_\bI_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bo_\br_\b>(_\bg_\be_\bt_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bo_\br());\n-123 }\n-124\n-125 static _\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b<_\bM_\bP_\bI_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bo_\br_\b>\n-_\b1_\b2_\b6 _\bg_\be_\bt_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn()\n-127 {\n-128 return _\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b<_\bM_\bP_\bI_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bo_\br_\b>(_\bg_\be_\bt_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bo_\br());\n-129 }\n-130\n-_\b1_\b4_\b6 _\bD_\bU_\bN_\bE_\b__\bE_\bX_\bP_\bO_\bR_\bT static _\bF_\ba_\bk_\be_\bM_\bP_\bI_\bH_\be_\bl_\bp_\be_\br& _\bi_\bn_\bs_\bt_\ba_\bn_\bc_\be([[maybe_unused]] int argc,\n-147 [[maybe_unused]] char** argv)\n-148 {\n-149 return _\bi_\bn_\bs_\bt_\ba_\bn_\bc_\be();\n-150 }\n-151\n-_\b1_\b5_\b2 _\bD_\bU_\bN_\bE_\b__\bE_\bX_\bP_\bO_\bR_\bT static _\bF_\ba_\bk_\be_\bM_\bP_\bI_\bH_\be_\bl_\bp_\be_\br& _\bi_\bn_\bs_\bt_\ba_\bn_\bc_\be()\n-153 {\n-154 static _\bF_\ba_\bk_\be_\bM_\bP_\bI_\bH_\be_\bl_\bp_\be_\br singleton;\n-155 return singleton;\n-156 }\n-157\n-_\b1_\b6_\b1 int _\br_\ba_\bn_\bk () const { return 0; }\n-_\b1_\b6_\b5 int _\bs_\bi_\bz_\be () const { return 1; }\n-166\n-167 private:\n-168 _\bF_\ba_\bk_\be_\bM_\bP_\bI_\bH_\be_\bl_\bp_\be_\br() {}\n-169 FakeMPIHelper(const FakeMPIHelper&);\n-170 FakeMPIHelper& operator=(const FakeMPIHelper);\n-171 };\n-172\n-173#if HAVE_MPI\n-_\b1_\b8_\b0 class _\bM_\bP_\bI_\bH_\be_\bl_\bp_\be_\br\n-181 {\n-182 public:\n-_\b1_\b8_\b7 constexpr static bool _\bi_\bs_\bF_\ba_\bk_\be = false;\n-188\n-_\b1_\b9_\b2 typedef MPI_Comm _\bM_\bP_\bI_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bo_\br;\n-193\n-_\b2_\b0_\b0 static _\bM_\bP_\bI_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bo_\br _\bg_\be_\bt_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bo_\br ()\n-201 {\n-202 return MPI_COMM_WORLD;\n-203 }\n-204\n-_\b2_\b1_\b1 static _\bM_\bP_\bI_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bo_\br _\bg_\be_\bt_\bL_\bo_\bc_\ba_\bl_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bo_\br ()\n-212 {\n-213 return MPI_COMM_SELF;\n-214 }\n-215\n-221 [[deprecated(\"getCollectionCommunication is deprecated. Use\n-getCommunication instead.\")]]\n-222 static _\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b<_\bM_\bP_\bI_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bo_\br_\b>\n-_\b2_\b2_\b3 _\bg_\be_\bt_\bC_\bo_\bl_\bl_\be_\bc_\bt_\bi_\bv_\be_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn()\n-224 {\n-225 return _\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b<_\bM_\bP_\bI_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bo_\br_\b>(_\bg_\be_\bt_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bo_\br());\n-226 }\n+115 template\n+_\b1_\b1_\b6 friend _\bM_\bP_\bI_\bP_\ba_\bc_\bk& _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b _\b<_\b<_\b (_\bM_\bP_\bI_\bP_\ba_\bc_\bk& p, const T& t){\n+117 p._\bp_\ba_\bc_\bk(t);\n+118 return p;\n+119 }\n+120\n+122 template\n+_\b1_\b2_\b3 friend _\bM_\bP_\bI_\bP_\ba_\bc_\bk& _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b _\b>_\b>_\b (_\bM_\bP_\bI_\bP_\ba_\bc_\bk& p, T& t){\n+124 p._\bu_\bn_\bp_\ba_\bc_\bk(t);\n+125 return p;\n+126 }\n+127\n+129 template\n+_\b1_\b3_\b0 _\bM_\bP_\bI_\bP_\ba_\bc_\bk& _\br_\be_\ba_\bd(T& t){\n+131 _\bu_\bn_\bp_\ba_\bc_\bk(t);\n+132 return *this;\n+133 }\n+134\n+136 template\n+_\b1_\b3_\b7 _\bM_\bP_\bI_\bP_\ba_\bc_\bk& _\bw_\br_\bi_\bt_\be(const T& t){\n+138 _\bp_\ba_\bc_\bk(t);\n+139 return *this;\n+140 }\n+141\n+_\b1_\b4_\b5 void _\br_\be_\bs_\bi_\bz_\be(size_t _\bs_\bi_\bz_\be){\n+146 _buffer.resize(_\bs_\bi_\bz_\be);\n+147 }\n+148\n+_\b1_\b5_\b1 void _\be_\bn_\bl_\ba_\br_\bg_\be(int s) {\n+152 _buffer.resize(_buffer.size() + s);\n+153 }\n+154\n+_\b1_\b5_\b7 size_t _\bs_\bi_\bz_\be() const {\n+158 return _buffer.size();\n+159 }\n+160\n+_\b1_\b6_\b4 void _\bs_\be_\be_\bk(int p){\n+165 _position = p;\n+166 }\n+167\n+_\b1_\b7_\b1 int _\bt_\be_\bl_\bl() const{\n+172 return _position;\n+173 }\n+174\n+_\b1_\b7_\b7 bool _\be_\bo_\bf() const{\n+178 return std::size_t(_position)==_buffer.size();\n+179 }\n+180\n+_\b1_\b8_\b4 static int _\bg_\be_\bt_\bP_\ba_\bc_\bk_\bS_\bi_\bz_\be(int len, const MPI_Comm& comm, const MPI_Datatype&\n+dt){\n+185 int _\bs_\bi_\bz_\be;\n+186 MPI_Pack_size(len, dt, comm, &_\bs_\bi_\bz_\be);\n+187 return _\bs_\bi_\bz_\be;\n+188 }\n+189\n+_\b1_\b9_\b0 friend bool _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b=_\b=(const _\bM_\bP_\bI_\bP_\ba_\bc_\bk& a, const _\bM_\bP_\bI_\bP_\ba_\bc_\bk& b) {\n+191 return a._buffer == b._buffer && a._comm == b._comm;\n+192 }\n+_\b1_\b9_\b3 friend bool _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b!_\b=(const _\bM_\bP_\bI_\bP_\ba_\bc_\bk& a, const _\bM_\bP_\bI_\bP_\ba_\bc_\bk& b) {\n+194 return !(a==b);\n+195 }\n+196\n+197 };\n+198\n+199 template\n+_\b2_\b0_\b0 struct _\bM_\bP_\bI_\bD_\ba_\bt_\ba,\n+MPIPack>::value>> {\n+201 protected:\n+_\b2_\b0_\b2 friend auto getMPIData

    (P& t);\n+_\b2_\b0_\b3 _\bM_\bP_\bI_\bD_\ba_\bt_\ba(P& t) :\n+204 _\bd_\ba_\bt_\ba_\b_(t)\n+205 {}\n+206 public:\n+_\b2_\b0_\b7 static constexpr bool _\bs_\bt_\ba_\bt_\bi_\bc_\b__\bs_\bi_\bz_\be = std::is_const

    ::value;\n+208\n+_\b2_\b0_\b9 void* _\bp_\bt_\br() {\n+210 return (void*) _\bd_\ba_\bt_\ba_\b_._buffer.data();\n+211 }\n+212\n+_\b2_\b1_\b3 int _\bs_\bi_\bz_\be() {\n+214 return _\bd_\ba_\bt_\ba_\b_.size();\n+215 }\n+216\n+_\b2_\b1_\b7 MPI_Datatype _\bt_\by_\bp_\be() const{\n+218 return MPI_PACKED;\n+219 }\n+220\n+_\b2_\b2_\b1 void _\br_\be_\bs_\bi_\bz_\be(int _\bs_\bi_\bz_\be){\n+222 _\bd_\ba_\bt_\ba_\b_.resize(_\bs_\bi_\bz_\be);\n+223 }\n+224 protected:\n+_\b2_\b2_\b5 P& _\bd_\ba_\bt_\ba_\b_;\n+226 };\n 227\n-228 static _\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b<_\bM_\bP_\bI_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bo_\br_\b>\n-_\b2_\b2_\b9 _\bg_\be_\bt_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn()\n-230 {\n-231 return _\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b<_\bM_\bP_\bI_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bo_\br_\b>(_\bg_\be_\bt_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bo_\br());\n-232 }\n-_\b2_\b5_\b2 _\bD_\bU_\bN_\bE_\b__\bE_\bX_\bP_\bO_\bR_\bT static _\bM_\bP_\bI_\bH_\be_\bl_\bp_\be_\br& _\bi_\bn_\bs_\bt_\ba_\bn_\bc_\be(int& argc, char**& argv)\n-253 {\n-254 return _\bi_\bn_\bs_\bt_\ba_\bn_\bc_\be(&argc, &argv);\n-255 }\n-256\n-_\b2_\b8_\b4 _\bD_\bU_\bN_\bE_\b__\bE_\bX_\bP_\bO_\bR_\bT static _\bM_\bP_\bI_\bH_\be_\bl_\bp_\be_\br& _\bi_\bn_\bs_\bt_\ba_\bn_\bc_\be(int* argc = nullptr, char*** argv =\n-nullptr)\n-285 {\n-286 assert((argc == nullptr) == (argv == nullptr));\n-287 static _\bM_\bP_\bI_\bH_\be_\bl_\bp_\be_\br _\bi_\bn_\bs_\bt_\ba_\bn_\bc_\be{argc, argv};\n-288 return _\bi_\bn_\bs_\bt_\ba_\bn_\bc_\be;\n-289 }\n-290\n-_\b2_\b9_\b4 int _\br_\ba_\bn_\bk () const { return rank_; }\n-_\b2_\b9_\b8 int _\bs_\bi_\bz_\be () const { return size_; }\n-299\n-_\b3_\b0_\b1 _\b~_\bM_\bP_\bI_\bH_\be_\bl_\bp_\be_\br()\n-302 {\n-303 int wasFinalized = -1;\n-304 MPI_Finalized( &wasFinalized );\n-305 if(!wasFinalized && initializedHere_)\n-306 {\n-307 MPI_Finalize();\n-308 _\bd_\bv_\be_\br_\bb << \"Called MPI_Finalize on p=\" << rank_ << \"!\" <= 0 );\n-338 assert( size_ >= 1 );\n-339\n-340 _\bd_\bv_\be_\br_\bb << \"Called MPI_Init on p=\" << rank_ << \"!\" << std::endl;\n-341 }\n-342\n-343 MPIHelper(const MPIHelper&);\n-344 MPIHelper& operator=(const MPIHelper);\n-345 };\n-346#else // !HAVE_MPI\n-347 // We do not have MPI therefore FakeMPIHelper\n-348 // is the MPIHelper\n-353 typedef FakeMPIHelper MPIHelper;\n-354\n-355#endif // !HAVE_MPI\n-356\n-357} // end namespace Dune\n-358\n-359#endif // DUNE_COMMON_PARALLEL_MPIHELPER_HH\n-_\bv_\bi_\bs_\bi_\bb_\bi_\bl_\bi_\bt_\by_\b._\bh_\bh\n-Definition of macros controlling symbol visibility at the ABI level.\n-_\bD_\bU_\bN_\bE_\b__\bE_\bX_\bP_\bO_\bR_\bT\n-#define DUNE_EXPORT\n-Export a symbol as part of the public ABI.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn visibility.hh:20\n-_\bc_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b._\bh_\bh\n-Implements an utility class that provides collective communication methods for\n-sequential programs.\n+228} // end namespace Dune\n+229\n+230#endif // HAVE_MPI\n+231#endif // DUNE_COMMON_PARALLEL_MPIPACK_HH\n+_\bm_\bp_\bi_\bd_\ba_\bt_\ba_\b._\bh_\bh\n+Interface class to translate objects to a MPI_Datatype, void* and size used for\n+MPI calls.\n _\bm_\bp_\bi_\bc_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b._\bh_\bh\n Implements an utility class that provides MPI's collective communication\n methods.\n-_\bs_\bt_\bd_\bs_\bt_\br_\be_\ba_\bm_\bs_\b._\bh_\bh\n-Standard Dune debug streams.\n-_\be_\bx_\bc_\be_\bp_\bt_\bi_\bo_\bn_\bs_\b._\bh_\bh\n-A few common exception classes.\n-_\bD_\bu_\bn_\be_\b:_\b:_\bd_\bv_\be_\br_\bb\n-DVerbType dverb(std::cout)\n-Singleton of verbose debug stream.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn stdstreams.hh:117\n+_\bs_\bt_\bd\n+STL namespace.\n _\bD_\bu_\bn_\be\n Dune namespace.\n D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn alignedallocator.hh:13\n-_\bD_\bu_\bn_\be_\b:_\b:_\bN_\bo_\b__\bC_\bo_\bm_\bm\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn communication.hh:46\n+_\bD_\bu_\bn_\be_\b:_\b:_\bg_\be_\bt_\bM_\bP_\bI_\bD_\ba_\bt_\ba\n+auto getMPIData(T &t)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mpidata.hh:44\n _\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn\n Collective communication interface and sequential default implementation.\n D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn communication.hh:100\n-_\bD_\bu_\bn_\be_\b:_\b:_\bF_\ba_\bk_\be_\bM_\bP_\bI_\bH_\be_\bl_\bp_\be_\br\n-A fake mpi helper.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mpihelper.hh:76\n-_\bD_\bu_\bn_\be_\b:_\b:_\bF_\ba_\bk_\be_\bM_\bP_\bI_\bH_\be_\bl_\bp_\be_\br_\b:_\b:_\bg_\be_\bt_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bo_\br\n-static DUNE_EXPORT MPICommunicator getCommunicator()\n-get the default communicator\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mpihelper.hh:95\n-_\bD_\bu_\bn_\be_\b:_\b:_\bF_\ba_\bk_\be_\bM_\bP_\bI_\bH_\be_\bl_\bp_\be_\br_\b:_\b:_\bs_\bi_\bz_\be\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\bP_\bI_\bD_\ba_\bt_\ba\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mpidata.hh:51\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\bP_\bI_\bD_\ba_\bt_\ba_\b:_\b:_\bd_\ba_\bt_\ba_\b_\n+T & data_\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mpidata.hh:54\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\bP_\bI_\bD_\ba_\bt_\ba_\b:_\b:_\bs_\bi_\bz_\be\n int size() const\n-return rank of process, i.e. one\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mpihelper.hh:165\n-_\bD_\bu_\bn_\be_\b:_\b:_\bF_\ba_\bk_\be_\bM_\bP_\bI_\bH_\be_\bl_\bp_\be_\br_\b:_\b:_\bg_\be_\bt_\bC_\bo_\bl_\bl_\be_\bc_\bt_\bi_\bv_\be_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn\n-static Communication< MPICommunicator > getCollectiveCommunication()\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mpihelper.hh:120\n-_\bD_\bu_\bn_\be_\b:_\b:_\bF_\ba_\bk_\be_\bM_\bP_\bI_\bH_\be_\bl_\bp_\be_\br_\b:_\b:_\bg_\be_\bt_\bL_\bo_\bc_\ba_\bl_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bo_\br\n-static MPICommunicator getLocalCommunicator()\n-get a local communicator\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mpihelper.hh:107\n-_\bD_\bu_\bn_\be_\b:_\b:_\bF_\ba_\bk_\be_\bM_\bP_\bI_\bH_\be_\bl_\bp_\be_\br_\b:_\b:_\bM_\bP_\bI_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bo_\br\n-No_Comm MPICommunicator\n-The type of the mpi communicator.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mpihelper.hh:87\n-_\bD_\bu_\bn_\be_\b:_\b:_\bF_\ba_\bk_\be_\bM_\bP_\bI_\bH_\be_\bl_\bp_\be_\br_\b:_\b:_\bi_\bn_\bs_\bt_\ba_\bn_\bc_\be\n-static DUNE_EXPORT FakeMPIHelper & instance(int argc, char **argv)\n-Get the singleton instance of the helper.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mpihelper.hh:146\n-_\bD_\bu_\bn_\be_\b:_\b:_\bF_\ba_\bk_\be_\bM_\bP_\bI_\bH_\be_\bl_\bp_\be_\br_\b:_\b:_\bi_\bn_\bs_\bt_\ba_\bn_\bc_\be\n-static DUNE_EXPORT FakeMPIHelper & instance()\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mpihelper.hh:152\n-_\bD_\bu_\bn_\be_\b:_\b:_\bF_\ba_\bk_\be_\bM_\bP_\bI_\bH_\be_\bl_\bp_\be_\br_\b:_\b:_\bg_\be_\bt_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn\n-static Communication< MPICommunicator > getCommunication()\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mpihelper.hh:126\n-_\bD_\bu_\bn_\be_\b:_\b:_\bF_\ba_\bk_\be_\bM_\bP_\bI_\bH_\be_\bl_\bp_\be_\br_\b:_\b:_\bi_\bs_\bF_\ba_\bk_\be\n-static constexpr bool isFake\n-Are we fake (i.e. pretend to have MPI support but are compiled without.)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mpihelper.hh:82\n-_\bD_\bu_\bn_\be_\b:_\b:_\bF_\ba_\bk_\be_\bM_\bP_\bI_\bH_\be_\bl_\bp_\be_\br_\b:_\b:_\br_\ba_\bn_\bk\n-int rank() const\n-return rank of process, i.e. zero\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mpihelper.hh:161\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\bP_\bI_\bH_\be_\bl_\bp_\be_\br\n-A real mpi helper.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mpihelper.hh:181\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\bP_\bI_\bH_\be_\bl_\bp_\be_\br_\b:_\b:_\bs_\bi_\bz_\be\n-int size() const\n-return number of processes\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mpihelper.hh:298\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\bP_\bI_\bH_\be_\bl_\bp_\be_\br_\b:_\b:_\bi_\bs_\bF_\ba_\bk_\be\n-static constexpr bool isFake\n-Are we fake (i. e. pretend to have MPI support but are compiled without.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mpihelper.hh:187\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\bP_\bI_\bH_\be_\bl_\bp_\be_\br_\b:_\b:_\bi_\bn_\bs_\bt_\ba_\bn_\bc_\be\n-static DUNE_EXPORT MPIHelper & instance(int *argc=nullptr, char\n-***argv=nullptr)\n-Get the singleton instance of the helper.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mpihelper.hh:284\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\bP_\bI_\bH_\be_\bl_\bp_\be_\br_\b:_\b:_\bi_\bn_\bs_\bt_\ba_\bn_\bc_\be\n-static DUNE_EXPORT MPIHelper & instance(int &argc, char **&argv)\n-Get the singleton instance of the helper.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mpihelper.hh:252\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\bP_\bI_\bH_\be_\bl_\bp_\be_\br_\b:_\b:_\bg_\be_\bt_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn\n-static Communication< MPICommunicator > getCommunication()\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mpihelper.hh:229\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\bP_\bI_\bH_\be_\bl_\bp_\be_\br_\b:_\b:_\b~_\bM_\bP_\bI_\bH_\be_\bl_\bp_\be_\br\n-~MPIHelper()\n-calls MPI_Finalize\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mpihelper.hh:301\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\bP_\bI_\bH_\be_\bl_\bp_\be_\br_\b:_\b:_\br_\ba_\bn_\bk\n-int rank() const\n-return rank of process\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mpihelper.hh:294\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\bP_\bI_\bH_\be_\bl_\bp_\be_\br_\b:_\b:_\bM_\bP_\bI_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bo_\br\n-MPI_Comm MPICommunicator\n-The type of the mpi communicator.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mpihelper.hh:192\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\bP_\bI_\bH_\be_\bl_\bp_\be_\br_\b:_\b:_\bg_\be_\bt_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bo_\br\n-static MPICommunicator getCommunicator()\n-get the default communicator\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mpihelper.hh:200\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\bP_\bI_\bH_\be_\bl_\bp_\be_\br_\b:_\b:_\bg_\be_\bt_\bL_\bo_\bc_\ba_\bl_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bo_\br\n-static MPICommunicator getLocalCommunicator()\n-get a local communicator\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mpihelper.hh:211\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\bP_\bI_\bH_\be_\bl_\bp_\be_\br_\b:_\b:_\bg_\be_\bt_\bC_\bo_\bl_\bl_\be_\bc_\bt_\bi_\bv_\be_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn\n-static Communication< MPICommunicator > getCollectiveCommunication()\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mpihelper.hh:223\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mpidata.hh:68\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\bP_\bI_\bD_\ba_\bt_\ba_\b:_\b:_\bs_\bt_\ba_\bt_\bi_\bc_\b__\bs_\bi_\bz_\be\n+static constexpr bool static_size\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mpidata.hh:66\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\bP_\bI_\bP_\ba_\bc_\bk\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mpipack.hh:36\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\bP_\bI_\bP_\ba_\bc_\bk_\b:_\b:_\be_\bn_\bl_\ba_\br_\bg_\be\n+void enlarge(int s)\n+Enlarges the internal buffer.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mpipack.hh:151\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\bP_\bI_\bP_\ba_\bc_\bk_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b>_\b>\n+friend MPIPack & operator>>(MPIPack &p, T &t)\n+Unpacks data from the object.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mpipack.hh:123\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\bP_\bI_\bP_\ba_\bc_\bk_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b<_\b<\n+friend MPIPack & operator<<(MPIPack &p, const T &t)\n+Packs the data into the object. Enlarges the internal buffer if necessary.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mpipack.hh:116\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\bP_\bI_\bP_\ba_\bc_\bk_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b!_\b=\n+friend bool operator!=(const MPIPack &a, const MPIPack &b)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mpipack.hh:193\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\bP_\bI_\bP_\ba_\bc_\bk_\b:_\b:_\bs_\bi_\bz_\be\n+size_t size() const\n+Returns the size of the internal buffer.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mpipack.hh:157\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\bP_\bI_\bP_\ba_\bc_\bk_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b=\n+MPIPack & operator=(const MPIPack &other)=delete\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\bP_\bI_\bP_\ba_\bc_\bk_\b:_\b:_\bM_\bP_\bI_\bP_\ba_\bc_\bk\n+MPIPack(Communication< MPI_Comm > comm, std::size_t size=0)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mpipack.hh:44\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\bP_\bI_\bP_\ba_\bc_\bk_\b:_\b:_\bp_\ba_\bc_\bk\n+void pack(const T &data)\n+Packs the data into the object. Enlarges the internal buffer if necessary.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mpipack.hh:62\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\bP_\bI_\bP_\ba_\bc_\bk_\b:_\b:_\bu_\bn_\bp_\ba_\bc_\bk\n+auto unpack(T &data) -> std::enable_if_t\n+Unpacks data from the object.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mpipack.hh:99\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\bP_\bI_\bP_\ba_\bc_\bk_\b:_\b:_\bu_\bn_\bp_\ba_\bc_\bk\n+auto unpack(T &data) -> std::enable_if_t< decltype(getMPIData(data))::\n+static_size, void >\n+Unpacks data from the object.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mpipack.hh:85\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\bP_\bI_\bP_\ba_\bc_\bk_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b=_\b=\n+friend bool operator==(const MPIPack &a, const MPIPack &b)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mpipack.hh:190\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\bP_\bI_\bP_\ba_\bc_\bk_\b:_\b:_\bM_\bP_\bI_\bP_\ba_\bc_\bk\n+MPIPack(const MPIPack &)=delete\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\bP_\bI_\bP_\ba_\bc_\bk_\b:_\b:_\bs_\be_\be_\bk\n+void seek(int p)\n+Sets the position in the buffer where the next pack/unpack operation should\n+take place.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mpipack.hh:164\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\bP_\bI_\bP_\ba_\bc_\bk_\b:_\b:_\be_\bo_\bf\n+bool eof() const\n+Checks whether the end of the buffer is reached.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mpipack.hh:177\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\bP_\bI_\bP_\ba_\bc_\bk_\b:_\b:_\br_\be_\bs_\bi_\bz_\be\n+void resize(size_t size)\n+Resizes the internal buffer.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mpipack.hh:145\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\bP_\bI_\bP_\ba_\bc_\bk_\b:_\b:_\bt_\be_\bl_\bl\n+int tell() const\n+Gets the position in the buffer where the next pack/unpack operation should\n+take place.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mpipack.hh:171\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\bP_\bI_\bP_\ba_\bc_\bk_\b:_\b:_\bM_\bP_\bI_\bP_\ba_\bc_\bk\n+MPIPack(MPIPack &&)=default\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\bP_\bI_\bP_\ba_\bc_\bk_\b:_\b:_\br_\be_\ba_\bd\n+MPIPack & read(T &t)\n+Unpacks data from the object.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mpipack.hh:130\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\bP_\bI_\bP_\ba_\bc_\bk_\b:_\b:_\bg_\be_\bt_\bP_\ba_\bc_\bk_\bS_\bi_\bz_\be\n+static int getPackSize(int len, const MPI_Comm &comm, const MPI_Datatype &dt)\n+Returns the size of the data needed to store the data in an MPIPack. See\n+MPI_Pack_size.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mpipack.hh:184\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\bP_\bI_\bP_\ba_\bc_\bk_\b:_\b:_\bw_\br_\bi_\bt_\be\n+MPIPack & write(const T &t)\n+Packs the data into the object. Enlarges the internal buffer if necessary.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mpipack.hh:137\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\bP_\bI_\bD_\ba_\bt_\ba_\b<_\b _\bP_\b,_\b _\bs_\bt_\bd_\b:_\b:_\be_\bn_\ba_\bb_\bl_\be_\b__\bi_\bf_\b__\bt_\b<_\b _\bs_\bt_\bd_\b:_\b:_\bi_\bs_\b__\bs_\ba_\bm_\be_\b<_\b _\bs_\bt_\bd_\b:_\b:_\br_\be_\bm_\bo_\bv_\be_\b__\bc_\bo_\bn_\bs_\bt_\b__\bt_\b<_\b _\bP_\b _\b>_\b,\n+_\bM_\bP_\bI_\bP_\ba_\bc_\bk_\b _\b>_\b:_\b:_\bv_\ba_\bl_\bu_\be_\b _\b>_\b _\b>_\b:_\b:_\bt_\by_\bp_\be\n+MPI_Datatype type() const\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mpipack.hh:217\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\bP_\bI_\bD_\ba_\bt_\ba_\b<_\b _\bP_\b,_\b _\bs_\bt_\bd_\b:_\b:_\be_\bn_\ba_\bb_\bl_\be_\b__\bi_\bf_\b__\bt_\b<_\b _\bs_\bt_\bd_\b:_\b:_\bi_\bs_\b__\bs_\ba_\bm_\be_\b<_\b _\bs_\bt_\bd_\b:_\b:_\br_\be_\bm_\bo_\bv_\be_\b__\bc_\bo_\bn_\bs_\bt_\b__\bt_\b<_\b _\bP_\b _\b>_\b,\n+_\bM_\bP_\bI_\bP_\ba_\bc_\bk_\b _\b>_\b:_\b:_\bv_\ba_\bl_\bu_\be_\b _\b>_\b _\b>_\b:_\b:_\bM_\bP_\bI_\bD_\ba_\bt_\ba\n+MPIData(P &t)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mpipack.hh:203\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\bP_\bI_\bD_\ba_\bt_\ba_\b<_\b _\bP_\b,_\b _\bs_\bt_\bd_\b:_\b:_\be_\bn_\ba_\bb_\bl_\be_\b__\bi_\bf_\b__\bt_\b<_\b _\bs_\bt_\bd_\b:_\b:_\bi_\bs_\b__\bs_\ba_\bm_\be_\b<_\b _\bs_\bt_\bd_\b:_\b:_\br_\be_\bm_\bo_\bv_\be_\b__\bc_\bo_\bn_\bs_\bt_\b__\bt_\b<_\b _\bP_\b _\b>_\b,\n+_\bM_\bP_\bI_\bP_\ba_\bc_\bk_\b _\b>_\b:_\b:_\bv_\ba_\bl_\bu_\be_\b _\b>_\b _\b>_\b:_\b:_\bs_\bi_\bz_\be\n+int size()\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mpipack.hh:213\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\bP_\bI_\bD_\ba_\bt_\ba_\b<_\b _\bP_\b,_\b _\bs_\bt_\bd_\b:_\b:_\be_\bn_\ba_\bb_\bl_\be_\b__\bi_\bf_\b__\bt_\b<_\b _\bs_\bt_\bd_\b:_\b:_\bi_\bs_\b__\bs_\ba_\bm_\be_\b<_\b _\bs_\bt_\bd_\b:_\b:_\br_\be_\bm_\bo_\bv_\be_\b__\bc_\bo_\bn_\bs_\bt_\b__\bt_\b<_\b _\bP_\b _\b>_\b,\n+_\bM_\bP_\bI_\bP_\ba_\bc_\bk_\b _\b>_\b:_\b:_\bv_\ba_\bl_\bu_\be_\b _\b>_\b _\b>_\b:_\b:_\bp_\bt_\br\n+void * ptr()\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mpipack.hh:209\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\bP_\bI_\bD_\ba_\bt_\ba_\b<_\b _\bP_\b,_\b _\bs_\bt_\bd_\b:_\b:_\be_\bn_\ba_\bb_\bl_\be_\b__\bi_\bf_\b__\bt_\b<_\b _\bs_\bt_\bd_\b:_\b:_\bi_\bs_\b__\bs_\ba_\bm_\be_\b<_\b _\bs_\bt_\bd_\b:_\b:_\br_\be_\bm_\bo_\bv_\be_\b__\bc_\bo_\bn_\bs_\bt_\b__\bt_\b<_\b _\bP_\b _\b>_\b,\n+_\bM_\bP_\bI_\bP_\ba_\bc_\bk_\b _\b>_\b:_\b:_\bv_\ba_\bl_\bu_\be_\b _\b>_\b _\b>_\b:_\b:_\bd_\ba_\bt_\ba_\b_\n+P & data_\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mpipack.hh:225\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\bP_\bI_\bD_\ba_\bt_\ba_\b<_\b _\bP_\b,_\b _\bs_\bt_\bd_\b:_\b:_\be_\bn_\ba_\bb_\bl_\be_\b__\bi_\bf_\b__\bt_\b<_\b _\bs_\bt_\bd_\b:_\b:_\bi_\bs_\b__\bs_\ba_\bm_\be_\b<_\b _\bs_\bt_\bd_\b:_\b:_\br_\be_\bm_\bo_\bv_\be_\b__\bc_\bo_\bn_\bs_\bt_\b__\bt_\b<_\b _\bP_\b _\b>_\b,\n+_\bM_\bP_\bI_\bP_\ba_\bc_\bk_\b _\b>_\b:_\b:_\bv_\ba_\bl_\bu_\be_\b _\b>_\b _\b>_\b:_\b:_\br_\be_\bs_\bi_\bz_\be\n+void resize(int size)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mpipack.hh:221\n ===============================================================================\n Generated by\u00a0_\b[_\bd_\bo_\bx_\by_\bg_\be_\bn_\b] 1.9.8\n"}]}, {"source1": "./usr/share/doc/libdune-common-doc/doxygen/a00044.html", "source2": "./usr/share/doc/libdune-common-doc/doxygen/a00044.html", "unified_diff": "@@ -1,15 +1,15 @@\n \n \n \n \n \n \n \n-dune-common: communicator.hh File Reference\n+dune-common: mpifuture.hh File Reference\n \n \n \n \n \n \n \n@@ -72,66 +72,50 @@\n

  • dune
  • common
  • parallel
  • \n
    \n
    \n
    \n \n- \n+
    mpifuture.hh File Reference
    \n
    \n
    \n-\n-

    Provides utility classes for syncing distributed data via MPI communication. \n-More...

    \n-
    #include <cassert>
    \n-#include <cstddef>
    \n-#include <iostream>
    \n-#include <map>
    \n+
    #include <functional>
    \n+#include <memory>
    \n+#include <optional>
    \n #include <type_traits>
    \n #include <utility>
    \n #include <mpi.h>
    \n-#include <dune/common/exceptions.hh>
    \n-#include <dune/common/parallel/interface.hh>
    \n-#include <dune/common/parallel/remoteindices.hh>
    \n-#include <dune/common/stdstreams.hh>
    \n+#include <dune/common/exceptions.hh>
    \n+#include <dune/common/parallel/communication.hh>
    \n+#include <dune/common/parallel/future.hh>
    \n+#include <dune/common/parallel/mpidata.hh>
    \n
    \n

    Go to the source code of this file.

    \n \n \n-\n-\n-\n-\n-\n-\n-\n-\n+\n \n-\n+\n \n-\n-\n+\n \n-\n-\n-\n-\n-\n+\n+\n \n

    \n Classes

    struct  Dune::SizeOne
     Flag for marking indexed data structures where data at each index is of the same size. More...
     
    struct  Dune::VariableSize
     Flag for marking indexed data structures where the data at each index may be a variable multiple of another type. More...
     
    struct  Dune::CommPolicy< V >
     Default policy used for communicating an indexed type. More...
    struct  Dune::impl::Buffer< T >
     
    struct  Dune::CommPolicy< V >::CommPolicy< VariableBlockVector< FieldVector< K, n >, A > >
    struct  Dune::impl::Buffer< T & >
     
    class  Dune::CommPolicy< V >::CommunicationError
     Error thrown if there was a problem with the communication. More...
    struct  Dune::impl::Buffer< void >
     
    struct  Dune::CommPolicy< V >::CopyGatherScatter< T >
     GatherScatter default implementation that just copies data. More...
     
    class  Dune::BufferedCommunicator
     A communicator that uses buffers to gather and scatter the data to be send or received. More...
    class  Dune::MPIFuture< R, S >
     Provides a future-like object for MPI communication. It contains the object that will be received and might contain also a sending object, which must be hold (keep alive) until the communication has been completed. More...
     
    \n \n \n \n \n+\n+\n

    \n Namespaces

    namespace  Dune
     Dune namespace.
     
    namespace  Dune::impl
     
    \n-

    Detailed Description

    \n-

    Provides utility classes for syncing distributed data via MPI communication.

    \n-
    Author
    Markus Blatt
    \n-
    \n+
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -2,58 +2,40 @@\n Loading...\n Searching...\n No Matches\n * _\bd_\bu_\bn_\be\n * _\bc_\bo_\bm_\bm_\bo_\bn\n * _\bp_\ba_\br_\ba_\bl_\bl_\be_\bl\n _\bC_\bl_\ba_\bs_\bs_\be_\bs | _\bN_\ba_\bm_\be_\bs_\bp_\ba_\bc_\be_\bs\n-communicator.hh File Reference\n-_\bC_\bo_\bm_\bm_\bo_\bn \u00bb _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\b _\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn \u00bb _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\b _\bC_\bo_\bm_\bp_\bu_\bt_\bi_\bn_\bg_\b _\bb_\ba_\bs_\be_\bd_\b _\bo_\bn_\b _\bI_\bn_\bd_\be_\bx_\bs_\be_\bt_\bs\n-Provides utility classes for syncing distributed data via MPI communication.\n-_\bM_\bo_\br_\be_\b._\b._\b.\n-#include \n-#include \n-#include \n-#include \n+mpifuture.hh File Reference\n+#include \n+#include \n+#include \n #include \n #include \n #include \n #include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\be_\bx_\bc_\be_\bp_\bt_\bi_\bo_\bn_\bs_\b._\bh_\bh>\n-#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bp_\ba_\br_\ba_\bl_\bl_\be_\bl_\b/_\bi_\bn_\bt_\be_\br_\bf_\ba_\bc_\be_\b._\bh_\bh>\n-#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bp_\ba_\br_\ba_\bl_\bl_\be_\bl_\b/_\br_\be_\bm_\bo_\bt_\be_\bi_\bn_\bd_\bi_\bc_\be_\bs_\b._\bh_\bh>\n-#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bs_\bt_\bd_\bs_\bt_\br_\be_\ba_\bm_\bs_\b._\bh_\bh>\n+#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bp_\ba_\br_\ba_\bl_\bl_\be_\bl_\b/_\bc_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b._\bh_\bh>\n+#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bp_\ba_\br_\ba_\bl_\bl_\be_\bl_\b/_\bf_\bu_\bt_\bu_\br_\be_\b._\bh_\bh>\n+#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bp_\ba_\br_\ba_\bl_\bl_\be_\bl_\b/_\bm_\bp_\bi_\bd_\ba_\bt_\ba_\b._\bh_\bh>\n _\bG_\bo_\b _\bt_\bo_\b _\bt_\bh_\be_\b _\bs_\bo_\bu_\br_\bc_\be_\b _\bc_\bo_\bd_\be_\b _\bo_\bf_\b _\bt_\bh_\bi_\bs_\b _\bf_\bi_\bl_\be_\b.\n C\bCl\bla\bas\bss\bse\bes\bs\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bS_\bi_\bz_\be_\bO_\bn_\be\n-\u00a0 Flag for marking indexed data structures where data at each index is\n- of the same size. _\bM_\bo_\br_\be_\b._\b._\b.\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bi_\bm_\bp_\bl_\b:_\b:_\bB_\bu_\bf_\bf_\be_\br_\b<_\b _\bT_\b _\b>\n \u00a0\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bV_\ba_\br_\bi_\ba_\bb_\bl_\be_\bS_\bi_\bz_\be\n-\u00a0 Flag for marking indexed data structures where the data at each index\n- may be a variable multiple of another type. _\bM_\bo_\br_\be_\b._\b._\b.\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bi_\bm_\bp_\bl_\b:_\b:_\bB_\bu_\bf_\bf_\be_\br_\b<_\b _\bT_\b _\b&_\b _\b>\n \u00a0\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bm_\bm_\bP_\bo_\bl_\bi_\bc_\by_\b<_\b _\bV_\b _\b>\n-\u00a0 Default policy used for communicating an indexed type. _\bM_\bo_\br_\be_\b._\b._\b.\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bi_\bm_\bp_\bl_\b:_\b:_\bB_\bu_\bf_\bf_\be_\br_\b<_\b _\bv_\bo_\bi_\bd_\b _\b>\n \u00a0\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bm_\bm_\bP_\bo_\bl_\bi_\bc_\by_\b<_\b _\bV_\b _\b>_\b:_\b:_\bC_\bo_\bm_\bm_\bP_\bo_\bl_\bi_\bc_\by_\b<_\b _\bV_\ba_\br_\bi_\ba_\bb_\bl_\be_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br_\b<_\b _\bF_\bi_\be_\bl_\bd_\bV_\be_\bc_\bt_\bo_\br_\b<\n- _\bK_\b,_\b _\bn_\b _\b>_\b,_\b _\bA_\b _\b>_\b _\b>\n-\u00a0\n- class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bm_\bm_\bP_\bo_\bl_\bi_\bc_\by_\b<_\b _\bV_\b _\b>_\b:_\b:_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\bE_\br_\br_\bo_\br\n-\u00a0 Error thrown if there was a problem with the communication. _\bM_\bo_\br_\be_\b._\b._\b.\n-\u00a0\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bm_\bm_\bP_\bo_\bl_\bi_\bc_\by_\b<_\b _\bV_\b _\b>_\b:_\b:_\bC_\bo_\bp_\by_\bG_\ba_\bt_\bh_\be_\br_\bS_\bc_\ba_\bt_\bt_\be_\br_\b<_\b _\bT_\b _\b>\n-\u00a0 GatherScatter default implementation that just copies data. _\bM_\bo_\br_\be_\b._\b._\b.\n-\u00a0\n- class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bB_\bu_\bf_\bf_\be_\br_\be_\bd_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bo_\br\n-\u00a0 A communicator that uses buffers to gather and scatter the data to be\n- send or received. _\bM_\bo_\br_\be_\b._\b._\b.\n+ class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bM_\bP_\bI_\bF_\bu_\bt_\bu_\br_\be_\b<_\b _\bR_\b,_\b _\bS_\b _\b>\n+ Provides a future-like object for MPI communication. It contains the\n+\u00a0 object that will be received and might contain also a sending object,\n+ which must be hold (keep alive) until the communication has been\n+ completed. _\bM_\bo_\br_\be_\b._\b._\b.\n \u00a0\n N\bNa\bam\bme\bes\bsp\bpa\bac\bce\bes\bs\n namespace \u00a0 _\bD_\bu_\bn_\be\n \u00a0 _\bD_\bu_\bn_\be namespace.\n \u00a0\n-*\b**\b**\b**\b**\b* D\bDe\bet\bta\bai\bil\ble\bed\bd D\bDe\bes\bsc\bcr\bri\bip\bpt\bti\bio\bon\bn *\b**\b**\b**\b**\b*\n-Provides utility classes for syncing distributed data via MPI communication.\n- Author\n- Markus Blatt\n+namespace \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bi_\bm_\bp_\bl\n+\u00a0\n ===============================================================================\n Generated by\u00a0_\b[_\bd_\bo_\bx_\by_\bg_\be_\bn_\b] 1.9.8\n"}]}, {"source1": "./usr/share/doc/libdune-common-doc/doxygen/a00044_source.html", "source2": "./usr/share/doc/libdune-common-doc/doxygen/a00044_source.html", "unified_diff": "@@ -1,15 +1,15 @@\n \n \n \n \n \n \n \n-dune-common: communicator.hh Source File\n+dune-common: mpifuture.hh Source File\n \n \n \n \n \n \n \n@@ -74,1036 +74,295 @@\n \n \n
    \n
    \n-
    communicator.hh
    \n+
    mpifuture.hh
    \n
    \n
    \n Go to the documentation of this file.
    1// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
    \n
    2// vi: set et ts=4 sw=2 sts=2:
    \n
    3// SPDX-FileCopyrightInfo: Copyright \u00a9 DUNE Project contributors, see file LICENSE.md in module root
    \n
    4// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception
    \n-
    5#ifndef DUNE_COMMON_PARALLEL_COMMUNICATOR_HH
    \n-
    6#define DUNE_COMMON_PARALLEL_COMMUNICATOR_HH
    \n+
    5#ifndef DUNE_COMMON_PARALLEL_MPIFUTURE_HH
    \n+
    6#define DUNE_COMMON_PARALLEL_MPIFUTURE_HH
    \n
    7
    \n
    8#if HAVE_MPI
    \n
    9
    \n-
    10#include <cassert>
    \n-
    11#include <cstddef>
    \n-
    12#include <iostream>
    \n-
    13#include <map>
    \n-
    14#include <type_traits>
    \n-
    15#include <utility>
    \n-
    16
    \n-
    17#include <mpi.h>
    \n-
    18
    \n-\n-\n-\n-\n-
    23
    \n-
    24namespace Dune
    \n-
    25{
    \n-
    \n-
    109 struct SizeOne
    \n-
    110 {};
    \n-
    \n-
    111
    \n-
    \n-\n-
    118 {};
    \n+
    10#include <functional>
    \n+
    11#include <memory>
    \n+
    12#include <optional>
    \n+
    13#include <type_traits>
    \n+
    14#include <utility>
    \n+
    15
    \n+
    16#include <mpi.h>
    \n+
    17
    \n+\n+\n+\n+\n+
    22
    \n+
    23namespace Dune{
    \n+
    24
    \n+
    \n+
    25 namespace impl{
    \n+
    26 template<class T>
    \n+
    \n+
    27 struct Buffer{
    \n+
    \n+
    28 Buffer(bool valid){
    \n+
    29 if(valid)
    \n+
    30 value = std::make_unique<T>();
    \n+
    31 }
    \n+
    \n+
    32 template<class V>
    \n+
    \n+
    33 Buffer(V&& t)
    \n+
    34 : value(std::make_unique<T>(std::forward<V>(t)))
    \n+
    35 {}
    \n+
    \n+
    36 std::unique_ptr<T> value;
    \n+
    \n+
    37 T get(){
    \n+
    38 T tmp = std::move(*value);
    \n+
    39 value.reset();
    \n+
    40 return tmp;
    \n+
    41 }
    \n+
    \n+
    \n+
    42 operator bool () const {
    \n+
    43 return (bool)value;
    \n+
    44 }
    \n+
    \n+
    \n+
    45 T& operator *() const{
    \n+
    46 return *value;
    \n+
    47 }
    \n+
    \n+
    48 };
    \n+
    \n+
    49
    \n+
    50 template<class T>
    \n+
    \n+
    51 struct Buffer<T&>{
    \n+
    \n+
    52 Buffer(bool valid = false)
    \n+
    53 {
    \n+
    54 if(valid)
    \n+
    55 value = T();
    \n+
    56 }
    \n+
    \n+
    57 template<class V>
    \n+
    \n+
    58 Buffer(V&& t)
    \n+
    59 : value(std::forward<V>(t))
    \n+
    60 {}
    \n+
    \n+
    61 std::optional<std::reference_wrapper<T>> value;
    \n+
    \n+
    62 T& get(){
    \n+
    63 T& tmp = *value;
    \n+
    64 value.reset();
    \n+
    65 return tmp;
    \n+
    66 }
    \n+
    \n+
    \n+
    67 operator bool () const{
    \n+
    68 return (bool)value;
    \n+
    69 }
    \n+
    \n+
    \n+
    70 T& operator *() const{
    \n+
    71 return *value;
    \n+
    72 }
    \n+
    \n+
    73 };
    \n+
    \n+
    74
    \n+
    75 template<>
    \n+
    \n+
    76 struct Buffer<void>{
    \n+
    77 bool valid_;
    \n+
    \n+
    78 Buffer(bool valid = false)
    \n+
    79 : valid_(valid)
    \n+
    80 {}
    \n+
    \n+
    \n+
    81 operator bool () const{
    \n+
    82 return valid_;
    \n+
    83 }
    \n+
    \n+
    84 void get(){}
    \n+
    85 };
    \n+
    \n+
    86 }
    \n+
    \n+
    87
    \n+
    92 template<class R, class S = void>
    \n+
    \n+
    93 class MPIFuture{
    \n+
    94 mutable MPI_Request req_;
    \n+
    95 mutable MPI_Status status_;
    \n+
    96 impl::Buffer<R> data_;
    \n+
    97 impl::Buffer<S> send_data_;
    \n+
    98 friend class Communication<MPI_Comm>;
    \n+
    99 public:
    \n+
    \n+
    100 MPIFuture(bool valid = false)
    \n+
    101 : req_(MPI_REQUEST_NULL)
    \n+
    102 , data_(valid)
    \n+
    103 {}
    \n+
    \n+
    104
    \n+
    105 // Hide this constructor if R or S is void
    \n+
    106 template<class V = R, class U = S>
    \n+
    \n+
    107 MPIFuture(V&& recv_data, U&& send_data, typename std::enable_if_t<!std::is_void<V>::value && !std::is_void<U>::value>* = 0) :
    \n+
    108 req_(MPI_REQUEST_NULL)
    \n+
    109 , data_(std::forward<R>(recv_data))
    \n+
    110 , send_data_(std::forward<S>(send_data))
    \n+
    111 {}
    \n+
    \n+
    112
    \n+
    113 // hide this constructor if R is void
    \n+
    114 template<class V = R>
    \n+
    \n+
    115 MPIFuture(V&& recv_data, typename std::enable_if_t<!std::is_void<V>::value>* = 0)
    \n+
    116 : req_(MPI_REQUEST_NULL)
    \n+
    117 , data_(std::forward<V>(recv_data))
    \n+
    118 {}
    \n
    \n
    119
    \n-
    120
    \n-
    126 template<class V>
    \n-
    \n-\n-
    128 {
    \n-
    140 typedef V Type;
    \n-
    141
    \n-
    147 typedef typename V::value_type IndexedType;
    \n-
    148
    \n-\n-
    154
    \n-
    163 static const void* getAddress(const V& v, int index);
    \n-
    164
    \n-
    170 static int getSize(const V&, int index);
    \n-
    171 };
    \n+
    \n+\n+
    121 if(req_ != MPI_REQUEST_NULL){
    \n+
    122 try{ // might fail when it is a collective communication
    \n+
    123 MPI_Cancel(&req_);
    \n+
    124 MPI_Request_free(&req_);
    \n+
    125 }catch(...){
    \n+
    126 }
    \n+
    127 }
    \n+
    128 }
    \n+
    \n+
    129
    \n+
    \n+\n+
    131 : req_(MPI_REQUEST_NULL)
    \n+
    132 , data_(std::move(f.data_))
    \n+
    133 , send_data_(std::move(f.send_data_))
    \n+
    134 {
    \n+
    135 std::swap(req_, f.req_);
    \n+
    136 std::swap(status_, f.status_);
    \n+
    137 }
    \n+
    \n+
    138
    \n+
    \n+\n+
    140 std::swap(req_, f.req_);
    \n+
    141 std::swap(status_, f.status_);
    \n+
    142 std::swap(data_, f.data_);
    \n+
    143 std::swap(send_data_, f.send_data_);
    \n+
    144 return *this;
    \n+
    145 }
    \n+
    \n+
    146
    \n+
    \n+
    147 bool valid() const{
    \n+
    148 return (bool)data_;
    \n+
    149 }
    \n+
    \n+
    150
    \n+
    \n+
    151 void wait(){
    \n+
    152 if(!valid())
    \n+
    153 DUNE_THROW(InvalidFutureException, "The MPIFuture is not valid!");
    \n+
    154 MPI_Wait(&req_, &status_);
    \n+
    155 }
    \n+
    \n+
    156
    \n+
    \n+
    157 bool ready() const{
    \n+
    158 int flag = -1;
    \n+
    159 MPI_Test(&req_, &flag, &status_);
    \n+
    160 return flag;
    \n+
    161 }
    \n+
    \n+
    162
    \n+
    \n+
    163 R get() {
    \n+
    164 wait();
    \n+
    165 return data_.get();
    \n+
    166 }
    \n+
    \n+
    167
    \n+
    \n+\n+
    169 wait();
    \n+
    170 return send_data_.get();
    \n+
    171 }
    \n+
    \n
    172
    \n-
    173 template<class K, int n> class FieldVector;
    \n-
    174
    \n-
    175 template<class B, class A> class VariableBlockVector;
    \n+
    \n+\n+
    174 return getMPIData(*data_);
    \n+
    175 }
    \n+
    \n
    176
    \n-
    177 template<class K, class A, int n>
    \n-
    \n-\n-
    179 {
    \n-\n+
    \n+\n+
    178 return getMPIData(*send_data_);
    \n+
    179 }
    \n+
    \n+
    180 };
    \n+
    \n
    181
    \n-
    182 typedef typename Type::B IndexedType;
    \n-
    183
    \n-\n-
    185
    \n-
    186 static const void* getAddress(const Type& v, int i);
    \n-
    187
    \n-
    188 static int getSize(const Type& v, int i);
    \n-
    189 };
    \n-
    \n-
    190
    \n-
    \n-\n-
    195 {};
    \n-
    \n-
    196
    \n-
    200 template<class T>
    \n-
    \n-\n-
    202 {
    \n-\n-
    204
    \n-
    205 static const IndexedType& gather(const T& vec, std::size_t i);
    \n-
    206
    \n-
    207 static void scatter(T& vec, const IndexedType& v, std::size_t i);
    \n-
    208
    \n-
    209 };
    \n-
    \n-
    210
    \n-
    222 template<typename T>
    \n-
    223 class DatatypeCommunicator : public InterfaceBuilder
    \n-
    224 {
    \n-
    225 public:
    \n-
    226
    \n-
    230 typedef T ParallelIndexSet;
    \n-
    231
    \n-\n-
    236
    \n-
    240 typedef typename RemoteIndices::GlobalIndex GlobalIndex;
    \n-
    241
    \n-
    245 typedef typename RemoteIndices::Attribute Attribute;
    \n-
    246
    \n-
    250 typedef typename RemoteIndices::LocalIndex LocalIndex;
    \n-
    251
    \n-
    255 DatatypeCommunicator();
    \n-
    256
    \n-
    260 ~DatatypeCommunicator();
    \n-
    261
    \n-
    288 template<class T1, class T2, class V>
    \n-
    289 void build(const RemoteIndices& remoteIndices, const T1& sourceFlags, V& sendData, const T2& destFlags, V& receiveData);
    \n-
    290
    \n-
    294 void forward();
    \n-
    295
    \n-
    299 void backward();
    \n-
    300
    \n-
    304 void free();
    \n-
    305 private:
    \n-
    309 constexpr static int commTag_ = 234;
    \n-
    310
    \n-
    314 const RemoteIndices* remoteIndices_;
    \n-
    315
    \n-
    316 typedef std::map<int,std::pair<MPI_Datatype,MPI_Datatype> >
    \n-
    317 MessageTypeMap;
    \n-
    318
    \n-
    322 MessageTypeMap messageTypes;
    \n-
    323
    \n-
    327 void* data_;
    \n-
    328
    \n-
    329 MPI_Request* requests_[2];
    \n-
    330
    \n-
    334 bool created_;
    \n-
    335
    \n-
    339 template<class V, bool FORWARD>
    \n-
    340 void createRequests(V& sendData, V& receiveData);
    \n-
    341
    \n-
    345 template<class T1, class T2, class V, bool send>
    \n-
    346 void createDataTypes(const T1& source, const T2& destination, V& data);
    \n-
    347
    \n-
    351 void sendRecv(MPI_Request* req);
    \n-
    352
    \n-
    356 struct IndexedTypeInformation
    \n-
    357 {
    \n-
    363 void build(int i)
    \n-
    364 {
    \n-
    365 length = new int[i];
    \n-
    366 displ = new MPI_Aint[i];
    \n-
    367 size = i;
    \n-
    368 }
    \n-
    369
    \n-
    373 void free()
    \n-
    374 {
    \n-
    375 delete[] length;
    \n-
    376 delete[] displ;
    \n-
    377 }
    \n-
    379 int* length;
    \n-
    381 MPI_Aint* displ;
    \n-
    387 int elements;
    \n-
    391 int size;
    \n-
    392 };
    \n-
    393
    \n-
    399 template<class V>
    \n-
    400 struct MPIDatatypeInformation
    \n-
    401 {
    \n-
    406 MPIDatatypeInformation(const V& data) : data_(data)
    \n-
    407 {}
    \n-
    408
    \n-
    414 void reserve(int proc, int size)
    \n-
    415 {
    \n-
    416 information_[proc].build(size);
    \n-
    417 }
    \n-
    424 void add(int proc, int local)
    \n-
    425 {
    \n-
    426 IndexedTypeInformation& info=information_[proc];
    \n-
    427 assert((info.elements)<info.size);
    \n-
    428 MPI_Get_address( const_cast<void*>(CommPolicy<V>::getAddress(data_, local)),
    \n-
    429 info.displ+info.elements);
    \n-
    430 info.length[info.elements]=CommPolicy<V>::getSize(data_, local);
    \n-
    431 info.elements++;
    \n-
    432 }
    \n-
    433
    \n-
    438 std::map<int,IndexedTypeInformation> information_;
    \n-
    442 const V& data_;
    \n-
    443
    \n-
    444 };
    \n-
    445
    \n-
    446 };
    \n-
    \n-
    447
    \n-
    \n-\n-
    458 {
    \n-
    459
    \n-
    460 public:
    \n-\n-
    465
    \n-
    472 template<class Data, class Interface>
    \n-
    473 typename std::enable_if<std::is_same<SizeOne,typename CommPolicy<Data>::IndexedTypeFlag>::value, void>::type
    \n-
    474 build(const Interface& interface);
    \n-
    475
    \n-
    483 template<class Data, class Interface>
    \n-
    484 void build(const Data& source, const Data& target, const Interface& interface);
    \n-
    485
    \n-
    514 template<class GatherScatter, class Data>
    \n-
    515 void forward(const Data& source, Data& dest);
    \n-
    516
    \n-
    545 template<class GatherScatter, class Data>
    \n-
    546 void backward(Data& source, const Data& dest);
    \n-
    547
    \n-
    573 template<class GatherScatter, class Data>
    \n-
    574 void forward(Data& data);
    \n-
    575
    \n-
    601 template<class GatherScatter, class Data>
    \n-
    602 void backward(Data& data);
    \n-
    603
    \n-
    607 void free();
    \n-
    608
    \n-\n-
    613
    \n-
    614 private:
    \n-
    615
    \n-
    619 typedef std::map<int,std::pair<InterfaceInformation,InterfaceInformation> >
    \n-
    620 InterfaceMap;
    \n-
    621
    \n-
    622
    \n-
    626 template<class Data, typename IndexedTypeFlag>
    \n-
    627 struct MessageSizeCalculator
    \n-
    628 {};
    \n-
    629
    \n-
    634 template<class Data>
    \n-
    635 struct MessageSizeCalculator<Data,SizeOne>
    \n-
    636 {
    \n-
    643 inline int operator()(const InterfaceInformation& info) const;
    \n-
    652 inline int operator()(const Data& data, const InterfaceInformation& info) const;
    \n-
    653 };
    \n-
    654
    \n-
    659 template<class Data>
    \n-
    660 struct MessageSizeCalculator<Data,VariableSize>
    \n-
    661 {
    \n-
    670 inline int operator()(const Data& data, const InterfaceInformation& info) const;
    \n-
    671 };
    \n-
    672
    \n-
    676 template<class Data, class GatherScatter, bool send, typename IndexedTypeFlag>
    \n-
    677 struct MessageGatherer
    \n-
    678 {};
    \n-
    679
    \n-
    684 template<class Data, class GatherScatter, bool send>
    \n-
    685 struct MessageGatherer<Data,GatherScatter,send,SizeOne>
    \n-
    686 {
    \n-
    688 typedef typename CommPolicy<Data>::IndexedType Type;
    \n-
    689
    \n-
    694 typedef GatherScatter Gatherer;
    \n-
    695
    \n-
    701 constexpr static bool forward = send;
    \n-
    702
    \n-
    710 inline void operator()(const InterfaceMap& interface, const Data& data, Type* buffer, size_t bufferSize) const;
    \n-
    711 };
    \n-
    712
    \n-
    717 template<class Data, class GatherScatter, bool send>
    \n-
    718 struct MessageGatherer<Data,GatherScatter,send,VariableSize>
    \n-
    719 {
    \n-
    721 typedef typename CommPolicy<Data>::IndexedType Type;
    \n-
    722
    \n-
    727 typedef GatherScatter Gatherer;
    \n-
    728
    \n-
    734 constexpr static bool forward = send;
    \n-
    735
    \n-
    743 inline void operator()(const InterfaceMap& interface, const Data& data, Type* buffer, size_t bufferSize) const;
    \n-
    744 };
    \n-
    745
    \n-
    749 template<class Data, class GatherScatter, bool send, typename IndexedTypeFlag>
    \n-
    750 struct MessageScatterer
    \n-
    751 {};
    \n-
    752
    \n-
    757 template<class Data, class GatherScatter, bool send>
    \n-
    758 struct MessageScatterer<Data,GatherScatter,send,SizeOne>
    \n-
    759 {
    \n-
    761 typedef typename CommPolicy<Data>::IndexedType Type;
    \n-
    762
    \n-
    767 typedef GatherScatter Scatterer;
    \n-
    768
    \n-
    774 constexpr static bool forward = send;
    \n-
    775
    \n-
    783 inline void operator()(const InterfaceMap& interface, Data& data, Type* buffer, const int& proc) const;
    \n-
    784 };
    \n-
    789 template<class Data, class GatherScatter, bool send>
    \n-
    790 struct MessageScatterer<Data,GatherScatter,send,VariableSize>
    \n-
    791 {
    \n-
    793 typedef typename CommPolicy<Data>::IndexedType Type;
    \n-
    794
    \n-
    799 typedef GatherScatter Scatterer;
    \n-
    800
    \n-
    806 constexpr static bool forward = send;
    \n-
    807
    \n-
    815 inline void operator()(const InterfaceMap& interface, Data& data, Type* buffer, const int& proc) const;
    \n-
    816 };
    \n-
    817
    \n-
    821 struct MessageInformation
    \n-
    822 {
    \n-
    824 MessageInformation()
    \n-
    825 : start_(0), size_(0)
    \n-
    826 {}
    \n-
    827
    \n-
    835 MessageInformation(size_t start, size_t size)
    \n-
    836 : start_(start), size_(size)
    \n-
    837 {}
    \n-
    841 size_t start_;
    \n-
    845 size_t size_;
    \n-
    846 };
    \n-
    847
    \n-
    854 typedef std::map<int,std::pair<MessageInformation,MessageInformation> >
    \n-
    855 InformationMap;
    \n-
    859 InformationMap messageInformation_;
    \n-
    863 char* buffers_[2];
    \n-
    867 size_t bufferSize_[2];
    \n-
    868
    \n-
    872 constexpr static int commTag_ = 0;
    \n-
    873
    \n-
    877 std::map<int,std::pair<InterfaceInformation,InterfaceInformation> > interfaces_;
    \n-
    878
    \n-
    879 MPI_Comm communicator_;
    \n-
    880
    \n-
    884 template<class GatherScatter, bool FORWARD, class Data>
    \n-
    885 void sendRecv(const Data& source, Data& target);
    \n-
    886
    \n-
    887 };
    \n-
    \n-
    888
    \n-
    889#ifndef DOXYGEN
    \n-
    890
    \n-
    891 template<class V>
    \n-
    892 inline const void* CommPolicy<V>::getAddress(const V& v, int index)
    \n-
    893 {
    \n-
    894 return &(v[index]);
    \n-
    895 }
    \n-
    896
    \n-
    897 template<class V>
    \n-
    898 inline int CommPolicy<V>::getSize([[maybe_unused]] const V& v, [[maybe_unused]] int index)
    \n-
    899 {
    \n-
    900 return 1;
    \n-
    901 }
    \n-
    902
    \n-
    903 template<class K, class A, int n>
    \n-
    904 inline const void* CommPolicy<VariableBlockVector<FieldVector<K, n>, A> >::getAddress(const Type& v, int index)
    \n-
    905 {
    \n-
    906 return &(v[index][0]);
    \n-
    907 }
    \n-
    908
    \n-
    909 template<class K, class A, int n>
    \n-
    910 inline int CommPolicy<VariableBlockVector<FieldVector<K, n>, A> >::getSize(const Type& v, int index)
    \n-
    911 {
    \n-
    912 return v[index].getsize();
    \n-
    913 }
    \n-
    914
    \n-
    915 template<class T>
    \n-
    916 inline const typename CopyGatherScatter<T>::IndexedType& CopyGatherScatter<T>::gather(const T & vec, std::size_t i)
    \n-
    917 {
    \n-
    918 return vec[i];
    \n-
    919 }
    \n-
    920
    \n-
    921 template<class T>
    \n-
    922 inline void CopyGatherScatter<T>::scatter(T& vec, const IndexedType& v, std::size_t i)
    \n-
    923 {
    \n-
    924 vec[i]=v;
    \n-
    925 }
    \n-
    926
    \n-
    927 template<typename T>
    \n-
    928 DatatypeCommunicator<T>::DatatypeCommunicator()
    \n-
    929 : remoteIndices_(0), created_(false)
    \n-
    930 {
    \n-
    931 requests_[0]=0;
    \n-
    932 requests_[1]=0;
    \n-
    933 }
    \n-
    934
    \n-
    935
    \n-
    936
    \n-
    937 template<typename T>
    \n-
    938 DatatypeCommunicator<T>::~DatatypeCommunicator()
    \n-
    939 {
    \n-
    940 free();
    \n-
    941 }
    \n-
    942
    \n-
    943 template<typename T>
    \n-
    944 template<class T1, class T2, class V>
    \n-
    945 inline void DatatypeCommunicator<T>::build(const RemoteIndices& remoteIndices,
    \n-
    946 const T1& source, V& sendData,
    \n-
    947 const T2& destination, V& receiveData)
    \n-
    948 {
    \n-
    949 remoteIndices_ = &remoteIndices;
    \n-
    950 free();
    \n-
    951 createDataTypes<T1,T2,V,false>(source,destination, receiveData);
    \n-
    952 createDataTypes<T1,T2,V,true>(source,destination, sendData);
    \n-
    953 createRequests<V,true>(sendData, receiveData);
    \n-
    954 createRequests<V,false>(receiveData, sendData);
    \n-
    955 created_=true;
    \n-
    956 }
    \n-
    957
    \n-
    958 template<typename T>
    \n-
    959 void DatatypeCommunicator<T>::free()
    \n-
    960 {
    \n-
    961 if(created_) {
    \n-
    962 delete[] requests_[0];
    \n-
    963 delete[] requests_[1];
    \n-
    964 typedef MessageTypeMap::iterator iterator;
    \n-
    965 typedef MessageTypeMap::const_iterator const_iterator;
    \n-
    966
    \n-
    967 const const_iterator end=messageTypes.end();
    \n-
    968
    \n-
    969 for(iterator process = messageTypes.begin(); process != end; ++process) {
    \n-
    970 MPI_Datatype *type = &(process->second.first);
    \n-
    971 int finalized=0;
    \n-
    972 MPI_Finalized(&finalized);
    \n-
    973 if(*type!=MPI_DATATYPE_NULL && !finalized)
    \n-
    974 MPI_Type_free(type);
    \n-
    975 type = &(process->second.second);
    \n-
    976 if(*type!=MPI_DATATYPE_NULL && !finalized)
    \n-
    977 MPI_Type_free(type);
    \n-
    978 }
    \n-
    979 messageTypes.clear();
    \n-
    980 created_=false;
    \n-
    981 }
    \n-
    982
    \n-
    983 }
    \n-
    984
    \n-
    985 template<typename T>
    \n-
    986 template<class T1, class T2, class V, bool send>
    \n-
    987 void DatatypeCommunicator<T>::createDataTypes(const T1& sourceFlags, const T2& destFlags, V& data)
    \n-
    988 {
    \n-
    989
    \n-
    990 MPIDatatypeInformation<V> dataInfo(data);
    \n-
    991 this->template buildInterface<RemoteIndices,T1,T2,MPIDatatypeInformation<V>,send>(*remoteIndices_,sourceFlags, destFlags, dataInfo);
    \n-
    992
    \n-
    993 typedef typename RemoteIndices::RemoteIndexMap::const_iterator const_iterator;
    \n-
    994 const const_iterator end=this->remoteIndices_->end();
    \n-
    995
    \n-
    996 // Allocate MPI_Datatypes and deallocate memory for the type construction.
    \n-
    997 for(const_iterator process=this->remoteIndices_->begin(); process != end; ++process) {
    \n-
    998 IndexedTypeInformation& info=dataInfo.information_[process->first];
    \n-
    999 // Shift the displacement
    \n-
    1000 MPI_Aint base;
    \n-
    1001 MPI_Get_address(const_cast<void *>(CommPolicy<V>::getAddress(data, 0)), &base);
    \n-
    1002
    \n-
    1003 for(int i=0; i< info.elements; i++) {
    \n-
    1004 info.displ[i]-=base;
    \n-
    1005 }
    \n-
    1006
    \n-
    1007 // Create data type
    \n-
    1008 MPI_Datatype* type = &( send ? messageTypes[process->first].first : messageTypes[process->first].second);
    \n-
    1009 MPI_Type_create_hindexed(info.elements, info.length, info.displ,
    \n-
    1010 MPITraits<typename CommPolicy<V>::IndexedType>::getType(), type);
    \n-
    1011 MPI_Type_commit(type);
    \n-
    1012 // Deallocate memory
    \n-
    1013 info.free();
    \n-
    1014 }
    \n-
    1015 }
    \n-
    1016
    \n-
    1017 template<typename T>
    \n-
    1018 template<class V, bool createForward>
    \n-
    1019 void DatatypeCommunicator<T>::createRequests(V& sendData, V& receiveData)
    \n-
    1020 {
    \n-
    1021 typedef std::map<int,std::pair<MPI_Datatype,MPI_Datatype> >::const_iterator MapIterator;
    \n-
    1022 int rank;
    \n-
    1023 static int index = createForward ? 1 : 0;
    \n-
    1024 int noMessages = messageTypes.size();
    \n-
    1025 // allocate request handles
    \n-
    1026 requests_[index] = new MPI_Request[2*noMessages];
    \n-
    1027 const MapIterator end = messageTypes.end();
    \n-
    1028 int request=0;
    \n-
    1029 MPI_Comm_rank(MPI_COMM_WORLD, &rank);
    \n-
    1030
    \n-
    1031 // Set up the requests for receiving first
    \n-
    1032 for(MapIterator process = messageTypes.begin(); process != end;
    \n-
    1033 ++process, ++request) {
    \n-
    1034 MPI_Datatype type = createForward ? process->second.second : process->second.first;
    \n-
    1035 void* address = const_cast<void*>(CommPolicy<V>::getAddress(receiveData,0));
    \n-
    1036 MPI_Recv_init(address, 1, type, process->first, commTag_, this->remoteIndices_->communicator(), requests_[index]+request);
    \n-
    1037 }
    \n-
    1038
    \n-
    1039 // And now the send requests
    \n-
    1040
    \n-
    1041 for(MapIterator process = messageTypes.begin(); process != end;
    \n-
    1042 ++process, ++request) {
    \n-
    1043 MPI_Datatype type = createForward ? process->second.first : process->second.second;
    \n-
    1044 void* address = const_cast<void*>(CommPolicy<V>::getAddress(sendData, 0));
    \n-
    1045 MPI_Ssend_init(address, 1, type, process->first, commTag_, this->remoteIndices_->communicator(), requests_[index]+request);
    \n-
    1046 }
    \n-
    1047 }
    \n-
    1048
    \n-
    1049 template<typename T>
    \n-
    1050 void DatatypeCommunicator<T>::forward()
    \n-
    1051 {
    \n-
    1052 sendRecv(requests_[1]);
    \n-
    1053 }
    \n-
    1054
    \n-
    1055 template<typename T>
    \n-
    1056 void DatatypeCommunicator<T>::backward()
    \n-
    1057 {
    \n-
    1058 sendRecv(requests_[0]);
    \n-
    1059 }
    \n-
    1060
    \n-
    1061 template<typename T>
    \n-
    1062 void DatatypeCommunicator<T>::sendRecv(MPI_Request* requests)
    \n-
    1063 {
    \n-
    1064 int noMessages = messageTypes.size();
    \n-
    1065 // Start the receive calls first
    \n-
    1066 MPI_Startall(noMessages, requests);
    \n-
    1067 // Now the send calls
    \n-
    1068 MPI_Startall(noMessages, requests+noMessages);
    \n-
    1069
    \n-
    1070 // Wait for completion of the communication send first then receive
    \n-
    1071 MPI_Status* status=new MPI_Status[2*noMessages];
    \n-
    1072 for(int i=0; i<2*noMessages; i++)
    \n-
    1073 status[i].MPI_ERROR=MPI_SUCCESS;
    \n-
    1074
    \n-
    1075 int send = MPI_Waitall(noMessages, requests+noMessages, status+noMessages);
    \n-
    1076 int receive = MPI_Waitall(noMessages, requests, status);
    \n-
    1077
    \n-
    1078 // Error checks
    \n-
    1079 int success=1, globalSuccess=0;
    \n-
    1080 if(send==MPI_ERR_IN_STATUS) {
    \n-
    1081 int rank;
    \n-
    1082 MPI_Comm_rank(this->remoteIndices_->communicator(), &rank);
    \n-
    1083 std::cerr<<rank<<": Error in sending :"<<std::endl;
    \n-
    1084 // Search for the error
    \n-
    1085 for(int i=noMessages; i< 2*noMessages; i++)
    \n-
    1086 if(status[i].MPI_ERROR!=MPI_SUCCESS) {
    \n-
    1087 char message[300];
    \n-
    1088 int messageLength;
    \n-
    1089 MPI_Error_string(status[i].MPI_ERROR, message, &messageLength);
    \n-
    1090 std::cerr<<" source="<<status[i].MPI_SOURCE<<" message: ";
    \n-
    1091 for(int j = 0; j < messageLength; j++)
    \n-
    1092 std::cout << message[j];
    \n-
    1093 }
    \n-
    1094 std::cerr<<std::endl;
    \n-
    1095 success=0;
    \n-
    1096 }
    \n-
    1097
    \n-
    1098 if(receive==MPI_ERR_IN_STATUS) {
    \n-
    1099 int rank;
    \n-
    1100 MPI_Comm_rank(this->remoteIndices_->communicator(), &rank);
    \n-
    1101 std::cerr<<rank<<": Error in receiving!"<<std::endl;
    \n-
    1102 // Search for the error
    \n-
    1103 for(int i=0; i< noMessages; i++)
    \n-
    1104 if(status[i].MPI_ERROR!=MPI_SUCCESS) {
    \n-
    1105 char message[300];
    \n-
    1106 int messageLength;
    \n-
    1107 MPI_Error_string(status[i].MPI_ERROR, message, &messageLength);
    \n-
    1108 std::cerr<<" source="<<status[i].MPI_SOURCE<<" message: ";
    \n-
    1109 for(int j = 0; j < messageLength; j++)
    \n-
    1110 std::cerr << message[j];
    \n-
    1111 }
    \n-
    1112 std::cerr<<std::endl;
    \n-
    1113 success=0;
    \n-
    1114 }
    \n-
    1115
    \n-
    1116 MPI_Allreduce(&success, &globalSuccess, 1, MPI_INT, MPI_MIN, this->remoteIndices_->communicator());
    \n-
    1117
    \n-
    1118 delete[] status;
    \n-
    1119
    \n-
    1120 if(!globalSuccess)
    \n-
    1121 DUNE_THROW(CommunicationError, "A communication error occurred!");
    \n-
    1122
    \n-
    1123 }
    \n-
    1124
    \n-\n-
    1126 {
    \n-
    1127 buffers_[0]=0;
    \n-
    1128 buffers_[1]=0;
    \n-
    1129 bufferSize_[0]=0;
    \n-
    1130 bufferSize_[1]=0;
    \n-
    1131 }
    \n-
    1132
    \n-
    1133 template<class Data, class Interface>
    \n-
    1134 typename std::enable_if<std::is_same<SizeOne, typename CommPolicy<Data>::IndexedTypeFlag>::value, void>::type
    \n-
    1135 BufferedCommunicator::build(const Interface& interface)
    \n-
    1136 {
    \n-
    1137 interfaces_=interface.interfaces();
    \n-
    1138 communicator_=interface.communicator();
    \n-
    1139 typedef typename std::map<int,std::pair<InterfaceInformation,InterfaceInformation> >
    \n-
    1140 ::const_iterator const_iterator;
    \n-
    1141 typedef typename CommPolicy<Data>::IndexedTypeFlag Flag;
    \n-
    1142 const const_iterator end = interfaces_.end();
    \n-
    1143 int lrank;
    \n-
    1144 MPI_Comm_rank(communicator_, &lrank);
    \n-
    1145
    \n-
    1146 bufferSize_[0]=0;
    \n-
    1147 bufferSize_[1]=0;
    \n-
    1148
    \n-
    1149 for(const_iterator interfacePair = interfaces_.begin();
    \n-
    1150 interfacePair != end; ++interfacePair) {
    \n-
    1151 int noSend = MessageSizeCalculator<Data,Flag>() (interfacePair->second.first);
    \n-
    1152 int noRecv = MessageSizeCalculator<Data,Flag>() (interfacePair->second.second);
    \n-
    1153 if (noSend + noRecv > 0)
    \n-
    1154 messageInformation_.insert(std::make_pair(interfacePair->first,
    \n-
    1155 std::make_pair(MessageInformation(bufferSize_[0],
    \n-
    1156 noSend*sizeof(typename CommPolicy<Data>::IndexedType)),
    \n-
    1157 MessageInformation(bufferSize_[1],
    \n-
    1158 noRecv*sizeof(typename CommPolicy<Data>::IndexedType)))));
    \n-
    1159 bufferSize_[0] += noSend;
    \n-
    1160 bufferSize_[1] += noRecv;
    \n-
    1161 }
    \n-
    1162
    \n-
    1163 // allocate the buffers
    \n-
    1164 bufferSize_[0] *= sizeof(typename CommPolicy<Data>::IndexedType);
    \n-
    1165 bufferSize_[1] *= sizeof(typename CommPolicy<Data>::IndexedType);
    \n-
    1166
    \n-
    1167 buffers_[0] = new char[bufferSize_[0]];
    \n-
    1168 buffers_[1] = new char[bufferSize_[1]];
    \n-
    1169 }
    \n-
    1170
    \n-
    1171 template<class Data, class Interface>
    \n-
    1172 void BufferedCommunicator::build(const Data& source, const Data& dest, const Interface& interface)
    \n-
    1173 {
    \n-
    1174
    \n-
    1175 interfaces_=interface.interfaces();
    \n-
    1176 communicator_=interface.communicator();
    \n-
    1177 typedef typename std::map<int,std::pair<InterfaceInformation,InterfaceInformation> >
    \n-
    1178 ::const_iterator const_iterator;
    \n-
    1179 typedef typename CommPolicy<Data>::IndexedTypeFlag Flag;
    \n-
    1180 const const_iterator end = interfaces_.end();
    \n-
    1181
    \n-
    1182 bufferSize_[0]=0;
    \n-
    1183 bufferSize_[1]=0;
    \n-
    1184
    \n-
    1185 for(const_iterator interfacePair = interfaces_.begin();
    \n-
    1186 interfacePair != end; ++interfacePair) {
    \n-
    1187 int noSend = MessageSizeCalculator<Data,Flag>() (source, interfacePair->second.first);
    \n-
    1188 int noRecv = MessageSizeCalculator<Data,Flag>() (dest, interfacePair->second.second);
    \n-
    1189 if (noSend + noRecv > 0)
    \n-
    1190 messageInformation_.insert(std::make_pair(interfacePair->first,
    \n-
    1191 std::make_pair(MessageInformation(bufferSize_[0],
    \n-
    1192 noSend*sizeof(typename CommPolicy<Data>::IndexedType)),
    \n-
    1193 MessageInformation(bufferSize_[1],
    \n-
    1194 noRecv*sizeof(typename CommPolicy<Data>::IndexedType)))));
    \n-
    1195 bufferSize_[0] += noSend;
    \n-
    1196 bufferSize_[1] += noRecv;
    \n-
    1197 }
    \n-
    1198
    \n-
    1199 bufferSize_[0] *= sizeof(typename CommPolicy<Data>::IndexedType);
    \n-
    1200 bufferSize_[1] *= sizeof(typename CommPolicy<Data>::IndexedType);
    \n-
    1201 // allocate the buffers
    \n-
    1202 buffers_[0] = new char[bufferSize_[0]];
    \n-
    1203 buffers_[1] = new char[bufferSize_[1]];
    \n-
    1204 }
    \n-
    1205
    \n-
    1206 inline void BufferedCommunicator::free()
    \n-
    1207 {
    \n-
    1208 messageInformation_.clear();
    \n-
    1209 if(buffers_[0])
    \n-
    1210 delete[] buffers_[0];
    \n-
    1211
    \n-
    1212 if(buffers_[1])
    \n-
    1213 delete[] buffers_[1];
    \n-
    1214 buffers_[0]=buffers_[1]=0;
    \n-
    1215 }
    \n-
    1216
    \n-\n-
    1218 {
    \n-
    1219 free();
    \n-
    1220 }
    \n-
    1221
    \n-
    1222 template<class Data>
    \n-
    1223 inline int BufferedCommunicator::MessageSizeCalculator<Data,SizeOne>::operator()
    \n-
    1224 (const InterfaceInformation& info) const
    \n-
    1225 {
    \n-
    1226 return info.size();
    \n-
    1227 }
    \n-
    1228
    \n-
    1229
    \n-
    1230 template<class Data>
    \n-
    1231 inline int BufferedCommunicator::MessageSizeCalculator<Data,SizeOne>::operator()
    \n-
    1232 (const Data&, const InterfaceInformation& info) const
    \n-
    1233 {
    \n-
    1234 return operator()(info);
    \n-
    1235 }
    \n-
    1236
    \n-
    1237
    \n-
    1238 template<class Data>
    \n-
    1239 inline int BufferedCommunicator::MessageSizeCalculator<Data, VariableSize>::operator()
    \n-
    1240 (const Data& data, const InterfaceInformation& info) const
    \n-
    1241 {
    \n-
    1242 int entries=0;
    \n-
    1243
    \n-
    1244 for(size_t i=0; i < info.size(); i++)
    \n-
    1245 entries += CommPolicy<Data>::getSize(data,info[i]);
    \n-
    1246
    \n-
    1247 return entries;
    \n-
    1248 }
    \n-
    1249
    \n-
    1250
    \n-
    1251 template<class Data, class GatherScatter, bool FORWARD>
    \n-
    1252 inline void BufferedCommunicator::MessageGatherer<Data,GatherScatter,FORWARD,VariableSize>::operator()(const InterfaceMap& interfaces,const Data& data, Type* buffer, [[maybe_unused]] size_t bufferSize) const
    \n-
    1253 {
    \n-
    1254 typedef typename InterfaceMap::const_iterator
    \n-
    1255 const_iterator;
    \n-
    1256
    \n-
    1257 int rank;
    \n-
    1258 MPI_Comm_rank(MPI_COMM_WORLD, &rank);
    \n-
    1259 const const_iterator end = interfaces.end();
    \n-
    1260 size_t index=0;
    \n-
    1261
    \n-
    1262 for(const_iterator interfacePair = interfaces.begin();
    \n-
    1263 interfacePair != end; ++interfacePair) {
    \n-
    1264 int size = forward ? interfacePair->second.first.size() :
    \n-
    1265 interfacePair->second.second.size();
    \n-
    1266
    \n-
    1267 for(int i=0; i < size; i++) {
    \n-
    1268 int local = forward ? interfacePair->second.first[i] :
    \n-
    1269 interfacePair->second.second[i];
    \n-
    1270 for(std::size_t j=0; j < CommPolicy<Data>::getSize(data, local); j++, index++) {
    \n-
    1271
    \n-
    1272#ifdef DUNE_ISTL_WITH_CHECKING
    \n-
    1273 assert(bufferSize>=(index+1)*sizeof(typename CommPolicy<Data>::IndexedType));
    \n-
    1274#endif
    \n-
    1275 buffer[index]=GatherScatter::gather(data, local, j);
    \n-
    1276 }
    \n-
    1277
    \n-
    1278 }
    \n-
    1279 }
    \n-
    1280
    \n-
    1281 }
    \n-
    1282
    \n-
    1283
    \n-
    1284 template<class Data, class GatherScatter, bool FORWARD>
    \n-
    1285 inline void BufferedCommunicator::MessageGatherer<Data,GatherScatter,FORWARD,SizeOne>::operator()(
    \n-
    1286 const InterfaceMap& interfaces, const Data& data, Type* buffer, [[maybe_unused]] size_t bufferSize) const
    \n-
    1287 {
    \n-
    1288 typedef typename InterfaceMap::const_iterator
    \n-
    1289 const_iterator;
    \n-
    1290 const const_iterator end = interfaces.end();
    \n-
    1291 size_t index = 0;
    \n-
    1292
    \n-
    1293 int rank;
    \n-
    1294 MPI_Comm_rank(MPI_COMM_WORLD, &rank);
    \n-
    1295
    \n-
    1296 for(const_iterator interfacePair = interfaces.begin();
    \n-
    1297 interfacePair != end; ++interfacePair) {
    \n-
    1298 size_t size = FORWARD ? interfacePair->second.first.size() :
    \n-
    1299 interfacePair->second.second.size();
    \n-
    1300
    \n-
    1301 for(size_t i=0; i < size; i++) {
    \n-
    1302
    \n-
    1303#ifdef DUNE_ISTL_WITH_CHECKING
    \n-
    1304 assert(bufferSize>=(index+1)*sizeof(typename CommPolicy<Data>::IndexedType));
    \n-
    1305#endif
    \n-
    1306
    \n-
    1307 buffer[index++] = GatherScatter::gather(data, FORWARD ? interfacePair->second.first[i] :
    \n-
    1308 interfacePair->second.second[i]);
    \n-
    1309 }
    \n-
    1310 }
    \n-
    1311
    \n-
    1312 }
    \n-
    1313
    \n-
    1314
    \n-
    1315 template<class Data, class GatherScatter, bool FORWARD>
    \n-
    1316 inline void BufferedCommunicator::MessageScatterer<Data,GatherScatter,FORWARD,VariableSize>::operator()(const InterfaceMap& interfaces, Data& data, Type* buffer, const int& proc) const
    \n-
    1317 {
    \n-
    1318 typedef typename InterfaceMap::value_type::second_type::first_type Information;
    \n-
    1319 const typename InterfaceMap::const_iterator infoPair = interfaces.find(proc);
    \n-
    1320
    \n-
    1321 assert(infoPair!=interfaces.end());
    \n-
    1322
    \n-
    1323 const Information& info = FORWARD ? infoPair->second.second :
    \n-
    1324 infoPair->second.first;
    \n-
    1325
    \n-
    1326 for(size_t i=0, index=0; i < info.size(); i++) {
    \n-
    1327 for(size_t j=0; j < CommPolicy<Data>::getSize(data, info[i]); j++)
    \n-
    1328 GatherScatter::scatter(data, buffer[index++], info[i], j);
    \n-
    1329 }
    \n-
    1330 }
    \n-
    1331
    \n-
    1332
    \n-
    1333 template<class Data, class GatherScatter, bool FORWARD>
    \n-
    1334 inline void BufferedCommunicator::MessageScatterer<Data,GatherScatter,FORWARD,SizeOne>::operator()(const InterfaceMap& interfaces, Data& data, Type* buffer, const int& proc) const
    \n-
    1335 {
    \n-
    1336 typedef typename InterfaceMap::value_type::second_type::first_type Information;
    \n-
    1337 const typename InterfaceMap::const_iterator infoPair = interfaces.find(proc);
    \n-
    1338
    \n-
    1339 assert(infoPair!=interfaces.end());
    \n-
    1340
    \n-
    1341 const Information& info = FORWARD ? infoPair->second.second :
    \n-
    1342 infoPair->second.first;
    \n-
    1343
    \n-
    1344 for(size_t i=0; i < info.size(); i++) {
    \n-
    1345 GatherScatter::scatter(data, buffer[i], info[i]);
    \n-
    1346 }
    \n-
    1347 }
    \n-
    1348
    \n-
    1349
    \n-
    1350 template<class GatherScatter,class Data>
    \n-
    1351 void BufferedCommunicator::forward(Data& data)
    \n-
    1352 {
    \n-
    1353 this->template sendRecv<GatherScatter,true>(data, data);
    \n-
    1354 }
    \n-
    1355
    \n-
    1356
    \n-
    1357 template<class GatherScatter, class Data>
    \n-
    1358 void BufferedCommunicator::backward(Data& data)
    \n-
    1359 {
    \n-
    1360 this->template sendRecv<GatherScatter,false>(data, data);
    \n-
    1361 }
    \n-
    1362
    \n-
    1363
    \n-
    1364 template<class GatherScatter, class Data>
    \n-
    1365 void BufferedCommunicator::forward(const Data& source, Data& dest)
    \n-
    1366 {
    \n-
    1367 this->template sendRecv<GatherScatter,true>(source, dest);
    \n-
    1368 }
    \n-
    1369
    \n-
    1370
    \n-
    1371 template<class GatherScatter, class Data>
    \n-
    1372 void BufferedCommunicator::backward(Data& source, const Data& dest)
    \n-
    1373 {
    \n-
    1374 this->template sendRecv<GatherScatter,false>(dest, source);
    \n-
    1375 }
    \n-
    1376
    \n-
    1377
    \n-
    1378 template<class GatherScatter, bool FORWARD, class Data>
    \n-
    1379 void BufferedCommunicator::sendRecv(const Data& source, Data& dest)
    \n-
    1380 {
    \n-
    1381 int rank, lrank;
    \n-
    1382
    \n-
    1383 MPI_Comm_rank(MPI_COMM_WORLD,&rank);
    \n-
    1384 MPI_Comm_rank(MPI_COMM_WORLD,&lrank);
    \n-
    1385
    \n-
    1386 typedef typename CommPolicy<Data>::IndexedType Type;
    \n-
    1387 Type *sendBuffer, *recvBuffer;
    \n-
    1388 size_t sendBufferSize;
    \n-
    1389#ifndef NDEBUG
    \n-
    1390 size_t recvBufferSize;
    \n-
    1391#endif
    \n-
    1392
    \n-
    1393 if(FORWARD) {
    \n-
    1394 sendBuffer = reinterpret_cast<Type*>(buffers_[0]);
    \n-
    1395 sendBufferSize = bufferSize_[0];
    \n-
    1396 recvBuffer = reinterpret_cast<Type*>(buffers_[1]);
    \n-
    1397#ifndef NDEBUG
    \n-
    1398 recvBufferSize = bufferSize_[1];
    \n-
    1399#endif
    \n-
    1400 }else{
    \n-
    1401 sendBuffer = reinterpret_cast<Type*>(buffers_[1]);
    \n-
    1402 sendBufferSize = bufferSize_[1];
    \n-
    1403 recvBuffer = reinterpret_cast<Type*>(buffers_[0]);
    \n-
    1404#ifndef NDEBUG
    \n-
    1405 recvBufferSize = bufferSize_[0];
    \n-
    1406#endif
    \n-
    1407 }
    \n-
    1408 typedef typename CommPolicy<Data>::IndexedTypeFlag Flag;
    \n-
    1409
    \n-
    1410 MessageGatherer<Data,GatherScatter,FORWARD,Flag>() (interfaces_, source, sendBuffer, sendBufferSize);
    \n-
    1411
    \n-
    1412 MPI_Request* sendRequests = new MPI_Request[messageInformation_.size()];
    \n-
    1413 MPI_Request* recvRequests = new MPI_Request[messageInformation_.size()];
    \n-
    1414 /* Number of recvRequests that are not MPI_REQUEST_NULL */
    \n-
    1415 size_t numberOfRealRecvRequests = 0;
    \n-
    1416
    \n-
    1417 // Setup receive first
    \n-
    1418 typedef typename InformationMap::const_iterator const_iterator;
    \n-
    1419
    \n-
    1420 const const_iterator end = messageInformation_.end();
    \n-
    1421 size_t i=0;
    \n-
    1422 int* processMap = new int[messageInformation_.size()];
    \n-
    1423
    \n-
    1424 for(const_iterator info = messageInformation_.begin(); info != end; ++info, ++i) {
    \n-
    1425 processMap[i]=info->first;
    \n-
    1426 if(FORWARD) {
    \n-
    1427 assert(info->second.second.start_*sizeof(typename CommPolicy<Data>::IndexedType)+info->second.second.size_ <= recvBufferSize );
    \n-
    1428 Dune::dvverb<<rank<<": receiving "<<info->second.second.size_<<" from "<<info->first<<std::endl;
    \n-
    1429 if(info->second.second.size_) {
    \n-
    1430 MPI_Irecv(recvBuffer+info->second.second.start_, info->second.second.size_,
    \n-
    1431 MPI_BYTE, info->first, commTag_, communicator_,
    \n-
    1432 recvRequests+i);
    \n-
    1433 numberOfRealRecvRequests += 1;
    \n-
    1434 } else {
    \n-
    1435 // Nothing to receive -> set request to inactive
    \n-
    1436 recvRequests[i]=MPI_REQUEST_NULL;
    \n-
    1437 }
    \n-
    1438 }else{
    \n-
    1439 assert(info->second.first.start_*sizeof(typename CommPolicy<Data>::IndexedType)+info->second.first.size_ <= recvBufferSize );
    \n-
    1440 Dune::dvverb<<rank<<": receiving "<<info->second.first.size_<<" to "<<info->first<<std::endl;
    \n-
    1441 if(info->second.first.size_) {
    \n-
    1442 MPI_Irecv(recvBuffer+info->second.first.start_, info->second.first.size_,
    \n-
    1443 MPI_BYTE, info->first, commTag_, communicator_,
    \n-
    1444 recvRequests+i);
    \n-
    1445 numberOfRealRecvRequests += 1;
    \n-
    1446 } else {
    \n-
    1447 // Nothing to receive -> set request to inactive
    \n-
    1448 recvRequests[i]=MPI_REQUEST_NULL;
    \n-
    1449 }
    \n-
    1450 }
    \n-
    1451 }
    \n-
    1452
    \n-
    1453 // now the send requests
    \n-
    1454 i=0;
    \n-
    1455 for(const_iterator info = messageInformation_.begin(); info != end; ++info, ++i)
    \n-
    1456 if(FORWARD) {
    \n-
    1457 assert(info->second.second.start_*sizeof(typename CommPolicy<Data>::IndexedType)+info->second.second.size_ <= recvBufferSize );
    \n-
    1458 Dune::dvverb<<rank<<": sending "<<info->second.first.size_<<" to "<<info->first<<std::endl;
    \n-
    1459 assert(info->second.first.start_*sizeof(typename CommPolicy<Data>::IndexedType)+info->second.first.size_ <= sendBufferSize );
    \n-
    1460 if(info->second.first.size_)
    \n-
    1461 MPI_Issend(sendBuffer+info->second.first.start_, info->second.first.size_,
    \n-
    1462 MPI_BYTE, info->first, commTag_, communicator_,
    \n-
    1463 sendRequests+i);
    \n-
    1464 else
    \n-
    1465 // Nothing to send -> set request to inactive
    \n-
    1466 sendRequests[i]=MPI_REQUEST_NULL;
    \n-
    1467 }else{
    \n-
    1468 assert(info->second.second.start_*sizeof(typename CommPolicy<Data>::IndexedType)+info->second.second.size_ <= sendBufferSize );
    \n-
    1469 Dune::dvverb<<rank<<": sending "<<info->second.second.size_<<" to "<<info->first<<std::endl;
    \n-
    1470 if(info->second.second.size_)
    \n-
    1471 MPI_Issend(sendBuffer+info->second.second.start_, info->second.second.size_,
    \n-
    1472 MPI_BYTE, info->first, commTag_, communicator_,
    \n-
    1473 sendRequests+i);
    \n-
    1474 else
    \n-
    1475 // Nothing to send -> set request to inactive
    \n-
    1476 sendRequests[i]=MPI_REQUEST_NULL;
    \n-
    1477 }
    \n-
    1478
    \n-
    1479 // Wait for completion of receive and immediately start scatter
    \n-
    1480 i=0;
    \n-
    1481 //int success = 1;
    \n-
    1482 int finished = MPI_UNDEFINED;
    \n-
    1483 MPI_Status status; //[messageInformation_.size()];
    \n-
    1484 //MPI_Waitall(messageInformation_.size(), recvRequests, status);
    \n-
    1485
    \n-
    1486 for(i=0; i< numberOfRealRecvRequests; i++) {
    \n-
    1487 status.MPI_ERROR=MPI_SUCCESS;
    \n-
    1488 MPI_Waitany(messageInformation_.size(), recvRequests, &finished, &status);
    \n-
    1489 assert(finished != MPI_UNDEFINED);
    \n-
    1490
    \n-
    1491 if(status.MPI_ERROR==MPI_SUCCESS) {
    \n-
    1492 int& proc = processMap[finished];
    \n-
    1493 typename InformationMap::const_iterator infoIter = messageInformation_.find(proc);
    \n-
    1494 assert(infoIter != messageInformation_.end());
    \n-
    1495
    \n-
    1496 MessageInformation info = (FORWARD) ? infoIter->second.second : infoIter->second.first;
    \n-
    1497 assert(info.start_+info.size_ <= recvBufferSize);
    \n-
    1498
    \n-
    1499 MessageScatterer<Data,GatherScatter,FORWARD,Flag>() (interfaces_, dest, recvBuffer+info.start_, proc);
    \n-
    1500 }else{
    \n-
    1501 std::cerr<<rank<<": MPI_Error occurred while receiving message from "<<processMap[finished]<<std::endl;
    \n-
    1502 //success=0;
    \n-
    1503 }
    \n-
    1504 }
    \n-
    1505
    \n-
    1506 MPI_Status recvStatus;
    \n-
    1507
    \n-
    1508 // Wait for completion of sends
    \n-
    1509 for(i=0; i< messageInformation_.size(); i++)
    \n-
    1510 if(MPI_SUCCESS!=MPI_Wait(sendRequests+i, &recvStatus)) {
    \n-
    1511 std::cerr<<rank<<": MPI_Error occurred while sending message to "<<processMap[finished]<<std::endl;
    \n-
    1512 //success=0;
    \n-
    1513 }
    \n-
    1514 /*
    \n-
    1515 int globalSuccess;
    \n-
    1516 MPI_Allreduce(&success, &globalSuccess, 1, MPI_INT, MPI_MIN, interface_->communicator());
    \n-
    1517
    \n-
    1518 if(!globalSuccess)
    \n-
    1519 DUNE_THROW(CommunicationError, "A communication error occurred!");
    \n-
    1520 */
    \n-
    1521 delete[] processMap;
    \n-
    1522 delete[] sendRequests;
    \n-
    1523 delete[] recvRequests;
    \n-
    1524
    \n-
    1525 }
    \n-
    1526
    \n-
    1527#endif // DOXYGEN
    \n-
    1528
    \n-
    1530}
    \n-
    1531
    \n-
    1532#endif // HAVE_MPI
    \n-
    1533#endif // DUNE_COMMON_PARALLEL_COMMUNICATOR_HH
    \n-
    Classes describing a distributed indexset.
    \n-
    Standard Dune debug streams.
    \n-
    A few common exception classes.
    \n+
    182}
    \n+
    183#endif // HAVE_MPI
    \n+
    184#endif // DUNE_COMMON_PARALLEL_MPIFUTURE_HH
    \n+
    Implements an utility class that provides collective communication methods for sequential programs.
    \n+
    Interface class to translate objects to a MPI_Datatype, void* and size used for MPI calls.
    \n+\n+
    A few common exception classes.
    \n+
    bigunsignedint< k > operator*(const bigunsignedint< k > &x, std::uintmax_t y)
    Definition bigunsignedint.hh:549
    \n
    #define DUNE_THROW(E, m)
    Definition exceptions.hh:218
    \n-
    DVVerbType dvverb(std::cout)
    stream for very verbose output.
    Definition stdstreams.hh:96
    \n+
    STL namespace.
    \n
    Dune namespace.
    Definition alignedallocator.hh:13
    \n-
    constexpr std::integral_constant< std::size_t, sizeof...(II)> size(std::integer_sequence< T, II... >)
    Return the size of the sequence.
    Definition integersequence.hh:75
    \n-
    Default exception class for I/O errors.
    Definition exceptions.hh:231
    \n-
    Flag for marking indexed data structures where data at each index is of the same size.
    Definition communicator.hh:110
    \n-
    Flag for marking indexed data structures where the data at each index may be a variable multiple of a...
    Definition communicator.hh:118
    \n-
    Default policy used for communicating an indexed type.
    Definition communicator.hh:128
    \n-
    V::value_type IndexedType
    The type we get at each index with operator[].
    Definition communicator.hh:147
    \n-
    static int getSize(const V &, int index)
    Get the number of primitive elements at that index.
    \n-
    SizeOne IndexedTypeFlag
    Whether the indexed type has variable size or there is always one value at each index.
    Definition communicator.hh:153
    \n-
    static const void * getAddress(const V &v, int index)
    Get the address of entry at an index.
    \n-
    V Type
    The type the policy is for.
    Definition communicator.hh:140
    \n-
    Definition communicator.hh:173
    \n-
    Definition communicator.hh:175
    \n-\n-\n-
    VariableBlockVector< FieldVector< K, n >, A > Type
    Definition communicator.hh:180
    \n-\n-\n-
    Error thrown if there was a problem with the communication.
    Definition communicator.hh:195
    \n-
    GatherScatter default implementation that just copies data.
    Definition communicator.hh:202
    \n-
    static void scatter(T &vec, const IndexedType &v, std::size_t i)
    \n-
    CommPolicy< T >::IndexedType IndexedType
    Definition communicator.hh:203
    \n-
    static const IndexedType & gather(const T &vec, std::size_t i)
    \n-
    A communicator that uses buffers to gather and scatter the data to be send or received.
    Definition communicator.hh:458
    \n-
    void backward(Data &data)
    Backward send where target and source are the same.
    \n-
    BufferedCommunicator()
    Constructor.
    \n-
    ~BufferedCommunicator()
    Destructor.
    \n-
    void forward(const Data &source, Data &dest)
    Send from source to target.
    \n-
    void free()
    Free the allocated memory (i.e. buffers and message information.
    \n-
    std::enable_if< std::is_same< SizeOne, typenameCommPolicy< Data >::IndexedTypeFlag >::value, void >::type build(const Interface &interface)
    Build the buffers and information for the communication process.
    \n-
    void backward(Data &source, const Data &dest)
    Communicate in the reverse direction, i.e. send from target to source.
    \n-
    void build(const Data &source, const Data &target, const Interface &interface)
    Build the buffers and information for the communication process.
    \n-
    void forward(Data &data)
    Forward send where target and source are the same.
    \n-
    Manager class for the mapping between local indices and globally unique indices.
    Definition indexset.hh:218
    \n-
    Base class of all classes representing a communication interface.
    Definition parallel/interface.hh:44
    \n-
    Information describing an interface.
    Definition parallel/interface.hh:110
    \n-
    Communication interface between remote and local indices.
    Definition parallel/interface.hh:218
    \n-
    An index present on the local process.
    Definition localindex.hh:35
    \n-
    The indices present on remote processes.
    Definition remoteindices.hh:190
    \n-
    ParallelIndexSet::GlobalIndex GlobalIndex
    The type of the global index.
    Definition remoteindices.hh:216
    \n-
    LocalIndex::Attribute Attribute
    The type of the attribute.
    Definition remoteindices.hh:227
    \n-
    ParallelIndexSet::LocalIndex LocalIndex
    The type of the local index.
    Definition remoteindices.hh:222
    \n-
    Provides classes for building the communication interface between remote indices.
    \n+
    auto getMPIData(T &t)
    Definition mpidata.hh:44
    \n+
    Collective communication interface and sequential default implementation.
    Definition communication.hh:100
    \n+
    This exception is thrown when ready(), wait() or get() is called on an invalid future....
    Definition future.hh:20
    \n+
    Definition mpifuture.hh:27
    \n+
    std::unique_ptr< T > value
    Definition mpifuture.hh:36
    \n+
    T & operator*() const
    Definition mpifuture.hh:45
    \n+
    Buffer(V &&t)
    Definition mpifuture.hh:33
    \n+
    T get()
    Definition mpifuture.hh:37
    \n+
    Buffer(bool valid)
    Definition mpifuture.hh:28
    \n+
    std::optional< std::reference_wrapper< T > > value
    Definition mpifuture.hh:61
    \n+
    Buffer(bool valid=false)
    Definition mpifuture.hh:52
    \n+
    T & get()
    Definition mpifuture.hh:62
    \n+
    Buffer(V &&t)
    Definition mpifuture.hh:58
    \n+
    bool valid_
    Definition mpifuture.hh:77
    \n+
    void get()
    Definition mpifuture.hh:84
    \n+
    Buffer(bool valid=false)
    Definition mpifuture.hh:78
    \n+
    Provides a future-like object for MPI communication. It contains the object that will be received and...
    Definition mpifuture.hh:93
    \n+
    MPIFuture(V &&recv_data, typename std::enable_if_t<!std::is_void< V >::value > *=0)
    Definition mpifuture.hh:115
    \n+
    bool ready() const
    Definition mpifuture.hh:157
    \n+
    bool valid() const
    Definition mpifuture.hh:147
    \n+
    ~MPIFuture()
    Definition mpifuture.hh:120
    \n+
    MPIFuture(bool valid=false)
    Definition mpifuture.hh:100
    \n+
    MPIFuture & operator=(MPIFuture &&f)
    Definition mpifuture.hh:139
    \n+
    auto get_send_mpidata()
    Definition mpifuture.hh:177
    \n+
    void wait()
    Definition mpifuture.hh:151
    \n+
    auto get_mpidata()
    Definition mpifuture.hh:173
    \n+
    R get()
    Definition mpifuture.hh:163
    \n+
    MPIFuture(V &&recv_data, U &&send_data, typename std::enable_if_t<!std::is_void< V >::value &&!std::is_void< U >::value > *=0)
    Definition mpifuture.hh:107
    \n+
    S get_send_data()
    Definition mpifuture.hh:168
    \n+
    MPIFuture(MPIFuture &&f)
    Definition mpifuture.hh:130
    \n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,1206 +1,307 @@\n dune-common\u00a02.10\n Loading...\n Searching...\n No Matches\n * _\bd_\bu_\bn_\be\n * _\bc_\bo_\bm_\bm_\bo_\bn\n * _\bp_\ba_\br_\ba_\bl_\bl_\be_\bl\n-communicator.hh\n+mpifuture.hh\n _\bG_\bo_\b _\bt_\bo_\b _\bt_\bh_\be_\b _\bd_\bo_\bc_\bu_\bm_\be_\bn_\bt_\ba_\bt_\bi_\bo_\bn_\b _\bo_\bf_\b _\bt_\bh_\bi_\bs_\b _\bf_\bi_\bl_\be_\b.\n 1// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-\n 2// vi: set et ts=4 sw=2 sts=2:\n 3// SPDX-FileCopyrightInfo: Copyright \u00c2\u00a9 DUNE Project contributors, see file\n LICENSE.md in module root\n 4// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception\n-5#ifndef DUNE_COMMON_PARALLEL_COMMUNICATOR_HH\n-6#define DUNE_COMMON_PARALLEL_COMMUNICATOR_HH\n+5#ifndef DUNE_COMMON_PARALLEL_MPIFUTURE_HH\n+6#define DUNE_COMMON_PARALLEL_MPIFUTURE_HH\n 7\n 8#if HAVE_MPI\n 9\n-10#include \n-11#include \n-12#include \n-13#include \n-14#include \n-15#include \n-16\n-17#include \n-18\n-19#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\be_\bx_\bc_\be_\bp_\bt_\bi_\bo_\bn_\bs_\b._\bh_\bh>\n-20#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bp_\ba_\br_\ba_\bl_\bl_\be_\bl_\b/_\bi_\bn_\bt_\be_\br_\bf_\ba_\bc_\be_\b._\bh_\bh>\n-21#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bp_\ba_\br_\ba_\bl_\bl_\be_\bl_\b/_\br_\be_\bm_\bo_\bt_\be_\bi_\bn_\bd_\bi_\bc_\be_\bs_\b._\bh_\bh>\n-22#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bs_\bt_\bd_\bs_\bt_\br_\be_\ba_\bm_\bs_\b._\bh_\bh>\n-23\n-24namespace _\bD_\bu_\bn_\be\n-25{\n-_\b1_\b0_\b9 struct _\bS_\bi_\bz_\be_\bO_\bn_\be\n-110 {};\n-111\n-_\b1_\b1_\b7 struct _\bV_\ba_\br_\bi_\ba_\bb_\bl_\be_\bS_\bi_\bz_\be\n-118 {};\n+10#include \n+11#include \n+12#include \n+13#include \n+14#include \n+15\n+16#include \n+17\n+18#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\be_\bx_\bc_\be_\bp_\bt_\bi_\bo_\bn_\bs_\b._\bh_\bh>\n+19#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bp_\ba_\br_\ba_\bl_\bl_\be_\bl_\b/_\bc_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b._\bh_\bh>\n+20#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bp_\ba_\br_\ba_\bl_\bl_\be_\bl_\b/_\bf_\bu_\bt_\bu_\br_\be_\b._\bh_\bh>\n+21#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bp_\ba_\br_\ba_\bl_\bl_\be_\bl_\b/_\bm_\bp_\bi_\bd_\ba_\bt_\ba_\b._\bh_\bh>\n+22\n+23namespace _\bD_\bu_\bn_\be{\n+24\n+_\b2_\b5 namespace impl{\n+26 template\n+_\b2_\b7 struct _\bB_\bu_\bf_\bf_\be_\br{\n+_\b2_\b8 _\bB_\bu_\bf_\bf_\be_\br(bool valid){\n+29 if(valid)\n+30 _\bv_\ba_\bl_\bu_\be = std::make_unique();\n+31 }\n+32 template\n+_\b3_\b3 _\bB_\bu_\bf_\bf_\be_\br(V&& t)\n+34 : _\bv_\ba_\bl_\bu_\be(_\bs_\bt_\bd::make_unique(_\bs_\bt_\bd::forward(t)))\n+35 {}\n+_\b3_\b6 std::unique_ptr _\bv_\ba_\bl_\bu_\be;\n+_\b3_\b7 T _\bg_\be_\bt(){\n+38 T tmp = std::move(*_\bv_\ba_\bl_\bu_\be);\n+39 _\bv_\ba_\bl_\bu_\be.reset();\n+40 return tmp;\n+41 }\n+_\b4_\b2 operator bool () const {\n+43 return (bool)_\bv_\ba_\bl_\bu_\be;\n+44 }\n+_\b4_\b5 T& _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b _\b*() const{\n+46 return *_\bv_\ba_\bl_\bu_\be;\n+47 }\n+48 };\n+49\n+50 template\n+_\b5_\b1 struct _\bB_\bu_\bf_\bf_\be_\br{\n+_\b5_\b2 _\bB_\bu_\bf_\bf_\be_\br(bool valid = false)\n+53 {\n+54 if(valid)\n+55 value = T();\n+56 }\n+57 template\n+_\b5_\b8 _\bB_\bu_\bf_\bf_\be_\br(V&& t)\n+59 : value(_\bs_\bt_\bd::forward(t))\n+60 {}\n+_\b6_\b1 std::optional> _\bv_\ba_\bl_\bu_\be;\n+_\b6_\b2 T& _\bg_\be_\bt(){\n+63 T& tmp = *value;\n+64 value.reset();\n+65 return tmp;\n+66 }\n+_\b6_\b7 operator bool () const{\n+68 return (bool)value;\n+69 }\n+_\b7_\b0 T& _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b _\b*() const{\n+71 return *value;\n+72 }\n+73 };\n+74\n+75 template<>\n+_\b7_\b6 struct _\bB_\bu_\bf_\bf_\be_\br{\n+_\b7_\b7 bool _\bv_\ba_\bl_\bi_\bd_\b_;\n+_\b7_\b8 _\bB_\bu_\bf_\bf_\be_\br(bool valid = false)\n+79 : valid_(valid)\n+80 {}\n+_\b8_\b1 operator bool () const{\n+82 return valid_;\n+83 }\n+_\b8_\b4 void _\bg_\be_\bt(){}\n+85 };\n+86 }\n+87\n+92 template\n+_\b9_\b3 class _\bM_\bP_\bI_\bF_\bu_\bt_\bu_\br_\be{\n+94 mutable MPI_Request req_;\n+95 mutable MPI_Status status_;\n+96 _\bi_\bm_\bp_\bl_\b:_\b:_\bB_\bu_\bf_\bf_\be_\br_\b<_\bR_\b> data_;\n+_\b9_\b7 _\bi_\bm_\bp_\bl_\b:_\b:_\bB_\bu_\bf_\bf_\be_\br_\b<_\bS_\b> send_data_;\n+98 friend class _\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn;\n+99 public:\n+_\b1_\b0_\b0 _\bM_\bP_\bI_\bF_\bu_\bt_\bu_\br_\be(bool _\bv_\ba_\bl_\bi_\bd = false)\n+101 : req_(MPI_REQUEST_NULL)\n+102 , data_(_\bv_\ba_\bl_\bi_\bd)\n+103 {}\n+104\n+105 // Hide this constructor if R or S is void\n+106 template\n+_\b1_\b0_\b7 _\bM_\bP_\bI_\bF_\bu_\bt_\bu_\br_\be(V&& recv_data, U&& send_data, typename std::enable_if_t::value && !std::is_void::value>* = 0) :\n+108 req_(MPI_REQUEST_NULL)\n+109 , data_(_\bs_\bt_\bd::forward(recv_data))\n+110 , send_data_(_\bs_\bt_\bd::forward(send_data))\n+111 {}\n+112\n+113 // hide this constructor if R is void\n+114 template\n+_\b1_\b1_\b5 _\bM_\bP_\bI_\bF_\bu_\bt_\bu_\br_\be(V&& recv_data, typename std::enable_if_t::\n+value>* = 0)\n+116 : req_(MPI_REQUEST_NULL)\n+117 , data_(_\bs_\bt_\bd::forward(recv_data))\n+118 {}\n 119\n-120\n-126 template\n-_\b1_\b2_\b7 struct _\bC_\bo_\bm_\bm_\bP_\bo_\bl_\bi_\bc_\by\n-128 {\n-_\b1_\b4_\b0 typedef V _\bT_\by_\bp_\be;\n-141\n-_\b1_\b4_\b7 typedef typename V::value_type _\bI_\bn_\bd_\be_\bx_\be_\bd_\bT_\by_\bp_\be;\n-148\n-_\b1_\b5_\b3 typedef _\bS_\bi_\bz_\be_\bO_\bn_\be _\bI_\bn_\bd_\be_\bx_\be_\bd_\bT_\by_\bp_\be_\bF_\bl_\ba_\bg;\n-154\n-_\b1_\b6_\b3 static const void* _\bg_\be_\bt_\bA_\bd_\bd_\br_\be_\bs_\bs(const V& v, int index);\n-164\n-_\b1_\b7_\b0 static int _\bg_\be_\bt_\bS_\bi_\bz_\be(const V&, int index);\n-171 };\n+_\b1_\b2_\b0 _\b~_\bM_\bP_\bI_\bF_\bu_\bt_\bu_\br_\be() {\n+121 if(req_ != MPI_REQUEST_NULL){\n+122 try{ // might fail when it is a collective communication\n+123 MPI_Cancel(&req_);\n+124 MPI_Request_free(&req_);\n+125 }catch(...){\n+126 }\n+127 }\n+128 }\n+129\n+_\b1_\b3_\b0 _\bM_\bP_\bI_\bF_\bu_\bt_\bu_\br_\be(_\bM_\bP_\bI_\bF_\bu_\bt_\bu_\br_\be&& f)\n+131 : req_(MPI_REQUEST_NULL)\n+132 , data_(_\bs_\bt_\bd::move(f.data_))\n+133 , send_data_(_\bs_\bt_\bd::move(f.send_data_))\n+134 {\n+135 std::swap(req_, f.req_);\n+136 std::swap(status_, f.status_);\n+137 }\n+138\n+_\b1_\b3_\b9 _\bM_\bP_\bI_\bF_\bu_\bt_\bu_\br_\be& _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b=(_\bM_\bP_\bI_\bF_\bu_\bt_\bu_\br_\be&& f){\n+140 std::swap(req_, f.req_);\n+141 std::swap(status_, f.status_);\n+142 std::swap(data_, f.data_);\n+143 std::swap(send_data_, f.send_data_);\n+144 return *this;\n+145 }\n+146\n+_\b1_\b4_\b7 bool _\bv_\ba_\bl_\bi_\bd() const{\n+148 return (bool)data_;\n+149 }\n+150\n+_\b1_\b5_\b1 void _\bw_\ba_\bi_\bt(){\n+152 if(!_\bv_\ba_\bl_\bi_\bd())\n+153 _\bD_\bU_\bN_\bE_\b__\bT_\bH_\bR_\bO_\bW(_\bI_\bn_\bv_\ba_\bl_\bi_\bd_\bF_\bu_\bt_\bu_\br_\be_\bE_\bx_\bc_\be_\bp_\bt_\bi_\bo_\bn, \"The MPIFuture is not valid!\");\n+154 MPI_Wait(&req_, &status_);\n+155 }\n+156\n+_\b1_\b5_\b7 bool _\br_\be_\ba_\bd_\by() const{\n+158 int flag = -1;\n+159 MPI_Test(&req_, &flag, &status_);\n+160 return flag;\n+161 }\n+162\n+_\b1_\b6_\b3 R _\bg_\be_\bt() {\n+164 _\bw_\ba_\bi_\bt();\n+165 return data_.get();\n+166 }\n+167\n+_\b1_\b6_\b8 S _\bg_\be_\bt_\b__\bs_\be_\bn_\bd_\b__\bd_\ba_\bt_\ba(){\n+169 _\bw_\ba_\bi_\bt();\n+170 return send_data_._\bg_\be_\bt();\n+171 }\n 172\n-_\b1_\b7_\b3 template class _\bF_\bi_\be_\bl_\bd_\bV_\be_\bc_\bt_\bo_\br;\n-174\n-_\b1_\b7_\b5 template class _\bV_\ba_\br_\bi_\ba_\bb_\bl_\be_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br;\n+_\b1_\b7_\b3 auto _\bg_\be_\bt_\b__\bm_\bp_\bi_\bd_\ba_\bt_\ba(){\n+174 return _\bg_\be_\bt_\bM_\bP_\bI_\bD_\ba_\bt_\ba(*data_);\n+175 }\n 176\n-177 template\n-_\b1_\b7_\b8 struct _\bC_\bo_\bm_\bm_\bP_\bo_\bl_\bi_\bc_\by<_\bV_\ba_\br_\bi_\ba_\bb_\bl_\be_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br<_\bF_\bi_\be_\bl_\bd_\bV_\be_\bc_\bt_\bo_\br, A> >\n-179 {\n-_\b1_\b8_\b0 typedef _\bV_\ba_\br_\bi_\ba_\bb_\bl_\be_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br_\b<_\bF_\bi_\be_\bl_\bd_\bV_\be_\bc_\bt_\bo_\br_\b<_\bK_\b,_\b _\bn_\b>, A> _\bT_\by_\bp_\be;\n+_\b1_\b7_\b7 auto _\bg_\be_\bt_\b__\bs_\be_\bn_\bd_\b__\bm_\bp_\bi_\bd_\ba_\bt_\ba(){\n+178 return _\bg_\be_\bt_\bM_\bP_\bI_\bD_\ba_\bt_\ba(*send_data_);\n+179 }\n+180 };\n 181\n-_\b1_\b8_\b2 typedef typename Type::B _\bI_\bn_\bd_\be_\bx_\be_\bd_\bT_\by_\bp_\be;\n-183\n-_\b1_\b8_\b4 typedef _\bV_\ba_\br_\bi_\ba_\bb_\bl_\be_\bS_\bi_\bz_\be _\bI_\bn_\bd_\be_\bx_\be_\bd_\bT_\by_\bp_\be_\bF_\bl_\ba_\bg;\n-185\n-_\b1_\b8_\b6 static const void* _\bg_\be_\bt_\bA_\bd_\bd_\br_\be_\bs_\bs(const _\bT_\by_\bp_\be& v, int i);\n-187\n-_\b1_\b8_\b8 static int _\bg_\be_\bt_\bS_\bi_\bz_\be(const _\bT_\by_\bp_\be& v, int i);\n-189 };\n-190\n-_\b1_\b9_\b4 class _\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\bE_\br_\br_\bo_\br : public _\bI_\bO_\bE_\br_\br_\bo_\br\n-195 {};\n-196\n-200 template\n-_\b2_\b0_\b1 struct _\bC_\bo_\bp_\by_\bG_\ba_\bt_\bh_\be_\br_\bS_\bc_\ba_\bt_\bt_\be_\br\n-202 {\n-_\b2_\b0_\b3 typedef typename _\bC_\bo_\bm_\bm_\bP_\bo_\bl_\bi_\bc_\by_\b<_\bT_\b>_\b:_\b:_\bI_\bn_\bd_\be_\bx_\be_\bd_\bT_\by_\bp_\be _\bI_\bn_\bd_\be_\bx_\be_\bd_\bT_\by_\bp_\be;\n-204\n-_\b2_\b0_\b5 static const _\bI_\bn_\bd_\be_\bx_\be_\bd_\bT_\by_\bp_\be& _\bg_\ba_\bt_\bh_\be_\br(const T& vec, std::size_t i);\n-206\n-_\b2_\b0_\b7 static void _\bs_\bc_\ba_\bt_\bt_\be_\br(T& vec, const _\bI_\bn_\bd_\be_\bx_\be_\bd_\bT_\by_\bp_\be& v, std::size_t i);\n-208\n-209 };\n-210\n-222 template\n-223 class DatatypeCommunicator : public _\bI_\bn_\bt_\be_\br_\bf_\ba_\bc_\be_\bB_\bu_\bi_\bl_\bd_\be_\br\n-224 {\n-225 public:\n-226\n-230 typedef T _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt;\n-231\n-235 typedef _\bD_\bu_\bn_\be_\b:_\b:_\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\bi_\bc_\be_\bs_\b<_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt_\b> _\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\bi_\bc_\be_\bs;\n-236\n-240 typedef typename _\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\bi_\bc_\be_\bs_\b:_\b:_\bG_\bl_\bo_\bb_\ba_\bl_\bI_\bn_\bd_\be_\bx GlobalIndex;\n-241\n-245 typedef typename _\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\bi_\bc_\be_\bs_\b:_\b:_\bA_\bt_\bt_\br_\bi_\bb_\bu_\bt_\be Attribute;\n-246\n-250 typedef typename _\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\bi_\bc_\be_\bs_\b:_\b:_\bL_\bo_\bc_\ba_\bl_\bI_\bn_\bd_\be_\bx _\bL_\bo_\bc_\ba_\bl_\bI_\bn_\bd_\be_\bx;\n-251\n-255 DatatypeCommunicator();\n-256\n-260 ~DatatypeCommunicator();\n-261\n-288 template\n-289 void build(const _\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\bi_\bc_\be_\bs& remoteIndices, const T1& sourceFlags, V&\n-sendData, const T2& destFlags, V& receiveData);\n-290\n-294 void forward();\n-295\n-299 void backward();\n-300\n-304 void free();\n-305 private:\n-309 constexpr static int commTag_ = 234;\n-310\n-314 const _\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\bi_\bc_\be_\bs* remoteIndices_;\n-315\n-316 typedef std::map >\n-317 MessageTypeMap;\n-318\n-322 MessageTypeMap messageTypes;\n-323\n-327 void* data_;\n-328\n-329 MPI_Request* requests_[2];\n-330\n-334 bool created_;\n-335\n-339 template\n-340 void createRequests(V& sendData, V& receiveData);\n-341\n-345 template\n-346 void createDataTypes(const T1& source, const T2& destination, V& data);\n-347\n-351 void sendRecv(MPI_Request* req);\n-352\n-356 struct IndexedTypeInformation\n-357 {\n-363 void build(int i)\n-364 {\n-365 length = new int[i];\n-366 displ = new MPI_Aint[i];\n-367 size = i;\n-368 }\n-369\n-373 void free()\n-374 {\n-375 delete[] length;\n-376 delete[] displ;\n-377 }\n-379 int* length;\n-381 MPI_Aint* displ;\n-387 int elements;\n-391 int size;\n-392 };\n-393\n-399 template\n-400 struct MPIDatatypeInformation\n-401 {\n-406 MPIDatatypeInformation(const V& data) : data_(data)\n-407 {}\n-408\n-414 void reserve(int proc, int size)\n-415 {\n-416 information_[proc].build(size);\n-417 }\n-424 void add(int proc, int local)\n-425 {\n-426 IndexedTypeInformation& info=information_[proc];\n-427 assert((info.elements)(CommPolicy::getAddress(data_,\n-local)),\n-429 info.displ+info.elements);\n-430 info.length[info.elements]=CommPolicy::getSize(data_, local);\n-431 info.elements++;\n-432 }\n-433\n-438 std::map information_;\n-442 const V& data_;\n-443\n-444 };\n-445\n-446 };\n-447\n-_\b4_\b5_\b7 class _\bB_\bu_\bf_\bf_\be_\br_\be_\bd_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bo_\br\n-458 {\n-459\n-460 public:\n-_\b4_\b6_\b4 _\bB_\bu_\bf_\bf_\be_\br_\be_\bd_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bo_\br();\n-465\n-472 template\n-473 typename std::enable_if::\n-IndexedTypeFlag>::value, void>::type\n-_\b4_\b7_\b4 _\bb_\bu_\bi_\bl_\bd(const _\bI_\bn_\bt_\be_\br_\bf_\ba_\bc_\be& interface);\n-475\n-483 template\n-_\b4_\b8_\b4 void _\bb_\bu_\bi_\bl_\bd(const Data& source, const Data& target, const _\bI_\bn_\bt_\be_\br_\bf_\ba_\bc_\be&\n-interface);\n-485\n-514 template\n-_\b5_\b1_\b5 void _\bf_\bo_\br_\bw_\ba_\br_\bd(const Data& source, Data& dest);\n-516\n-545 template\n-_\b5_\b4_\b6 void _\bb_\ba_\bc_\bk_\bw_\ba_\br_\bd(Data& source, const Data& dest);\n-547\n-573 template\n-_\b5_\b7_\b4 void _\bf_\bo_\br_\bw_\ba_\br_\bd(Data& data);\n-575\n-601 template\n-_\b6_\b0_\b2 void _\bb_\ba_\bc_\bk_\bw_\ba_\br_\bd(Data& data);\n-603\n-_\b6_\b0_\b7 void _\bf_\br_\be_\be();\n-608\n-_\b6_\b1_\b2 _\b~_\bB_\bu_\bf_\bf_\be_\br_\be_\bd_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bo_\br();\n-613\n-614 private:\n-615\n-619 typedef std::map >\n-620 InterfaceMap;\n-621\n-622\n-626 template\n-627 struct MessageSizeCalculator\n-628 {};\n-629\n-634 template\n-635 struct MessageSizeCalculator\n-636 {\n-643 inline int operator()(const _\bI_\bn_\bt_\be_\br_\bf_\ba_\bc_\be_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn& info) const;\n-652 inline int operator()(const Data& data, const _\bI_\bn_\bt_\be_\br_\bf_\ba_\bc_\be_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn& info)\n-const;\n-653 };\n-654\n-659 template\n-660 struct MessageSizeCalculator\n-661 {\n-670 inline int operator()(const Data& data, const InterfaceInformation& info)\n-const;\n-671 };\n-672\n-676 template\n-677 struct MessageGatherer\n-678 {};\n-679\n-684 template\n-685 struct MessageGatherer\n-686 {\n-688 typedef typename _\bC_\bo_\bm_\bm_\bP_\bo_\bl_\bi_\bc_\by_\b<_\bD_\ba_\bt_\ba_\b>_\b:_\b:_\bI_\bn_\bd_\be_\bx_\be_\bd_\bT_\by_\bp_\be Type;\n-689\n-694 typedef GatherScatter Gatherer;\n-695\n-701 constexpr static bool _\bf_\bo_\br_\bw_\ba_\br_\bd = send;\n-702\n-710 inline void operator()(const InterfaceMap& interface, const Data& data,\n-Type* buffer, size_t bufferSize) const;\n-711 };\n-712\n-717 template\n-718 struct MessageGatherer\n-719 {\n-721 typedef typename _\bC_\bo_\bm_\bm_\bP_\bo_\bl_\bi_\bc_\by_\b<_\bD_\ba_\bt_\ba_\b>_\b:_\b:_\bI_\bn_\bd_\be_\bx_\be_\bd_\bT_\by_\bp_\be Type;\n-722\n-727 typedef GatherScatter Gatherer;\n-728\n-734 constexpr static bool _\bf_\bo_\br_\bw_\ba_\br_\bd = send;\n-735\n-743 inline void operator()(const InterfaceMap& interface, const Data& data,\n-Type* buffer, size_t bufferSize) const;\n-744 };\n-745\n-749 template\n-750 struct MessageScatterer\n-751 {};\n-752\n-757 template\n-758 struct MessageScatterer\n-759 {\n-761 typedef typename _\bC_\bo_\bm_\bm_\bP_\bo_\bl_\bi_\bc_\by_\b<_\bD_\ba_\bt_\ba_\b>_\b:_\b:_\bI_\bn_\bd_\be_\bx_\be_\bd_\bT_\by_\bp_\be Type;\n-762\n-767 typedef GatherScatter Scatterer;\n-768\n-774 constexpr static bool _\bf_\bo_\br_\bw_\ba_\br_\bd = send;\n-775\n-783 inline void operator()(const InterfaceMap& interface, Data& data, Type*\n-buffer, const int& proc) const;\n-784 };\n-789 template\n-790 struct MessageScatterer\n-791 {\n-793 typedef typename _\bC_\bo_\bm_\bm_\bP_\bo_\bl_\bi_\bc_\by_\b<_\bD_\ba_\bt_\ba_\b>_\b:_\b:_\bI_\bn_\bd_\be_\bx_\be_\bd_\bT_\by_\bp_\be Type;\n-794\n-799 typedef GatherScatter Scatterer;\n-800\n-806 constexpr static bool _\bf_\bo_\br_\bw_\ba_\br_\bd = send;\n-807\n-815 inline void operator()(const InterfaceMap& interface, Data& data, Type*\n-buffer, const int& proc) const;\n-816 };\n-817\n-821 struct MessageInformation\n-822 {\n-824 MessageInformation()\n-825 : start_(0), size_(0)\n-826 {}\n-827\n-835 MessageInformation(size_t start, size_t _\bs_\bi_\bz_\be)\n-836 : start_(start), size_(_\bs_\bi_\bz_\be)\n-837 {}\n-841 size_t start_;\n-845 size_t size_;\n-846 };\n-847\n-854 typedef std::map >\n-855 InformationMap;\n-859 InformationMap messageInformation_;\n-863 char* buffers_[2];\n-867 size_t bufferSize_[2];\n-868\n-872 constexpr static int commTag_ = 0;\n-873\n-877 std::map >\n-interfaces_;\n-878\n-879 MPI_Comm communicator_;\n-880\n-884 template\n-885 void sendRecv(const Data& source, Data& target);\n-886\n-887 };\n-888\n-889#ifndef DOXYGEN\n-890\n-891 template\n-892 inline const void* _\bC_\bo_\bm_\bm_\bP_\bo_\bl_\bi_\bc_\by_\b<_\bV_\b>_\b:_\b:_\bg_\be_\bt_\bA_\bd_\bd_\br_\be_\bs_\bs(const V& v, int index)\n-893 {\n-894 return &(v[index]);\n-895 }\n-896\n-897 template\n-898 inline int _\bC_\bo_\bm_\bm_\bP_\bo_\bl_\bi_\bc_\by_\b<_\bV_\b>_\b:_\b:_\bg_\be_\bt_\bS_\bi_\bz_\be([[maybe_unused]] const V& v, [\n-[maybe_unused]] int index)\n-899 {\n-900 return 1;\n-901 }\n-902\n-903 template\n-904 inline const void* CommPolicy, A> >::\n-getAddress(const Type& v, int index)\n-905 {\n-906 return &(v[index][0]);\n-907 }\n-908\n-909 template\n-910 inline int CommPolicy, A> >::getSize\n-(const Type& v, int index)\n-911 {\n-912 return v[index].getsize();\n-913 }\n-914\n-915 template\n-916 inline const typename CopyGatherScatter::IndexedType&\n-CopyGatherScatter::gather(const T & vec, std::size_t i)\n-917 {\n-918 return vec[i];\n-919 }\n-920\n-921 template\n-922 inline void CopyGatherScatter::scatter(T& vec, const IndexedType& v,\n-std::size_t i)\n-923 {\n-924 vec[i]=v;\n-925 }\n-926\n-927 template\n-928 DatatypeCommunicator::DatatypeCommunicator()\n-929 : remoteIndices_(0), created_(false)\n-930 {\n-931 requests_[0]=0;\n-932 requests_[1]=0;\n-933 }\n-934\n-935\n-936\n-937 template\n-938 DatatypeCommunicator::~DatatypeCommunicator()\n-939 {\n-940 free();\n-941 }\n-942\n-943 template\n-944 template\n-945 inline void DatatypeCommunicator::build(const RemoteIndices&\n-remoteIndices,\n-946 const T1& source, V& sendData,\n-947 const T2& destination, V& receiveData)\n-948 {\n-949 remoteIndices_ = &remoteIndices;\n-950 free();\n-951 createDataTypes(source,destination, receiveData);\n-952 createDataTypes(source,destination, sendData);\n-953 createRequests(sendData, receiveData);\n-954 createRequests(receiveData, sendData);\n-955 created_=true;\n-956 }\n-957\n-958 template\n-959 void DatatypeCommunicator::free()\n-960 {\n-961 if(created_) {\n-962 delete[] requests_[0];\n-963 delete[] requests_[1];\n-964 typedef MessageTypeMap::iterator iterator;\n-965 typedef MessageTypeMap::const_iterator const_iterator;\n-966\n-967 const const_iterator end=messageTypes.end();\n-968\n-969 for(iterator process = messageTypes.begin(); process != end; ++process) {\n-970 MPI_Datatype *type = &(process->second.first);\n-971 int finalized=0;\n-972 MPI_Finalized(&finalized);\n-973 if(*type!=MPI_DATATYPE_NULL && !finalized)\n-974 MPI_Type_free(type);\n-975 type = &(process->second.second);\n-976 if(*type!=MPI_DATATYPE_NULL && !finalized)\n-977 MPI_Type_free(type);\n-978 }\n-979 messageTypes.clear();\n-980 created_=false;\n-981 }\n-982\n-983 }\n-984\n-985 template\n-986 template\n-987 void DatatypeCommunicator::createDataTypes(const T1& sourceFlags, const\n-T2& destFlags, V& data)\n-988 {\n-989\n-990 MPIDatatypeInformation dataInfo(data);\n-991 this->template\n-buildInterface,send>\n-(*remoteIndices_,sourceFlags, destFlags, dataInfo);\n-992\n-993 typedef typename RemoteIndices::RemoteIndexMap::const_iterator\n-const_iterator;\n-994 const const_iterator end=this->remoteIndices_->end();\n-995\n-996 // Allocate MPI_Datatypes and deallocate memory for the type construction.\n-997 for(const_iterator process=this->remoteIndices_->begin(); process != end;\n-++process) {\n-998 IndexedTypeInformation& info=dataInfo.information_[process->first];\n-999 // Shift the displacement\n-1000 MPI_Aint base;\n-1001 MPI_Get_address(const_cast(_\bC_\bo_\bm_\bm_\bP_\bo_\bl_\bi_\bc_\by_\b<_\bV_\b>_\b:_\b:_\bg_\be_\bt_\bA_\bd_\bd_\br_\be_\bs_\bs(data, 0)),\n-&base);\n-1002\n-1003 for(int i=0; i< info.elements; i++) {\n-1004 info.displ[i]-=base;\n-1005 }\n-1006\n-1007 // Create data type\n-1008 MPI_Datatype* type = &( send ? messageTypes[process->first].first :\n-messageTypes[process->first].second);\n-1009 MPI_Type_create_hindexed(info.elements, info.length, info.displ,\n-1010 MPITraits_\b:_\b:_\bI_\bn_\bd_\be_\bx_\be_\bd_\bT_\by_\bp_\be>::getType(), type);\n-1011 MPI_Type_commit(type);\n-1012 // Deallocate memory\n-1013 info.free();\n-1014 }\n-1015 }\n-1016\n-1017 template\n-1018 template\n-1019 void DatatypeCommunicator::createRequests(V& sendData, V& receiveData)\n-1020 {\n-1021 typedef std::map >::\n-const_iterator MapIterator;\n-1022 int rank;\n-1023 static int index = createForward ? 1 : 0;\n-1024 int noMessages = messageTypes.size();\n-1025 // allocate request handles\n-1026 requests_[index] = new MPI_Request[2*noMessages];\n-1027 const MapIterator end = messageTypes.end();\n-1028 int request=0;\n-1029 MPI_Comm_rank(MPI_COMM_WORLD, &rank);\n-1030\n-1031 // Set up the requests for receiving first\n-1032 for(MapIterator process = messageTypes.begin(); process != end;\n-1033 ++process, ++request) {\n-1034 MPI_Datatype type = createForward ? process->second.second : process-\n->second.first;\n-1035 void* address = const_cast(_\bC_\bo_\bm_\bm_\bP_\bo_\bl_\bi_\bc_\by_\b<_\bV_\b>_\b:_\b:_\bg_\be_\bt_\bA_\bd_\bd_\br_\be_\bs_\bs\n-(receiveData,0));\n-1036 MPI_Recv_init(address, 1, type, process->first, commTag_, this-\n->remoteIndices_->communicator(), requests_[index]+request);\n-1037 }\n-1038\n-1039 // And now the send requests\n-1040\n-1041 for(MapIterator process = messageTypes.begin(); process != end;\n-1042 ++process, ++request) {\n-1043 MPI_Datatype type = createForward ? process->second.first : process-\n->second.second;\n-1044 void* address = const_cast(_\bC_\bo_\bm_\bm_\bP_\bo_\bl_\bi_\bc_\by_\b<_\bV_\b>_\b:_\b:_\bg_\be_\bt_\bA_\bd_\bd_\br_\be_\bs_\bs(sendData, 0));\n-1045 MPI_Ssend_init(address, 1, type, process->first, commTag_, this-\n->remoteIndices_->communicator(), requests_[index]+request);\n-1046 }\n-1047 }\n-1048\n-1049 template\n-1050 void DatatypeCommunicator::forward()\n-1051 {\n-1052 sendRecv(requests_[1]);\n-1053 }\n-1054\n-1055 template\n-1056 void DatatypeCommunicator::backward()\n-1057 {\n-1058 sendRecv(requests_[0]);\n-1059 }\n-1060\n-1061 template\n-1062 void DatatypeCommunicator::sendRecv(MPI_Request* requests)\n-1063 {\n-1064 int noMessages = messageTypes.size();\n-1065 // Start the receive calls first\n-1066 MPI_Startall(noMessages, requests);\n-1067 // Now the send calls\n-1068 MPI_Startall(noMessages, requests+noMessages);\n-1069\n-1070 // Wait for completion of the communication send first then receive\n-1071 MPI_Status* status=new MPI_Status[2*noMessages];\n-1072 for(int i=0; i<2*noMessages; i++)\n-1073 status[i].MPI_ERROR=MPI_SUCCESS;\n-1074\n-1075 int send = MPI_Waitall(noMessages, requests+noMessages,\n-status+noMessages);\n-1076 int receive = MPI_Waitall(noMessages, requests, status);\n-1077\n-1078 // Error checks\n-1079 int success=1, globalSuccess=0;\n-1080 if(send==MPI_ERR_IN_STATUS) {\n-1081 int rank;\n-1082 MPI_Comm_rank(this->remoteIndices_->communicator(), &rank);\n-1083 std::cerr<remoteIndices_->communicator(), &rank);\n-1101 std::cerr<remoteIndices_->communicator());\n-1117\n-1118 delete[] status;\n-1119\n-1120 if(!globalSuccess)\n-1121 _\bD_\bU_\bN_\bE_\b__\bT_\bH_\bR_\bO_\bW(CommunicationError, \"A communication error occurred!\");\n-1122\n-1123 }\n-1124\n-1125 inline _\bB_\bu_\bf_\bf_\be_\br_\be_\bd_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bo_\br_\b:_\b:_\bB_\bu_\bf_\bf_\be_\br_\be_\bd_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bo_\br()\n-1126 {\n-1127 buffers_[0]=0;\n-1128 buffers_[1]=0;\n-1129 bufferSize_[0]=0;\n-1130 bufferSize_[1]=0;\n-1131 }\n-1132\n-1133 template\n-1134 typename std::enable_if::\n-IndexedTypeFlag>::value, void>::type\n-1135 _\bB_\bu_\bf_\bf_\be_\br_\be_\bd_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bo_\br_\b:_\b:_\bb_\bu_\bi_\bl_\bd(const Interface& interface)\n-1136 {\n-1137 interfaces_=interface.interfaces();\n-1138 communicator_=interface.communicator();\n-1139 typedef typename std::map >\n-1140 ::const_iterator const_iterator;\n-1141 typedef typename _\bC_\bo_\bm_\bm_\bP_\bo_\bl_\bi_\bc_\by_\b<_\bD_\ba_\bt_\ba_\b>_\b:_\b:_\bI_\bn_\bd_\be_\bx_\be_\bd_\bT_\by_\bp_\be_\bF_\bl_\ba_\bg Flag;\n-1142 const const_iterator end = interfaces_.end();\n-1143 int lrank;\n-1144 MPI_Comm_rank(communicator_, &lrank);\n-1145\n-1146 bufferSize_[0]=0;\n-1147 bufferSize_[1]=0;\n-1148\n-1149 for(const_iterator interfacePair = interfaces_.begin();\n-1150 interfacePair != end; ++interfacePair) {\n-1151 int noSend = MessageSizeCalculator() (interfacePair-\n->second.first);\n-1152 int noRecv = MessageSizeCalculator() (interfacePair-\n->second.second);\n-1153 if (noSend + noRecv > 0)\n-1154 messageInformation_.insert(std::make_pair(interfacePair->first,\n-1155 std::make_pair(MessageInformation(bufferSize_[0],\n-1156 noSend*sizeof(typename _\bC_\bo_\bm_\bm_\bP_\bo_\bl_\bi_\bc_\by_\b<_\bD_\ba_\bt_\ba_\b>_\b:_\b:_\bI_\bn_\bd_\be_\bx_\be_\bd_\bT_\by_\bp_\be)),\n-1157 MessageInformation(bufferSize_[1],\n-1158 noRecv*sizeof(typename _\bC_\bo_\bm_\bm_\bP_\bo_\bl_\bi_\bc_\by_\b<_\bD_\ba_\bt_\ba_\b>_\b:_\b:_\bI_\bn_\bd_\be_\bx_\be_\bd_\bT_\by_\bp_\be)))));\n-1159 bufferSize_[0] += noSend;\n-1160 bufferSize_[1] += noRecv;\n-1161 }\n-1162\n-1163 // allocate the buffers\n-1164 bufferSize_[0] *= sizeof(typename _\bC_\bo_\bm_\bm_\bP_\bo_\bl_\bi_\bc_\by_\b<_\bD_\ba_\bt_\ba_\b>_\b:_\b:_\bI_\bn_\bd_\be_\bx_\be_\bd_\bT_\by_\bp_\be);\n-1165 bufferSize_[1] *= sizeof(typename _\bC_\bo_\bm_\bm_\bP_\bo_\bl_\bi_\bc_\by_\b<_\bD_\ba_\bt_\ba_\b>_\b:_\b:_\bI_\bn_\bd_\be_\bx_\be_\bd_\bT_\by_\bp_\be);\n-1166\n-1167 buffers_[0] = new char[bufferSize_[0]];\n-1168 buffers_[1] = new char[bufferSize_[1]];\n-1169 }\n-1170\n-1171 template\n-1172 void _\bB_\bu_\bf_\bf_\be_\br_\be_\bd_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bo_\br_\b:_\b:_\bb_\bu_\bi_\bl_\bd(const Data& source, const Data& dest,\n-const Interface& interface)\n-1173 {\n-1174\n-1175 interfaces_=interface.interfaces();\n-1176 communicator_=interface.communicator();\n-1177 typedef typename std::map >\n-1178 ::const_iterator const_iterator;\n-1179 typedef typename _\bC_\bo_\bm_\bm_\bP_\bo_\bl_\bi_\bc_\by_\b<_\bD_\ba_\bt_\ba_\b>_\b:_\b:_\bI_\bn_\bd_\be_\bx_\be_\bd_\bT_\by_\bp_\be_\bF_\bl_\ba_\bg Flag;\n-1180 const const_iterator end = interfaces_.end();\n-1181\n-1182 bufferSize_[0]=0;\n-1183 bufferSize_[1]=0;\n-1184\n-1185 for(const_iterator interfacePair = interfaces_.begin();\n-1186 interfacePair != end; ++interfacePair) {\n-1187 int noSend = MessageSizeCalculator() (source, interfacePair-\n->second.first);\n-1188 int noRecv = MessageSizeCalculator() (dest, interfacePair-\n->second.second);\n-1189 if (noSend + noRecv > 0)\n-1190 messageInformation_.insert(std::make_pair(interfacePair->first,\n-1191 std::make_pair(MessageInformation(bufferSize_[0],\n-1192 noSend*sizeof(typename _\bC_\bo_\bm_\bm_\bP_\bo_\bl_\bi_\bc_\by_\b<_\bD_\ba_\bt_\ba_\b>_\b:_\b:_\bI_\bn_\bd_\be_\bx_\be_\bd_\bT_\by_\bp_\be)),\n-1193 MessageInformation(bufferSize_[1],\n-1194 noRecv*sizeof(typename _\bC_\bo_\bm_\bm_\bP_\bo_\bl_\bi_\bc_\by_\b<_\bD_\ba_\bt_\ba_\b>_\b:_\b:_\bI_\bn_\bd_\be_\bx_\be_\bd_\bT_\by_\bp_\be)))));\n-1195 bufferSize_[0] += noSend;\n-1196 bufferSize_[1] += noRecv;\n-1197 }\n-1198\n-1199 bufferSize_[0] *= sizeof(typename _\bC_\bo_\bm_\bm_\bP_\bo_\bl_\bi_\bc_\by_\b<_\bD_\ba_\bt_\ba_\b>_\b:_\b:_\bI_\bn_\bd_\be_\bx_\be_\bd_\bT_\by_\bp_\be);\n-1200 bufferSize_[1] *= sizeof(typename _\bC_\bo_\bm_\bm_\bP_\bo_\bl_\bi_\bc_\by_\b<_\bD_\ba_\bt_\ba_\b>_\b:_\b:_\bI_\bn_\bd_\be_\bx_\be_\bd_\bT_\by_\bp_\be);\n-1201 // allocate the buffers\n-1202 buffers_[0] = new char[bufferSize_[0]];\n-1203 buffers_[1] = new char[bufferSize_[1]];\n-1204 }\n-1205\n-1206 inline void _\bB_\bu_\bf_\bf_\be_\br_\be_\bd_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bo_\br_\b:_\b:_\bf_\br_\be_\be()\n-1207 {\n-1208 messageInformation_.clear();\n-1209 if(buffers_[0])\n-1210 delete[] buffers_[0];\n-1211\n-1212 if(buffers_[1])\n-1213 delete[] buffers_[1];\n-1214 buffers_[0]=buffers_[1]=0;\n-1215 }\n-1216\n-1217 inline _\bB_\bu_\bf_\bf_\be_\br_\be_\bd_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bo_\br_\b:_\b:_\b~_\bB_\bu_\bf_\bf_\be_\br_\be_\bd_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bo_\br()\n-1218 {\n-1219 _\bf_\br_\be_\be();\n-1220 }\n-1221\n-1222 template\n-1223 inline int BufferedCommunicator::MessageSizeCalculator::\n-operator()\n-1224 (const InterfaceInformation& info) const\n-1225 {\n-1226 return info.size();\n-1227 }\n-1228\n-1229\n-1230 template\n-1231 inline int BufferedCommunicator::MessageSizeCalculator::\n-operator()\n-1232 (const Data&, const InterfaceInformation& info) const\n-1233 {\n-1234 return operator()(info);\n-1235 }\n-1236\n-1237\n-1238 template\n-1239 inline int BufferedCommunicator::MessageSizeCalculator::operator()\n-1240 (const Data& data, const InterfaceInformation& info) const\n-1241 {\n-1242 int entries=0;\n-1243\n-1244 for(size_t i=0; i < info.size(); i++)\n-1245 entries += _\bC_\bo_\bm_\bm_\bP_\bo_\bl_\bi_\bc_\by_\b<_\bD_\ba_\bt_\ba_\b>_\b:_\b:_\bg_\be_\bt_\bS_\bi_\bz_\be(data,info[i]);\n-1246\n-1247 return entries;\n-1248 }\n-1249\n-1250\n-1251 template\n-1252 inline void BufferedCommunicator::\n-MessageGatherer::operator()(const\n-InterfaceMap& interfaces,const Data& data, Type* buffer, [[maybe_unused]]\n-size_t bufferSize) const\n-1253 {\n-1254 typedef typename InterfaceMap::const_iterator\n-1255 const_iterator;\n-1256\n-1257 int rank;\n-1258 MPI_Comm_rank(MPI_COMM_WORLD, &rank);\n-1259 const const_iterator end = interfaces.end();\n-1260 size_t index=0;\n-1261\n-1262 for(const_iterator interfacePair = interfaces.begin();\n-1263 interfacePair != end; ++interfacePair) {\n-1264 int _\bs_\bi_\bz_\be = forward ? interfacePair->second.first.size() :\n-1265 interfacePair->second.second.size();\n-1266\n-1267 for(int i=0; i < _\bs_\bi_\bz_\be; i++) {\n-1268 int local = forward ? interfacePair->second.first[i] :\n-1269 interfacePair->second.second[i];\n-1270 for(std::size_t j=0; j < CommPolicy::getSize(data, local); j++,\n-index++) {\n-1271\n-1272#ifdef DUNE_ISTL_WITH_CHECKING\n-1273 assert(bufferSize>=(index+1)*sizeof(typename _\bC_\bo_\bm_\bm_\bP_\bo_\bl_\bi_\bc_\by_\b<_\bD_\ba_\bt_\ba_\b>_\b:_\b:\n-_\bI_\bn_\bd_\be_\bx_\be_\bd_\bT_\by_\bp_\be));\n-1274#endif\n-1275 buffer[index]=GatherScatter::gather(data, local, j);\n-1276 }\n-1277\n-1278 }\n-1279 }\n-1280\n-1281 }\n-1282\n-1283\n-1284 template\n-1285 inline void BufferedCommunicator::\n-MessageGatherer::operator()(\n-1286 const InterfaceMap& interfaces, const Data& data, Type* buffer, [\n-[maybe_unused]] size_t bufferSize) const\n-1287 {\n-1288 typedef typename InterfaceMap::const_iterator\n-1289 const_iterator;\n-1290 const const_iterator end = interfaces.end();\n-1291 size_t index = 0;\n-1292\n-1293 int rank;\n-1294 MPI_Comm_rank(MPI_COMM_WORLD, &rank);\n-1295\n-1296 for(const_iterator interfacePair = interfaces.begin();\n-1297 interfacePair != end; ++interfacePair) {\n-1298 size_t _\bs_\bi_\bz_\be = FORWARD ? interfacePair->second.first.size() :\n-1299 interfacePair->second.second.size();\n-1300\n-1301 for(size_t i=0; i < _\bs_\bi_\bz_\be; i++) {\n-1302\n-1303#ifdef DUNE_ISTL_WITH_CHECKING\n-1304 assert(bufferSize>=(index+1)*sizeof(typename _\bC_\bo_\bm_\bm_\bP_\bo_\bl_\bi_\bc_\by_\b<_\bD_\ba_\bt_\ba_\b>_\b:_\b:\n-_\bI_\bn_\bd_\be_\bx_\be_\bd_\bT_\by_\bp_\be));\n-1305#endif\n-1306\n-1307 buffer[index++] = GatherScatter::gather(data, FORWARD ? interfacePair-\n->second.first[i] :\n-1308 interfacePair->second.second[i]);\n-1309 }\n-1310 }\n-1311\n-1312 }\n-1313\n-1314\n-1315 template\n-1316 inline void BufferedCommunicator::\n-MessageScatterer::operator()(const\n-InterfaceMap& interfaces, Data& data, Type* buffer, const int& proc) const\n-1317 {\n-1318 typedef typename InterfaceMap::value_type::second_type::first_type\n-Information;\n-1319 const typename InterfaceMap::const_iterator infoPair = interfaces.find\n-(proc);\n-1320\n-1321 assert(infoPair!=interfaces.end());\n-1322\n-1323 const Information& info = FORWARD ? infoPair->second.second :\n-1324 infoPair->second.first;\n-1325\n-1326 for(size_t i=0, index=0; i < info.size(); i++) {\n-1327 for(size_t j=0; j < CommPolicy::getSize(data, info[i]); j++)\n-1328 GatherScatter::scatter(data, buffer[index++], info[i], j);\n-1329 }\n-1330 }\n-1331\n-1332\n-1333 template\n-1334 inline void BufferedCommunicator::\n-MessageScatterer::operator()(const\n-InterfaceMap& interfaces, Data& data, Type* buffer, const int& proc) const\n-1335 {\n-1336 typedef typename InterfaceMap::value_type::second_type::first_type\n-Information;\n-1337 const typename InterfaceMap::const_iterator infoPair = interfaces.find\n-(proc);\n-1338\n-1339 assert(infoPair!=interfaces.end());\n-1340\n-1341 const Information& info = FORWARD ? infoPair->second.second :\n-1342 infoPair->second.first;\n-1343\n-1344 for(size_t i=0; i < info.size(); i++) {\n-1345 GatherScatter::scatter(data, buffer[i], info[i]);\n-1346 }\n-1347 }\n-1348\n-1349\n-1350 template\n-1351 void _\bB_\bu_\bf_\bf_\be_\br_\be_\bd_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bo_\br_\b:_\b:_\bf_\bo_\br_\bw_\ba_\br_\bd(Data& data)\n-1352 {\n-1353 this->template sendRecv(data, data);\n-1354 }\n-1355\n-1356\n-1357 template\n-1358 void _\bB_\bu_\bf_\bf_\be_\br_\be_\bd_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bo_\br_\b:_\b:_\bb_\ba_\bc_\bk_\bw_\ba_\br_\bd(Data& data)\n-1359 {\n-1360 this->template sendRecv(data, data);\n-1361 }\n-1362\n-1363\n-1364 template\n-1365 void _\bB_\bu_\bf_\bf_\be_\br_\be_\bd_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bo_\br_\b:_\b:_\bf_\bo_\br_\bw_\ba_\br_\bd(const Data& source, Data& dest)\n-1366 {\n-1367 this->template sendRecv(source, dest);\n-1368 }\n-1369\n-1370\n-1371 template\n-1372 void _\bB_\bu_\bf_\bf_\be_\br_\be_\bd_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bo_\br_\b:_\b:_\bb_\ba_\bc_\bk_\bw_\ba_\br_\bd(Data& source, const Data& dest)\n-1373 {\n-1374 this->template sendRecv(dest, source);\n-1375 }\n-1376\n-1377\n-1378 template\n-1379 void BufferedCommunicator::sendRecv(const Data& source, Data& dest)\n-1380 {\n-1381 int rank, lrank;\n-1382\n-1383 MPI_Comm_rank(MPI_COMM_WORLD,&rank);\n-1384 MPI_Comm_rank(MPI_COMM_WORLD,&lrank);\n-1385\n-1386 typedef typename _\bC_\bo_\bm_\bm_\bP_\bo_\bl_\bi_\bc_\by_\b<_\bD_\ba_\bt_\ba_\b>_\b:_\b:_\bI_\bn_\bd_\be_\bx_\be_\bd_\bT_\by_\bp_\be Type;\n-1387 Type *sendBuffer, *recvBuffer;\n-1388 size_t sendBufferSize;\n-1389#ifndef NDEBUG\n-1390 size_t recvBufferSize;\n-1391#endif\n-1392\n-1393 if(FORWARD) {\n-1394 sendBuffer = reinterpret_cast(buffers_[0]);\n-1395 sendBufferSize = bufferSize_[0];\n-1396 recvBuffer = reinterpret_cast(buffers_[1]);\n-1397#ifndef NDEBUG\n-1398 recvBufferSize = bufferSize_[1];\n-1399#endif\n-1400 }else{\n-1401 sendBuffer = reinterpret_cast(buffers_[1]);\n-1402 sendBufferSize = bufferSize_[1];\n-1403 recvBuffer = reinterpret_cast(buffers_[0]);\n-1404#ifndef NDEBUG\n-1405 recvBufferSize = bufferSize_[0];\n-1406#endif\n-1407 }\n-1408 typedef typename _\bC_\bo_\bm_\bm_\bP_\bo_\bl_\bi_\bc_\by_\b<_\bD_\ba_\bt_\ba_\b>_\b:_\b:_\bI_\bn_\bd_\be_\bx_\be_\bd_\bT_\by_\bp_\be_\bF_\bl_\ba_\bg Flag;\n-1409\n-1410 MessageGatherer() (interfaces_, source,\n-sendBuffer, sendBufferSize);\n-1411\n-1412 MPI_Request* sendRequests = new MPI_Request[messageInformation_.size()];\n-1413 MPI_Request* recvRequests = new MPI_Request[messageInformation_.size()];\n-1414 /* Number of recvRequests that are not MPI_REQUEST_NULL */\n-1415 size_t numberOfRealRecvRequests = 0;\n-1416\n-1417 // Setup receive first\n-1418 typedef typename InformationMap::const_iterator const_iterator;\n-1419\n-1420 const const_iterator end = messageInformation_.end();\n-1421 size_t i=0;\n-1422 int* processMap = new int[messageInformation_.size()];\n-1423\n-1424 for(const_iterator info = messageInformation_.begin(); info != end;\n-++info, ++i) {\n-1425 processMap[i]=info->first;\n-1426 if(FORWARD) {\n-1427 assert(info->second.second.start_*sizeof(typename _\bC_\bo_\bm_\bm_\bP_\bo_\bl_\bi_\bc_\by_\b<_\bD_\ba_\bt_\ba_\b>_\b:_\b:\n-_\bI_\bn_\bd_\be_\bx_\be_\bd_\bT_\by_\bp_\be)+info->second.second.size_ <= recvBufferSize );\n-1428 _\bD_\bu_\bn_\be_\b:_\b:_\bd_\bv_\bv_\be_\br_\bb<second.second.size_<<\" from\n-\"<first<second.second.size_) {\n-1430 MPI_Irecv(recvBuffer+info->second.second.start_, info-\n->second.second.size_,\n-1431 MPI_BYTE, info->first, commTag_, communicator_,\n-1432 recvRequests+i);\n-1433 numberOfRealRecvRequests += 1;\n-1434 } else {\n-1435 // Nothing to receive -> set request to inactive\n-1436 recvRequests[i]=MPI_REQUEST_NULL;\n-1437 }\n-1438 }else{\n-1439 assert(info->second.first.start_*sizeof(typename _\bC_\bo_\bm_\bm_\bP_\bo_\bl_\bi_\bc_\by_\b<_\bD_\ba_\bt_\ba_\b>_\b:_\b:\n-_\bI_\bn_\bd_\be_\bx_\be_\bd_\bT_\by_\bp_\be)+info->second.first.size_ <= recvBufferSize );\n-1440 _\bD_\bu_\bn_\be_\b:_\b:_\bd_\bv_\bv_\be_\br_\bb<second.first.size_<<\" to\n-\"<first<second.first.size_) {\n-1442 MPI_Irecv(recvBuffer+info->second.first.start_, info->second.first.size_,\n-1443 MPI_BYTE, info->first, commTag_, communicator_,\n-1444 recvRequests+i);\n-1445 numberOfRealRecvRequests += 1;\n-1446 } else {\n-1447 // Nothing to receive -> set request to inactive\n-1448 recvRequests[i]=MPI_REQUEST_NULL;\n-1449 }\n-1450 }\n-1451 }\n-1452\n-1453 // now the send requests\n-1454 i=0;\n-1455 for(const_iterator info = messageInformation_.begin(); info != end;\n-++info, ++i)\n-1456 if(FORWARD) {\n-1457 assert(info->second.second.start_*sizeof(typename _\bC_\bo_\bm_\bm_\bP_\bo_\bl_\bi_\bc_\by_\b<_\bD_\ba_\bt_\ba_\b>_\b:_\b:\n-_\bI_\bn_\bd_\be_\bx_\be_\bd_\bT_\by_\bp_\be)+info->second.second.size_ <= recvBufferSize );\n-1458 _\bD_\bu_\bn_\be_\b:_\b:_\bd_\bv_\bv_\be_\br_\bb<second.first.size_<<\" to \"<first<second.first.start_*sizeof(typename _\bC_\bo_\bm_\bm_\bP_\bo_\bl_\bi_\bc_\by_\b<_\bD_\ba_\bt_\ba_\b>_\b:_\b:\n-_\bI_\bn_\bd_\be_\bx_\be_\bd_\bT_\by_\bp_\be)+info->second.first.size_ <= sendBufferSize );\n-1460 if(info->second.first.size_)\n-1461 MPI_Issend(sendBuffer+info->second.first.start_, info->second.first.size_,\n-1462 MPI_BYTE, info->first, commTag_, communicator_,\n-1463 sendRequests+i);\n-1464 else\n-1465 // Nothing to send -> set request to inactive\n-1466 sendRequests[i]=MPI_REQUEST_NULL;\n-1467 }else{\n-1468 assert(info->second.second.start_*sizeof(typename _\bC_\bo_\bm_\bm_\bP_\bo_\bl_\bi_\bc_\by_\b<_\bD_\ba_\bt_\ba_\b>_\b:_\b:\n-_\bI_\bn_\bd_\be_\bx_\be_\bd_\bT_\by_\bp_\be)+info->second.second.size_ <= sendBufferSize );\n-1469 _\bD_\bu_\bn_\be_\b:_\b:_\bd_\bv_\bv_\be_\br_\bb<second.second.size_<<\" to \"<first<second.second.size_)\n-1471 MPI_Issend(sendBuffer+info->second.second.start_, info-\n->second.second.size_,\n-1472 MPI_BYTE, info->first, commTag_, communicator_,\n-1473 sendRequests+i);\n-1474 else\n-1475 // Nothing to send -> set request to inactive\n-1476 sendRequests[i]=MPI_REQUEST_NULL;\n-1477 }\n-1478\n-1479 // Wait for completion of receive and immediately start scatter\n-1480 i=0;\n-1481 //int success = 1;\n-1482 int finished = MPI_UNDEFINED;\n-1483 MPI_Status status; //[messageInformation_.size()];\n-1484 //MPI_Waitall(messageInformation_.size(), recvRequests, status);\n-1485\n-1486 for(i=0; i< numberOfRealRecvRequests; i++) {\n-1487 status.MPI_ERROR=MPI_SUCCESS;\n-1488 MPI_Waitany(messageInformation_.size(), recvRequests, &finished, &status);\n-1489 assert(finished != MPI_UNDEFINED);\n-1490\n-1491 if(status.MPI_ERROR==MPI_SUCCESS) {\n-1492 int& proc = processMap[finished];\n-1493 typename InformationMap::const_iterator infoIter =\n-messageInformation_.find(proc);\n-1494 assert(infoIter != messageInformation_.end());\n-1495\n-1496 MessageInformation info = (FORWARD) ? infoIter->second.second : infoIter-\n->second.first;\n-1497 assert(info.start_+info.size_ <= recvBufferSize);\n-1498\n-1499 MessageScatterer() (interfaces_, dest,\n-recvBuffer+info.start_, proc);\n-1500 }else{\n-1501 std::cerr<communicator());\n-1517\n-1518 if(!globalSuccess)\n-1519 DUNE_THROW(CommunicationError, \"A communication error occurred!\");\n-1520 */\n-1521 delete[] processMap;\n-1522 delete[] sendRequests;\n-1523 delete[] recvRequests;\n-1524\n-1525 }\n-1526\n-1527#endif // DOXYGEN\n-1528\n-1530}\n-1531\n-1532#endif // HAVE_MPI\n-1533#endif // DUNE_COMMON_PARALLEL_COMMUNICATOR_HH\n-_\br_\be_\bm_\bo_\bt_\be_\bi_\bn_\bd_\bi_\bc_\be_\bs_\b._\bh_\bh\n-Classes describing a distributed indexset.\n-_\bs_\bt_\bd_\bs_\bt_\br_\be_\ba_\bm_\bs_\b._\bh_\bh\n-Standard Dune debug streams.\n+182}\n+183#endif // HAVE_MPI\n+184#endif // DUNE_COMMON_PARALLEL_MPIFUTURE_HH\n+_\bc_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b._\bh_\bh\n+Implements an utility class that provides collective communication methods for\n+sequential programs.\n+_\bm_\bp_\bi_\bd_\ba_\bt_\ba_\b._\bh_\bh\n+Interface class to translate objects to a MPI_Datatype, void* and size used for\n+MPI calls.\n+_\bf_\bu_\bt_\bu_\br_\be_\b._\bh_\bh\n _\be_\bx_\bc_\be_\bp_\bt_\bi_\bo_\bn_\bs_\b._\bh_\bh\n A few common exception classes.\n+_\bD_\bu_\bn_\be_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b*\n+bigunsignedint< k > operator*(const bigunsignedint< k > &x, std::uintmax_t y)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bigunsignedint.hh:549\n _\bD_\bU_\bN_\bE_\b__\bT_\bH_\bR_\bO_\bW\n #define DUNE_THROW(E, m)\n D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn exceptions.hh:218\n-_\bD_\bu_\bn_\be_\b:_\b:_\bd_\bv_\bv_\be_\br_\bb\n-DVVerbType dvverb(std::cout)\n-stream for very verbose output.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn stdstreams.hh:96\n+_\bs_\bt_\bd\n+STL namespace.\n _\bD_\bu_\bn_\be\n Dune namespace.\n D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn alignedallocator.hh:13\n-_\bD_\bu_\bn_\be_\b:_\b:_\bs_\bi_\bz_\be\n-constexpr std::integral_constant< std::size_t, sizeof...(II)> size(std::\n-integer_sequence< T, II... >)\n-Return the size of the sequence.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn integersequence.hh:75\n-_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bO_\bE_\br_\br_\bo_\br\n-Default exception class for I/O errors.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn exceptions.hh:231\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bi_\bz_\be_\bO_\bn_\be\n-Flag for marking indexed data structures where data at each index is of the\n-same size.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn communicator.hh:110\n-_\bD_\bu_\bn_\be_\b:_\b:_\bV_\ba_\br_\bi_\ba_\bb_\bl_\be_\bS_\bi_\bz_\be\n-Flag for marking indexed data structures where the data at each index may be a\n-variable multiple of a...\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn communicator.hh:118\n-_\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bm_\bm_\bP_\bo_\bl_\bi_\bc_\by\n-Default policy used for communicating an indexed type.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn communicator.hh:128\n-_\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bm_\bm_\bP_\bo_\bl_\bi_\bc_\by_\b:_\b:_\bI_\bn_\bd_\be_\bx_\be_\bd_\bT_\by_\bp_\be\n-V::value_type IndexedType\n-The type we get at each index with operator[].\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn communicator.hh:147\n-_\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bm_\bm_\bP_\bo_\bl_\bi_\bc_\by_\b:_\b:_\bg_\be_\bt_\bS_\bi_\bz_\be\n-static int getSize(const V &, int index)\n-Get the number of primitive elements at that index.\n-_\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bm_\bm_\bP_\bo_\bl_\bi_\bc_\by_\b:_\b:_\bI_\bn_\bd_\be_\bx_\be_\bd_\bT_\by_\bp_\be_\bF_\bl_\ba_\bg\n-SizeOne IndexedTypeFlag\n-Whether the indexed type has variable size or there is always one value at each\n-index.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn communicator.hh:153\n-_\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bm_\bm_\bP_\bo_\bl_\bi_\bc_\by_\b:_\b:_\bg_\be_\bt_\bA_\bd_\bd_\br_\be_\bs_\bs\n-static const void * getAddress(const V &v, int index)\n-Get the address of entry at an index.\n-_\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bm_\bm_\bP_\bo_\bl_\bi_\bc_\by_\b:_\b:_\bT_\by_\bp_\be\n-V Type\n-The type the policy is for.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn communicator.hh:140\n-_\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bm_\bm_\bP_\bo_\bl_\bi_\bc_\by_\b:_\b:_\bF_\bi_\be_\bl_\bd_\bV_\be_\bc_\bt_\bo_\br\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn communicator.hh:173\n-_\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bm_\bm_\bP_\bo_\bl_\bi_\bc_\by_\b:_\b:_\bV_\ba_\br_\bi_\ba_\bb_\bl_\be_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn communicator.hh:175\n-_\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bm_\bm_\bP_\bo_\bl_\bi_\bc_\by_\b:_\b:_\bC_\bo_\bm_\bm_\bP_\bo_\bl_\bi_\bc_\by_\b<_\b _\bV_\ba_\br_\bi_\ba_\bb_\bl_\be_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br_\b<_\b _\bF_\bi_\be_\bl_\bd_\bV_\be_\bc_\bt_\bo_\br_\b<_\b _\bK_\b,_\b _\bn_\b _\b>_\b,_\b _\bA_\b _\b>_\b _\b>_\b:_\b:\n-_\bg_\be_\bt_\bS_\bi_\bz_\be\n-static int getSize(const Type &v, int i)\n-_\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bm_\bm_\bP_\bo_\bl_\bi_\bc_\by_\b:_\b:_\bC_\bo_\bm_\bm_\bP_\bo_\bl_\bi_\bc_\by_\b<_\b _\bV_\ba_\br_\bi_\ba_\bb_\bl_\be_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br_\b<_\b _\bF_\bi_\be_\bl_\bd_\bV_\be_\bc_\bt_\bo_\br_\b<_\b _\bK_\b,_\b _\bn_\b _\b>_\b,_\b _\bA_\b _\b>_\b _\b>_\b:_\b:\n-_\bI_\bn_\bd_\be_\bx_\be_\bd_\bT_\by_\bp_\be_\bF_\bl_\ba_\bg\n-VariableSize IndexedTypeFlag\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn communicator.hh:184\n-_\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bm_\bm_\bP_\bo_\bl_\bi_\bc_\by_\b:_\b:_\bC_\bo_\bm_\bm_\bP_\bo_\bl_\bi_\bc_\by_\b<_\b _\bV_\ba_\br_\bi_\ba_\bb_\bl_\be_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br_\b<_\b _\bF_\bi_\be_\bl_\bd_\bV_\be_\bc_\bt_\bo_\br_\b<_\b _\bK_\b,_\b _\bn_\b _\b>_\b,_\b _\bA_\b _\b>_\b _\b>_\b:_\b:\n-_\bT_\by_\bp_\be\n-VariableBlockVector< FieldVector< K, n >, A > Type\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn communicator.hh:180\n-_\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bm_\bm_\bP_\bo_\bl_\bi_\bc_\by_\b:_\b:_\bC_\bo_\bm_\bm_\bP_\bo_\bl_\bi_\bc_\by_\b<_\b _\bV_\ba_\br_\bi_\ba_\bb_\bl_\be_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br_\b<_\b _\bF_\bi_\be_\bl_\bd_\bV_\be_\bc_\bt_\bo_\br_\b<_\b _\bK_\b,_\b _\bn_\b _\b>_\b,_\b _\bA_\b _\b>_\b _\b>_\b:_\b:\n-_\bg_\be_\bt_\bA_\bd_\bd_\br_\be_\bs_\bs\n-static const void * getAddress(const Type &v, int i)\n-_\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bm_\bm_\bP_\bo_\bl_\bi_\bc_\by_\b:_\b:_\bC_\bo_\bm_\bm_\bP_\bo_\bl_\bi_\bc_\by_\b<_\b _\bV_\ba_\br_\bi_\ba_\bb_\bl_\be_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br_\b<_\b _\bF_\bi_\be_\bl_\bd_\bV_\be_\bc_\bt_\bo_\br_\b<_\b _\bK_\b,_\b _\bn_\b _\b>_\b,_\b _\bA_\b _\b>_\b _\b>_\b:_\b:\n-_\bI_\bn_\bd_\be_\bx_\be_\bd_\bT_\by_\bp_\be\n-Type::B IndexedType\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn communicator.hh:182\n-_\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bm_\bm_\bP_\bo_\bl_\bi_\bc_\by_\b:_\b:_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\bE_\br_\br_\bo_\br\n-Error thrown if there was a problem with the communication.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn communicator.hh:195\n-_\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bm_\bm_\bP_\bo_\bl_\bi_\bc_\by_\b:_\b:_\bC_\bo_\bp_\by_\bG_\ba_\bt_\bh_\be_\br_\bS_\bc_\ba_\bt_\bt_\be_\br\n-GatherScatter default implementation that just copies data.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn communicator.hh:202\n-_\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bm_\bm_\bP_\bo_\bl_\bi_\bc_\by_\b:_\b:_\bC_\bo_\bp_\by_\bG_\ba_\bt_\bh_\be_\br_\bS_\bc_\ba_\bt_\bt_\be_\br_\b:_\b:_\bs_\bc_\ba_\bt_\bt_\be_\br\n-static void scatter(T &vec, const IndexedType &v, std::size_t i)\n-_\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bm_\bm_\bP_\bo_\bl_\bi_\bc_\by_\b:_\b:_\bC_\bo_\bp_\by_\bG_\ba_\bt_\bh_\be_\br_\bS_\bc_\ba_\bt_\bt_\be_\br_\b:_\b:_\bI_\bn_\bd_\be_\bx_\be_\bd_\bT_\by_\bp_\be\n-CommPolicy< T >::IndexedType IndexedType\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn communicator.hh:203\n-_\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bm_\bm_\bP_\bo_\bl_\bi_\bc_\by_\b:_\b:_\bC_\bo_\bp_\by_\bG_\ba_\bt_\bh_\be_\br_\bS_\bc_\ba_\bt_\bt_\be_\br_\b:_\b:_\bg_\ba_\bt_\bh_\be_\br\n-static const IndexedType & gather(const T &vec, std::size_t i)\n-_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bu_\bf_\bf_\be_\br_\be_\bd_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bo_\br\n-A communicator that uses buffers to gather and scatter the data to be send or\n-received.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn communicator.hh:458\n-_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bu_\bf_\bf_\be_\br_\be_\bd_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bo_\br_\b:_\b:_\bb_\ba_\bc_\bk_\bw_\ba_\br_\bd\n-void backward(Data &data)\n-Backward send where target and source are the same.\n-_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bu_\bf_\bf_\be_\br_\be_\bd_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bo_\br_\b:_\b:_\bB_\bu_\bf_\bf_\be_\br_\be_\bd_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bo_\br\n-BufferedCommunicator()\n-Constructor.\n-_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bu_\bf_\bf_\be_\br_\be_\bd_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bo_\br_\b:_\b:_\b~_\bB_\bu_\bf_\bf_\be_\br_\be_\bd_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bo_\br\n-~BufferedCommunicator()\n-Destructor.\n-_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bu_\bf_\bf_\be_\br_\be_\bd_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bo_\br_\b:_\b:_\bf_\bo_\br_\bw_\ba_\br_\bd\n-void forward(const Data &source, Data &dest)\n-Send from source to target.\n-_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bu_\bf_\bf_\be_\br_\be_\bd_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bo_\br_\b:_\b:_\bf_\br_\be_\be\n-void free()\n-Free the allocated memory (i.e. buffers and message information.\n-_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bu_\bf_\bf_\be_\br_\be_\bd_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bo_\br_\b:_\b:_\bb_\bu_\bi_\bl_\bd\n-std::enable_if< std::is_same< SizeOne, typenameCommPolicy< Data >::\n-IndexedTypeFlag >::value, void >::type build(const Interface &interface)\n-Build the buffers and information for the communication process.\n-_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bu_\bf_\bf_\be_\br_\be_\bd_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bo_\br_\b:_\b:_\bb_\ba_\bc_\bk_\bw_\ba_\br_\bd\n-void backward(Data &source, const Data &dest)\n-Communicate in the reverse direction, i.e. send from target to source.\n-_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bu_\bf_\bf_\be_\br_\be_\bd_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bo_\br_\b:_\b:_\bb_\bu_\bi_\bl_\bd\n-void build(const Data &source, const Data &target, const Interface &interface)\n-Build the buffers and information for the communication process.\n-_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bu_\bf_\bf_\be_\br_\be_\bd_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bo_\br_\b:_\b:_\bf_\bo_\br_\bw_\ba_\br_\bd\n-void forward(Data &data)\n-Forward send where target and source are the same.\n-_\bD_\bu_\bn_\be_\b:_\b:_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt\n-Manager class for the mapping between local indices and globally unique\n-indices.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn indexset.hh:218\n-_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bt_\be_\br_\bf_\ba_\bc_\be_\bB_\bu_\bi_\bl_\bd_\be_\br\n-Base class of all classes representing a communication interface.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn parallel/interface.hh:44\n-_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bt_\be_\br_\bf_\ba_\bc_\be_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn\n-Information describing an interface.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn parallel/interface.hh:110\n-_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bt_\be_\br_\bf_\ba_\bc_\be\n-Communication interface between remote and local indices.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn parallel/interface.hh:218\n-_\bD_\bu_\bn_\be_\b:_\b:_\bL_\bo_\bc_\ba_\bl_\bI_\bn_\bd_\be_\bx\n-An index present on the local process.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn localindex.hh:35\n-_\bD_\bu_\bn_\be_\b:_\b:_\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\bi_\bc_\be_\bs\n-The indices present on remote processes.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn remoteindices.hh:190\n-_\bD_\bu_\bn_\be_\b:_\b:_\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\bi_\bc_\be_\bs_\b:_\b:_\bG_\bl_\bo_\bb_\ba_\bl_\bI_\bn_\bd_\be_\bx\n-ParallelIndexSet::GlobalIndex GlobalIndex\n-The type of the global index.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn remoteindices.hh:216\n-_\bD_\bu_\bn_\be_\b:_\b:_\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\bi_\bc_\be_\bs_\b:_\b:_\bA_\bt_\bt_\br_\bi_\bb_\bu_\bt_\be\n-LocalIndex::Attribute Attribute\n-The type of the attribute.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn remoteindices.hh:227\n-_\bD_\bu_\bn_\be_\b:_\b:_\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\bi_\bc_\be_\bs_\b:_\b:_\bL_\bo_\bc_\ba_\bl_\bI_\bn_\bd_\be_\bx\n-ParallelIndexSet::LocalIndex LocalIndex\n-The type of the local index.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn remoteindices.hh:222\n-_\bi_\bn_\bt_\be_\br_\bf_\ba_\bc_\be_\b._\bh_\bh\n-Provides classes for building the communication interface between remote\n-indices.\n+_\bD_\bu_\bn_\be_\b:_\b:_\bg_\be_\bt_\bM_\bP_\bI_\bD_\ba_\bt_\ba\n+auto getMPIData(T &t)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mpidata.hh:44\n+_\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn\n+Collective communication interface and sequential default implementation.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn communication.hh:100\n+_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bv_\ba_\bl_\bi_\bd_\bF_\bu_\bt_\bu_\br_\be_\bE_\bx_\bc_\be_\bp_\bt_\bi_\bo_\bn\n+This exception is thrown when ready(), wait() or get() is called on an invalid\n+future....\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn future.hh:20\n+_\bD_\bu_\bn_\be_\b:_\b:_\bi_\bm_\bp_\bl_\b:_\b:_\bB_\bu_\bf_\bf_\be_\br\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mpifuture.hh:27\n+_\bD_\bu_\bn_\be_\b:_\b:_\bi_\bm_\bp_\bl_\b:_\b:_\bB_\bu_\bf_\bf_\be_\br_\b:_\b:_\bv_\ba_\bl_\bu_\be\n+std::unique_ptr< T > value\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mpifuture.hh:36\n+_\bD_\bu_\bn_\be_\b:_\b:_\bi_\bm_\bp_\bl_\b:_\b:_\bB_\bu_\bf_\bf_\be_\br_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b*\n+T & operator*() const\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mpifuture.hh:45\n+_\bD_\bu_\bn_\be_\b:_\b:_\bi_\bm_\bp_\bl_\b:_\b:_\bB_\bu_\bf_\bf_\be_\br_\b:_\b:_\bB_\bu_\bf_\bf_\be_\br\n+Buffer(V &&t)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mpifuture.hh:33\n+_\bD_\bu_\bn_\be_\b:_\b:_\bi_\bm_\bp_\bl_\b:_\b:_\bB_\bu_\bf_\bf_\be_\br_\b:_\b:_\bg_\be_\bt\n+T get()\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mpifuture.hh:37\n+_\bD_\bu_\bn_\be_\b:_\b:_\bi_\bm_\bp_\bl_\b:_\b:_\bB_\bu_\bf_\bf_\be_\br_\b:_\b:_\bB_\bu_\bf_\bf_\be_\br\n+Buffer(bool valid)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mpifuture.hh:28\n+_\bD_\bu_\bn_\be_\b:_\b:_\bi_\bm_\bp_\bl_\b:_\b:_\bB_\bu_\bf_\bf_\be_\br_\b<_\b _\bT_\b _\b&_\b _\b>_\b:_\b:_\bv_\ba_\bl_\bu_\be\n+std::optional< std::reference_wrapper< T > > value\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mpifuture.hh:61\n+_\bD_\bu_\bn_\be_\b:_\b:_\bi_\bm_\bp_\bl_\b:_\b:_\bB_\bu_\bf_\bf_\be_\br_\b<_\b _\bT_\b _\b&_\b _\b>_\b:_\b:_\bB_\bu_\bf_\bf_\be_\br\n+Buffer(bool valid=false)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mpifuture.hh:52\n+_\bD_\bu_\bn_\be_\b:_\b:_\bi_\bm_\bp_\bl_\b:_\b:_\bB_\bu_\bf_\bf_\be_\br_\b<_\b _\bT_\b _\b&_\b _\b>_\b:_\b:_\bg_\be_\bt\n+T & get()\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mpifuture.hh:62\n+_\bD_\bu_\bn_\be_\b:_\b:_\bi_\bm_\bp_\bl_\b:_\b:_\bB_\bu_\bf_\bf_\be_\br_\b<_\b _\bT_\b _\b&_\b _\b>_\b:_\b:_\bB_\bu_\bf_\bf_\be_\br\n+Buffer(V &&t)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mpifuture.hh:58\n+_\bD_\bu_\bn_\be_\b:_\b:_\bi_\bm_\bp_\bl_\b:_\b:_\bB_\bu_\bf_\bf_\be_\br_\b<_\b _\bv_\bo_\bi_\bd_\b _\b>_\b:_\b:_\bv_\ba_\bl_\bi_\bd_\b_\n+bool valid_\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mpifuture.hh:77\n+_\bD_\bu_\bn_\be_\b:_\b:_\bi_\bm_\bp_\bl_\b:_\b:_\bB_\bu_\bf_\bf_\be_\br_\b<_\b _\bv_\bo_\bi_\bd_\b _\b>_\b:_\b:_\bg_\be_\bt\n+void get()\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mpifuture.hh:84\n+_\bD_\bu_\bn_\be_\b:_\b:_\bi_\bm_\bp_\bl_\b:_\b:_\bB_\bu_\bf_\bf_\be_\br_\b<_\b _\bv_\bo_\bi_\bd_\b _\b>_\b:_\b:_\bB_\bu_\bf_\bf_\be_\br\n+Buffer(bool valid=false)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mpifuture.hh:78\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\bP_\bI_\bF_\bu_\bt_\bu_\br_\be\n+Provides a future-like object for MPI communication. It contains the object\n+that will be received and...\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mpifuture.hh:93\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\bP_\bI_\bF_\bu_\bt_\bu_\br_\be_\b:_\b:_\bM_\bP_\bI_\bF_\bu_\bt_\bu_\br_\be\n+MPIFuture(V &&recv_data, typename std::enable_if_t::value >\n+*=0)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mpifuture.hh:115\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\bP_\bI_\bF_\bu_\bt_\bu_\br_\be_\b:_\b:_\br_\be_\ba_\bd_\by\n+bool ready() const\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mpifuture.hh:157\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\bP_\bI_\bF_\bu_\bt_\bu_\br_\be_\b:_\b:_\bv_\ba_\bl_\bi_\bd\n+bool valid() const\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mpifuture.hh:147\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\bP_\bI_\bF_\bu_\bt_\bu_\br_\be_\b:_\b:_\b~_\bM_\bP_\bI_\bF_\bu_\bt_\bu_\br_\be\n+~MPIFuture()\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mpifuture.hh:120\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\bP_\bI_\bF_\bu_\bt_\bu_\br_\be_\b:_\b:_\bM_\bP_\bI_\bF_\bu_\bt_\bu_\br_\be\n+MPIFuture(bool valid=false)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mpifuture.hh:100\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\bP_\bI_\bF_\bu_\bt_\bu_\br_\be_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b=\n+MPIFuture & operator=(MPIFuture &&f)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mpifuture.hh:139\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\bP_\bI_\bF_\bu_\bt_\bu_\br_\be_\b:_\b:_\bg_\be_\bt_\b__\bs_\be_\bn_\bd_\b__\bm_\bp_\bi_\bd_\ba_\bt_\ba\n+auto get_send_mpidata()\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mpifuture.hh:177\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\bP_\bI_\bF_\bu_\bt_\bu_\br_\be_\b:_\b:_\bw_\ba_\bi_\bt\n+void wait()\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mpifuture.hh:151\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\bP_\bI_\bF_\bu_\bt_\bu_\br_\be_\b:_\b:_\bg_\be_\bt_\b__\bm_\bp_\bi_\bd_\ba_\bt_\ba\n+auto get_mpidata()\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mpifuture.hh:173\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\bP_\bI_\bF_\bu_\bt_\bu_\br_\be_\b:_\b:_\bg_\be_\bt\n+R get()\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mpifuture.hh:163\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\bP_\bI_\bF_\bu_\bt_\bu_\br_\be_\b:_\b:_\bM_\bP_\bI_\bF_\bu_\bt_\bu_\br_\be\n+MPIFuture(V &&recv_data, U &&send_data, typename std::enable_if_t::value &&!std::is_void< U >::value > *=0)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mpifuture.hh:107\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\bP_\bI_\bF_\bu_\bt_\bu_\br_\be_\b:_\b:_\bg_\be_\bt_\b__\bs_\be_\bn_\bd_\b__\bd_\ba_\bt_\ba\n+S get_send_data()\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mpifuture.hh:168\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\bP_\bI_\bF_\bu_\bt_\bu_\br_\be_\b:_\b:_\bM_\bP_\bI_\bF_\bu_\bt_\bu_\br_\be\n+MPIFuture(MPIFuture &&f)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mpifuture.hh:130\n ===============================================================================\n Generated by\u00a0_\b[_\bd_\bo_\bx_\by_\bg_\be_\bn_\b] 1.9.8\n"}]}, {"source1": "./usr/share/doc/libdune-common-doc/doxygen/a00047.html", "source2": "./usr/share/doc/libdune-common-doc/doxygen/a00047.html", "unified_diff": "@@ -1,15 +1,15 @@\n \n \n \n \n \n \n \n-dune-common: parmetis.hh File Reference\n+dune-common: mpihelper.hh File Reference\n \n \n \n \n \n \n \n@@ -69,19 +69,69 @@\n \n \n
    \n
    \n-
    parmetis.hh File Reference
    \n+ \n+
    mpihelper.hh File Reference
    \n
    \n
    \n \n+

    Helpers for dealing with MPI. \n+More...

    \n+
    #include <cassert>
    \n+#include <mutex>
    \n+#include <mpi.h>
    \n+#include <dune/common/exceptions.hh>
    \n+#include <dune/common/visibility.hh>
    \n+#include <dune/common/parallel/communication.hh>
    \n+#include <dune/common/parallel/mpicommunication.hh>
    \n+#include <dune/common/stdstreams.hh>
    \n+
    \n

    Go to the source code of this file.

    \n-
    \n+\n+\n+\n+\n+\n+\n+\n+\n+

    \n+Classes

    class  Dune::FakeMPIHelper
     A fake mpi helper. More...
     
    class  Dune::MPIHelper
     A real mpi helper. More...
     
    \n+\n+\n+\n+\n+

    \n+Namespaces

    namespace  Dune
     Dune namespace.
     
    \n+

    Detailed Description

    \n+

    Helpers for dealing with MPI.

    \n+

    Basically there are two helpers available:

    \n+
    FakeMPIHelper
    \n+
    A class adhering to the interface of MPIHelper that does not need MPI at all. This can be used to create a sequential program even if MPI is used to compile it.
    \n+
    MPIHelper
    \n+
    A real MPI helper. When the singleton gets instantiated MPI_Init will be called and before the program exits MPI_Finalize will be called.
    \n+
    \n+

    Example of who to use these classes:

    \n+

    A program that is parallel if compiled with MPI and sequential otherwise:

    int main(int argc, char** argv){
    \n+
    typedef Dune::MPIHelper MPIHelper;
    \n+
    MPIHelper::instance(argc, argv);
    \n+
    typename MPIHelper::MPICommunicator world =
    \n+
    MPIHelper::getCommunicator();
    \n+
    ...
    \n+
    int main(int argc, char **argv)
    Definition mpi_collective_benchmark.cc:297
    \n+
    A real mpi helper.
    Definition mpihelper.hh:181
    \n+

    If one wants to have sequential program even if the code is compiled with mpi then one simply has to exchange the typedef with

    typedef Dune::MPIHelper FakeMPIHelper;
    \n+

    .

    \n+

    For checking whether we really use MPI or just fake please use MPIHelper::isFake (this is also possible at compile time!)

    \n+
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,11 +1,63 @@\n dune-common\u00a02.10\n Loading...\n Searching...\n No Matches\n * _\bd_\bu_\bn_\be\n * _\bc_\bo_\bm_\bm_\bo_\bn\n * _\bp_\ba_\br_\ba_\bl_\bl_\be_\bl\n-parmetis.hh File Reference\n+_\bC_\bl_\ba_\bs_\bs_\be_\bs | _\bN_\ba_\bm_\be_\bs_\bp_\ba_\bc_\be_\bs\n+mpihelper.hh File Reference\n+_\bC_\bo_\bm_\bm_\bo_\bn \u00bb _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\b _\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn\n+Helpers for dealing with MPI. _\bM_\bo_\br_\be_\b._\b._\b.\n+#include \n+#include \n+#include \n+#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\be_\bx_\bc_\be_\bp_\bt_\bi_\bo_\bn_\bs_\b._\bh_\bh>\n+#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bv_\bi_\bs_\bi_\bb_\bi_\bl_\bi_\bt_\by_\b._\bh_\bh>\n+#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bp_\ba_\br_\ba_\bl_\bl_\be_\bl_\b/_\bc_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b._\bh_\bh>\n+#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bp_\ba_\br_\ba_\bl_\bl_\be_\bl_\b/_\bm_\bp_\bi_\bc_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b._\bh_\bh>\n+#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bs_\bt_\bd_\bs_\bt_\br_\be_\ba_\bm_\bs_\b._\bh_\bh>\n _\bG_\bo_\b _\bt_\bo_\b _\bt_\bh_\be_\b _\bs_\bo_\bu_\br_\bc_\be_\b _\bc_\bo_\bd_\be_\b _\bo_\bf_\b _\bt_\bh_\bi_\bs_\b _\bf_\bi_\bl_\be_\b.\n+C\bCl\bla\bas\bss\bse\bes\bs\n+class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bF_\ba_\bk_\be_\bM_\bP_\bI_\bH_\be_\bl_\bp_\be_\br\n+\u00a0 A fake mpi helper. _\bM_\bo_\br_\be_\b._\b._\b.\n+\u00a0\n+class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bM_\bP_\bI_\bH_\be_\bl_\bp_\be_\br\n+\u00a0 A real mpi helper. _\bM_\bo_\br_\be_\b._\b._\b.\n+\u00a0\n+N\bNa\bam\bme\bes\bsp\bpa\bac\bce\bes\bs\n+namespace \u00a0 _\bD_\bu_\bn_\be\n+\u00a0 _\bD_\bu_\bn_\be namespace.\n+\u00a0\n+*\b**\b**\b**\b**\b* D\bDe\bet\bta\bai\bil\ble\bed\bd D\bDe\bes\bsc\bcr\bri\bip\bpt\bti\bio\bon\bn *\b**\b**\b**\b**\b*\n+Helpers for dealing with MPI.\n+Basically there are two helpers available:\n+ FakeMPIHelper\n+ A class adhering to the interface of MPIHelper that does not need MPI at\n+ all. This can be used to create a sequential program even if MPI is used\n+ to compile it.\n+ MPIHelper\n+ A real MPI helper. When the singleton gets instantiated MPI_Init will be\n+ called and before the program exits MPI_Finalize will be called.\n+Example of who to use these classes:\n+A program that is parallel if compiled with MPI and sequential otherwise:\n+int _\bm_\ba_\bi_\bn(int argc, char** argv){\n+typedef _\bD_\bu_\bn_\be_\b:_\b:_\bM_\bP_\bI_\bH_\be_\bl_\bp_\be_\br MPIHelper;\n+MPIHelper::instance(argc, argv);\n+typename MPIHelper::MPICommunicator world =\n+MPIHelper::getCommunicator();\n+...\n+_\bm_\ba_\bi_\bn\n+int main(int argc, char **argv)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mpi_collective_benchmark.cc:297\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\bP_\bI_\bH_\be_\bl_\bp_\be_\br\n+A real mpi helper.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mpihelper.hh:181\n+If one wants to have sequential program even if the code is compiled with mpi\n+then one simply has to exchange the typedef with\n+typedef _\bD_\bu_\bn_\be_\b:_\b:_\bM_\bP_\bI_\bH_\be_\bl_\bp_\be_\br FakeMPIHelper;\n+.\n+For checking whether we really use MPI or just fake please use MPIHelper::\n+isFake (this is also possible at compile time!)\n ===============================================================================\n Generated by\u00a0_\b[_\bd_\bo_\bx_\by_\bg_\be_\bn_\b] 1.9.8\n"}]}, {"source1": "./usr/share/doc/libdune-common-doc/doxygen/a00047_source.html", "source2": "./usr/share/doc/libdune-common-doc/doxygen/a00047_source.html", "unified_diff": "@@ -1,15 +1,15 @@\n \n \n \n \n \n \n \n-dune-common: parmetis.hh Source File\n+dune-common: mpihelper.hh Source File\n \n \n \n \n \n \n \n@@ -74,61 +74,257 @@\n \n \n \n
    \n-
    parmetis.hh
    \n+
    mpihelper.hh
    \n
    \n
    \n Go to the documentation of this file.
    1// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
    \n
    2// vi: set et ts=4 sw=2 sts=2:
    \n
    3// SPDX-FileCopyrightInfo: Copyright \u00a9 DUNE Project contributors, see file LICENSE.md in module root
    \n
    4// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception
    \n-
    5#ifndef DUNE_PARMETIS_HH
    \n-
    6#define DUNE_PARMETIS_HH
    \n+
    5#ifndef DUNE_COMMON_PARALLEL_MPIHELPER_HH
    \n+
    6#define DUNE_COMMON_PARALLEL_MPIHELPER_HH
    \n
    7
    \n-
    15#if HAVE_PARMETIS
    \n-
    16
    \n-
    17#if HAVE_MPI
    \n-
    18#include <mpi.h>
    \n-
    19#endif
    \n-
    20
    \n-
    21#if HAVE_PTSCOTCH_PARMETIS
    \n-
    22extern "C" {
    \n-
    23 #include <ptscotch.h>
    \n-
    24}
    \n-
    25#endif
    \n-
    26
    \n-
    27extern "C" {
    \n-
    28 #include <parmetis.h>
    \n-
    29}
    \n-
    30
    \n-
    31namespace Dune::ParMetis {
    \n-
    32
    \n-
    33#if defined(REALTYPEWIDTH)
    \n-
    34 using real_t = ::real_t;
    \n-
    35#else
    \n-
    36 using real_t = float;
    \n-
    37#endif
    \n-
    38
    \n-
    39#if defined(IDXTYPEWIDTH)
    \n-
    40 using idx_t = ::idx_t;
    \n-
    41#elif HAVE_PTSCOTCH_PARMETIS
    \n-
    42 using idx_t = SCOTCH_Num;
    \n-
    43#else
    \n-
    44 using idx_t = int;
    \n-
    45#endif
    \n-
    46
    \n-
    47} // end namespace Dune::ParMetis
    \n-
    48
    \n-
    49#endif // HAVE_PARMETIS
    \n-
    50#endif // DUNE_PARMETIS_HH
    \n-
    typename FieldTraits< Type >::real_type real_t
    Convenient access to FieldTraits<Type>::real_type.
    Definition typetraits.hh:301
    \n+
    8#include <cassert>
    \n+
    9#include <mutex>
    \n+
    10
    \n+
    11#if HAVE_MPI
    \n+
    12#include <mpi.h>
    \n+
    13#endif
    \n+
    14
    \n+\n+\n+\n+\n+
    19
    \n+
    20#if HAVE_MPI
    \n+\n+
    22#endif
    \n+
    23
    \n+
    24namespace Dune
    \n+
    25{
    \n+
    \n+\n+
    76 {
    \n+
    77 public:
    \n+
    82 constexpr static bool isFake = true;
    \n+
    83
    \n+\n+
    88
    \n+
    \n+\n+
    96 {
    \n+
    97 static MPICommunicator comm;
    \n+
    98 return comm;
    \n+
    99 }
    \n+
    \n+
    100
    \n+
    \n+\n+
    108 {
    \n+
    109 return getCommunicator();
    \n+
    110 }
    \n+
    \n+
    111
    \n+
    112
    \n+
    113
    \n+
    119 [[deprecated("getCollectionCommunication is deprecated. Use getCommunication instead.")]]
    \n+\n+
    124
    \n+\n+
    \n+\n+
    127 {
    \n+\n+
    129 }
    \n+
    \n+
    130
    \n+
    \n+
    146 DUNE_EXPORT static FakeMPIHelper& instance([[maybe_unused]] int argc,
    \n+
    147 [[maybe_unused]] char** argv)
    \n+
    148 {
    \n+
    149 return instance();
    \n+
    150 }
    \n+
    \n+
    151
    \n+
    \n+\n+
    153 {
    \n+
    154 static FakeMPIHelper singleton;
    \n+
    155 return singleton;
    \n+
    156 }
    \n+
    \n+
    157
    \n+
    161 int rank () const { return 0; }
    \n+
    165 int size () const { return 1; }
    \n+
    166
    \n+
    167 private:
    \n+
    168 FakeMPIHelper() {}
    \n+
    169 FakeMPIHelper(const FakeMPIHelper&);
    \n+
    170 FakeMPIHelper& operator=(const FakeMPIHelper);
    \n+
    171 };
    \n+
    \n+
    172
    \n+
    173#if HAVE_MPI
    \n+
    \n+\n+
    181 {
    \n+
    182 public:
    \n+
    187 constexpr static bool isFake = false;
    \n+
    188
    \n+
    192 typedef MPI_Comm MPICommunicator;
    \n+
    193
    \n+
    \n+\n+
    201 {
    \n+
    202 return MPI_COMM_WORLD;
    \n+
    203 }
    \n+
    \n+
    204
    \n+
    \n+\n+
    212 {
    \n+
    213 return MPI_COMM_SELF;
    \n+
    214 }
    \n+
    \n+
    215
    \n+
    221 [[deprecated("getCollectionCommunication is deprecated. Use getCommunication instead.")]]
    \n+\n+\n+
    227
    \n+\n+
    \n+\n+
    230 {
    \n+\n+
    232 }
    \n+
    \n+
    \n+
    252 DUNE_EXPORT static MPIHelper& instance(int& argc, char**& argv)
    \n+
    253 {
    \n+
    254 return instance(&argc, &argv);
    \n+
    255 }
    \n+
    \n+
    256
    \n+
    \n+
    284 DUNE_EXPORT static MPIHelper& instance(int* argc = nullptr, char*** argv = nullptr)
    \n+
    285 {
    \n+
    286 assert((argc == nullptr) == (argv == nullptr));
    \n+
    287 static MPIHelper instance{argc, argv};
    \n+
    288 return instance;
    \n+
    289 }
    \n+
    \n+
    290
    \n+
    294 int rank () const { return rank_; }
    \n+
    298 int size () const { return size_; }
    \n+
    299
    \n+
    \n+\n+
    302 {
    \n+
    303 int wasFinalized = -1;
    \n+
    304 MPI_Finalized( &wasFinalized );
    \n+
    305 if(!wasFinalized && initializedHere_)
    \n+
    306 {
    \n+
    307 MPI_Finalize();
    \n+
    308 dverb << "Called MPI_Finalize on p=" << rank_ << "!" <<std::endl;
    \n+
    309 }
    \n+
    310
    \n+
    311 }
    \n+
    \n+
    312
    \n+
    313 private:
    \n+
    314 int rank_;
    \n+
    315 int size_;
    \n+
    316 bool initializedHere_;
    \n+
    317 void prevent_warning(int){}
    \n+
    318
    \n+
    320 MPIHelper(int* argc, char*** argv)
    \n+
    321 : initializedHere_(false)
    \n+
    322 {
    \n+
    323 int wasInitialized = -1;
    \n+
    324 MPI_Initialized( &wasInitialized );
    \n+
    325 if(!wasInitialized)
    \n+
    326 {
    \n+
    327 rank_ = -1;
    \n+
    328 size_ = -1;
    \n+
    329 static int is_initialized = MPI_Init(argc, argv);
    \n+
    330 prevent_warning(is_initialized);
    \n+
    331 initializedHere_ = true;
    \n+
    332 }
    \n+
    333
    \n+
    334 MPI_Comm_rank(MPI_COMM_WORLD,&rank_);
    \n+
    335 MPI_Comm_size(MPI_COMM_WORLD,&size_);
    \n+
    336
    \n+
    337 assert( rank_ >= 0 );
    \n+
    338 assert( size_ >= 1 );
    \n+
    339
    \n+
    340 dverb << "Called MPI_Init on p=" << rank_ << "!" << std::endl;
    \n+
    341 }
    \n+
    342
    \n+
    343 MPIHelper(const MPIHelper&);
    \n+
    344 MPIHelper& operator=(const MPIHelper);
    \n+
    345 };
    \n+
    \n+
    346#else // !HAVE_MPI
    \n+
    347 // We do not have MPI therefore FakeMPIHelper
    \n+
    348 // is the MPIHelper
    \n+
    353 typedef FakeMPIHelper MPIHelper;
    \n+
    354
    \n+
    355#endif // !HAVE_MPI
    \n+
    356
    \n+
    357} // end namespace Dune
    \n+
    358
    \n+
    359#endif // DUNE_COMMON_PARALLEL_MPIHELPER_HH
    \n+
    Implements an utility class that provides collective communication methods for sequential programs.
    \n+
    Implements an utility class that provides MPI's collective communication methods.
    \n+
    Standard Dune debug streams.
    \n+
    A few common exception classes.
    \n+
    Definition of macros controlling symbol visibility at the ABI level.
    \n+
    #define DUNE_EXPORT
    Export a symbol as part of the public ABI.
    Definition visibility.hh:20
    \n+
    DVerbType dverb(std::cout)
    Singleton of verbose debug stream.
    Definition stdstreams.hh:117
    \n+
    Dune namespace.
    Definition alignedallocator.hh:13
    \n+
    Definition communication.hh:46
    \n+
    Collective communication interface and sequential default implementation.
    Definition communication.hh:100
    \n+
    A fake mpi helper.
    Definition mpihelper.hh:76
    \n+
    static DUNE_EXPORT MPICommunicator getCommunicator()
    get the default communicator
    Definition mpihelper.hh:95
    \n+
    int size() const
    return rank of process, i.e. one
    Definition mpihelper.hh:165
    \n+
    static Communication< MPICommunicator > getCollectiveCommunication()
    Definition mpihelper.hh:120
    \n+
    static MPICommunicator getLocalCommunicator()
    get a local communicator
    Definition mpihelper.hh:107
    \n+
    No_Comm MPICommunicator
    The type of the mpi communicator.
    Definition mpihelper.hh:87
    \n+
    static DUNE_EXPORT FakeMPIHelper & instance(int argc, char **argv)
    Get the singleton instance of the helper.
    Definition mpihelper.hh:146
    \n+
    static DUNE_EXPORT FakeMPIHelper & instance()
    Definition mpihelper.hh:152
    \n+
    static Communication< MPICommunicator > getCommunication()
    Definition mpihelper.hh:126
    \n+
    static constexpr bool isFake
    Are we fake (i.e. pretend to have MPI support but are compiled without.)
    Definition mpihelper.hh:82
    \n+
    int rank() const
    return rank of process, i.e. zero
    Definition mpihelper.hh:161
    \n+
    A real mpi helper.
    Definition mpihelper.hh:181
    \n+
    int size() const
    return number of processes
    Definition mpihelper.hh:298
    \n+
    static constexpr bool isFake
    Are we fake (i. e. pretend to have MPI support but are compiled without.
    Definition mpihelper.hh:187
    \n+
    static DUNE_EXPORT MPIHelper & instance(int *argc=nullptr, char ***argv=nullptr)
    Get the singleton instance of the helper.
    Definition mpihelper.hh:284
    \n+
    static DUNE_EXPORT MPIHelper & instance(int &argc, char **&argv)
    Get the singleton instance of the helper.
    Definition mpihelper.hh:252
    \n+
    static Communication< MPICommunicator > getCommunication()
    Definition mpihelper.hh:229
    \n+
    ~MPIHelper()
    calls MPI_Finalize
    Definition mpihelper.hh:301
    \n+
    int rank() const
    return rank of process
    Definition mpihelper.hh:294
    \n+
    MPI_Comm MPICommunicator
    The type of the mpi communicator.
    Definition mpihelper.hh:192
    \n+
    static MPICommunicator getCommunicator()
    get the default communicator
    Definition mpihelper.hh:200
    \n+
    static MPICommunicator getLocalCommunicator()
    get a local communicator
    Definition mpihelper.hh:211
    \n+
    static Communication< MPICommunicator > getCollectiveCommunication()
    Definition mpihelper.hh:223
    \n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,59 +1,306 @@\n dune-common\u00a02.10\n Loading...\n Searching...\n No Matches\n * _\bd_\bu_\bn_\be\n * _\bc_\bo_\bm_\bm_\bo_\bn\n * _\bp_\ba_\br_\ba_\bl_\bl_\be_\bl\n-parmetis.hh\n+mpihelper.hh\n _\bG_\bo_\b _\bt_\bo_\b _\bt_\bh_\be_\b _\bd_\bo_\bc_\bu_\bm_\be_\bn_\bt_\ba_\bt_\bi_\bo_\bn_\b _\bo_\bf_\b _\bt_\bh_\bi_\bs_\b _\bf_\bi_\bl_\be_\b.\n 1// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-\n 2// vi: set et ts=4 sw=2 sts=2:\n 3// SPDX-FileCopyrightInfo: Copyright \u00c2\u00a9 DUNE Project contributors, see file\n LICENSE.md in module root\n 4// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception\n-5#ifndef DUNE_PARMETIS_HH\n-6#define DUNE_PARMETIS_HH\n+5#ifndef DUNE_COMMON_PARALLEL_MPIHELPER_HH\n+6#define DUNE_COMMON_PARALLEL_MPIHELPER_HH\n 7\n-15#if HAVE_PARMETIS\n-16\n-17#if HAVE_MPI\n-18#include \n-19#endif\n-20\n-21#if HAVE_PTSCOTCH_PARMETIS\n-22extern \"C\" {\n-23 #include \n-24}\n-25#endif\n-26\n-27extern \"C\" {\n-28 #include \n-29}\n-30\n-31namespace Dune::ParMetis {\n-32\n-33#if defined(REALTYPEWIDTH)\n-34 using _\br_\be_\ba_\bl_\b__\bt = ::real_t;\n-35#else\n-36 using _\br_\be_\ba_\bl_\b__\bt = float;\n-37#endif\n-38\n-39#if defined(IDXTYPEWIDTH)\n-40 using idx_t = ::idx_t;\n-41#elif HAVE_PTSCOTCH_PARMETIS\n-42 using idx_t = SCOTCH_Num;\n-43#else\n-44 using idx_t = int;\n-45#endif\n-46\n-47} // end namespace Dune::ParMetis\n-48\n-49#endif // HAVE_PARMETIS\n-50#endif // DUNE_PARMETIS_HH\n-_\bD_\bu_\bn_\be_\b:_\b:_\br_\be_\ba_\bl_\b__\bt\n-typename FieldTraits< Type >::real_type real_t\n-Convenient access to FieldTraits::real_type.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn typetraits.hh:301\n+8#include \n+9#include \n+10\n+11#if HAVE_MPI\n+12#include \n+13#endif\n+14\n+15#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\be_\bx_\bc_\be_\bp_\bt_\bi_\bo_\bn_\bs_\b._\bh_\bh>\n+16#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bv_\bi_\bs_\bi_\bb_\bi_\bl_\bi_\bt_\by_\b._\bh_\bh>\n+17#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bp_\ba_\br_\ba_\bl_\bl_\be_\bl_\b/_\bc_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b._\bh_\bh>\n+18#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bp_\ba_\br_\ba_\bl_\bl_\be_\bl_\b/_\bm_\bp_\bi_\bc_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b._\bh_\bh>\n+19\n+20#if HAVE_MPI\n+21#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bs_\bt_\bd_\bs_\bt_\br_\be_\ba_\bm_\bs_\b._\bh_\bh>\n+22#endif\n+23\n+24namespace _\bD_\bu_\bn_\be\n+25{\n+_\b7_\b5 class _\bF_\ba_\bk_\be_\bM_\bP_\bI_\bH_\be_\bl_\bp_\be_\br\n+76 {\n+77 public:\n+_\b8_\b2 constexpr static bool _\bi_\bs_\bF_\ba_\bk_\be = true;\n+83\n+_\b8_\b7 typedef _\bN_\bo_\b__\bC_\bo_\bm_\bm _\bM_\bP_\bI_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bo_\br;\n+88\n+_\b9_\b5 _\bD_\bU_\bN_\bE_\b__\bE_\bX_\bP_\bO_\bR_\bT static _\bM_\bP_\bI_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bo_\br _\bg_\be_\bt_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bo_\br ()\n+96 {\n+97 static _\bM_\bP_\bI_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bo_\br comm;\n+98 return comm;\n+99 }\n+100\n+_\b1_\b0_\b7 static _\bM_\bP_\bI_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bo_\br _\bg_\be_\bt_\bL_\bo_\bc_\ba_\bl_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bo_\br ()\n+108 {\n+109 return _\bg_\be_\bt_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bo_\br();\n+110 }\n+111\n+112\n+113\n+119 [[deprecated(\"getCollectionCommunication is deprecated. Use\n+getCommunication instead.\")]]\n+_\b1_\b2_\b0 static _\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b<_\bM_\bP_\bI_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bo_\br_\b> _\bg_\be_\bt_\bC_\bo_\bl_\bl_\be_\bc_\bt_\bi_\bv_\be_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn()\n+121 {\n+122 return _\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b<_\bM_\bP_\bI_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bo_\br_\b>(_\bg_\be_\bt_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bo_\br());\n+123 }\n+124\n+125 static _\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b<_\bM_\bP_\bI_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bo_\br_\b>\n+_\b1_\b2_\b6 _\bg_\be_\bt_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn()\n+127 {\n+128 return _\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b<_\bM_\bP_\bI_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bo_\br_\b>(_\bg_\be_\bt_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bo_\br());\n+129 }\n+130\n+_\b1_\b4_\b6 _\bD_\bU_\bN_\bE_\b__\bE_\bX_\bP_\bO_\bR_\bT static _\bF_\ba_\bk_\be_\bM_\bP_\bI_\bH_\be_\bl_\bp_\be_\br& _\bi_\bn_\bs_\bt_\ba_\bn_\bc_\be([[maybe_unused]] int argc,\n+147 [[maybe_unused]] char** argv)\n+148 {\n+149 return _\bi_\bn_\bs_\bt_\ba_\bn_\bc_\be();\n+150 }\n+151\n+_\b1_\b5_\b2 _\bD_\bU_\bN_\bE_\b__\bE_\bX_\bP_\bO_\bR_\bT static _\bF_\ba_\bk_\be_\bM_\bP_\bI_\bH_\be_\bl_\bp_\be_\br& _\bi_\bn_\bs_\bt_\ba_\bn_\bc_\be()\n+153 {\n+154 static _\bF_\ba_\bk_\be_\bM_\bP_\bI_\bH_\be_\bl_\bp_\be_\br singleton;\n+155 return singleton;\n+156 }\n+157\n+_\b1_\b6_\b1 int _\br_\ba_\bn_\bk () const { return 0; }\n+_\b1_\b6_\b5 int _\bs_\bi_\bz_\be () const { return 1; }\n+166\n+167 private:\n+168 _\bF_\ba_\bk_\be_\bM_\bP_\bI_\bH_\be_\bl_\bp_\be_\br() {}\n+169 FakeMPIHelper(const FakeMPIHelper&);\n+170 FakeMPIHelper& operator=(const FakeMPIHelper);\n+171 };\n+172\n+173#if HAVE_MPI\n+_\b1_\b8_\b0 class _\bM_\bP_\bI_\bH_\be_\bl_\bp_\be_\br\n+181 {\n+182 public:\n+_\b1_\b8_\b7 constexpr static bool _\bi_\bs_\bF_\ba_\bk_\be = false;\n+188\n+_\b1_\b9_\b2 typedef MPI_Comm _\bM_\bP_\bI_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bo_\br;\n+193\n+_\b2_\b0_\b0 static _\bM_\bP_\bI_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bo_\br _\bg_\be_\bt_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bo_\br ()\n+201 {\n+202 return MPI_COMM_WORLD;\n+203 }\n+204\n+_\b2_\b1_\b1 static _\bM_\bP_\bI_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bo_\br _\bg_\be_\bt_\bL_\bo_\bc_\ba_\bl_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bo_\br ()\n+212 {\n+213 return MPI_COMM_SELF;\n+214 }\n+215\n+221 [[deprecated(\"getCollectionCommunication is deprecated. Use\n+getCommunication instead.\")]]\n+222 static _\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b<_\bM_\bP_\bI_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bo_\br_\b>\n+_\b2_\b2_\b3 _\bg_\be_\bt_\bC_\bo_\bl_\bl_\be_\bc_\bt_\bi_\bv_\be_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn()\n+224 {\n+225 return _\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b<_\bM_\bP_\bI_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bo_\br_\b>(_\bg_\be_\bt_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bo_\br());\n+226 }\n+227\n+228 static _\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b<_\bM_\bP_\bI_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bo_\br_\b>\n+_\b2_\b2_\b9 _\bg_\be_\bt_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn()\n+230 {\n+231 return _\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b<_\bM_\bP_\bI_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bo_\br_\b>(_\bg_\be_\bt_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bo_\br());\n+232 }\n+_\b2_\b5_\b2 _\bD_\bU_\bN_\bE_\b__\bE_\bX_\bP_\bO_\bR_\bT static _\bM_\bP_\bI_\bH_\be_\bl_\bp_\be_\br& _\bi_\bn_\bs_\bt_\ba_\bn_\bc_\be(int& argc, char**& argv)\n+253 {\n+254 return _\bi_\bn_\bs_\bt_\ba_\bn_\bc_\be(&argc, &argv);\n+255 }\n+256\n+_\b2_\b8_\b4 _\bD_\bU_\bN_\bE_\b__\bE_\bX_\bP_\bO_\bR_\bT static _\bM_\bP_\bI_\bH_\be_\bl_\bp_\be_\br& _\bi_\bn_\bs_\bt_\ba_\bn_\bc_\be(int* argc = nullptr, char*** argv =\n+nullptr)\n+285 {\n+286 assert((argc == nullptr) == (argv == nullptr));\n+287 static _\bM_\bP_\bI_\bH_\be_\bl_\bp_\be_\br _\bi_\bn_\bs_\bt_\ba_\bn_\bc_\be{argc, argv};\n+288 return _\bi_\bn_\bs_\bt_\ba_\bn_\bc_\be;\n+289 }\n+290\n+_\b2_\b9_\b4 int _\br_\ba_\bn_\bk () const { return rank_; }\n+_\b2_\b9_\b8 int _\bs_\bi_\bz_\be () const { return size_; }\n+299\n+_\b3_\b0_\b1 _\b~_\bM_\bP_\bI_\bH_\be_\bl_\bp_\be_\br()\n+302 {\n+303 int wasFinalized = -1;\n+304 MPI_Finalized( &wasFinalized );\n+305 if(!wasFinalized && initializedHere_)\n+306 {\n+307 MPI_Finalize();\n+308 _\bd_\bv_\be_\br_\bb << \"Called MPI_Finalize on p=\" << rank_ << \"!\" <= 0 );\n+338 assert( size_ >= 1 );\n+339\n+340 _\bd_\bv_\be_\br_\bb << \"Called MPI_Init on p=\" << rank_ << \"!\" << std::endl;\n+341 }\n+342\n+343 MPIHelper(const MPIHelper&);\n+344 MPIHelper& operator=(const MPIHelper);\n+345 };\n+346#else // !HAVE_MPI\n+347 // We do not have MPI therefore FakeMPIHelper\n+348 // is the MPIHelper\n+353 typedef FakeMPIHelper MPIHelper;\n+354\n+355#endif // !HAVE_MPI\n+356\n+357} // end namespace Dune\n+358\n+359#endif // DUNE_COMMON_PARALLEL_MPIHELPER_HH\n+_\bc_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b._\bh_\bh\n+Implements an utility class that provides collective communication methods for\n+sequential programs.\n+_\bm_\bp_\bi_\bc_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b._\bh_\bh\n+Implements an utility class that provides MPI's collective communication\n+methods.\n+_\bs_\bt_\bd_\bs_\bt_\br_\be_\ba_\bm_\bs_\b._\bh_\bh\n+Standard Dune debug streams.\n+_\be_\bx_\bc_\be_\bp_\bt_\bi_\bo_\bn_\bs_\b._\bh_\bh\n+A few common exception classes.\n+_\bv_\bi_\bs_\bi_\bb_\bi_\bl_\bi_\bt_\by_\b._\bh_\bh\n+Definition of macros controlling symbol visibility at the ABI level.\n+_\bD_\bU_\bN_\bE_\b__\bE_\bX_\bP_\bO_\bR_\bT\n+#define DUNE_EXPORT\n+Export a symbol as part of the public ABI.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn visibility.hh:20\n+_\bD_\bu_\bn_\be_\b:_\b:_\bd_\bv_\be_\br_\bb\n+DVerbType dverb(std::cout)\n+Singleton of verbose debug stream.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn stdstreams.hh:117\n+_\bD_\bu_\bn_\be\n+Dune namespace.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn alignedallocator.hh:13\n+_\bD_\bu_\bn_\be_\b:_\b:_\bN_\bo_\b__\bC_\bo_\bm_\bm\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn communication.hh:46\n+_\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn\n+Collective communication interface and sequential default implementation.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn communication.hh:100\n+_\bD_\bu_\bn_\be_\b:_\b:_\bF_\ba_\bk_\be_\bM_\bP_\bI_\bH_\be_\bl_\bp_\be_\br\n+A fake mpi helper.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mpihelper.hh:76\n+_\bD_\bu_\bn_\be_\b:_\b:_\bF_\ba_\bk_\be_\bM_\bP_\bI_\bH_\be_\bl_\bp_\be_\br_\b:_\b:_\bg_\be_\bt_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bo_\br\n+static DUNE_EXPORT MPICommunicator getCommunicator()\n+get the default communicator\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mpihelper.hh:95\n+_\bD_\bu_\bn_\be_\b:_\b:_\bF_\ba_\bk_\be_\bM_\bP_\bI_\bH_\be_\bl_\bp_\be_\br_\b:_\b:_\bs_\bi_\bz_\be\n+int size() const\n+return rank of process, i.e. one\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mpihelper.hh:165\n+_\bD_\bu_\bn_\be_\b:_\b:_\bF_\ba_\bk_\be_\bM_\bP_\bI_\bH_\be_\bl_\bp_\be_\br_\b:_\b:_\bg_\be_\bt_\bC_\bo_\bl_\bl_\be_\bc_\bt_\bi_\bv_\be_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn\n+static Communication< MPICommunicator > getCollectiveCommunication()\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mpihelper.hh:120\n+_\bD_\bu_\bn_\be_\b:_\b:_\bF_\ba_\bk_\be_\bM_\bP_\bI_\bH_\be_\bl_\bp_\be_\br_\b:_\b:_\bg_\be_\bt_\bL_\bo_\bc_\ba_\bl_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bo_\br\n+static MPICommunicator getLocalCommunicator()\n+get a local communicator\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mpihelper.hh:107\n+_\bD_\bu_\bn_\be_\b:_\b:_\bF_\ba_\bk_\be_\bM_\bP_\bI_\bH_\be_\bl_\bp_\be_\br_\b:_\b:_\bM_\bP_\bI_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bo_\br\n+No_Comm MPICommunicator\n+The type of the mpi communicator.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mpihelper.hh:87\n+_\bD_\bu_\bn_\be_\b:_\b:_\bF_\ba_\bk_\be_\bM_\bP_\bI_\bH_\be_\bl_\bp_\be_\br_\b:_\b:_\bi_\bn_\bs_\bt_\ba_\bn_\bc_\be\n+static DUNE_EXPORT FakeMPIHelper & instance(int argc, char **argv)\n+Get the singleton instance of the helper.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mpihelper.hh:146\n+_\bD_\bu_\bn_\be_\b:_\b:_\bF_\ba_\bk_\be_\bM_\bP_\bI_\bH_\be_\bl_\bp_\be_\br_\b:_\b:_\bi_\bn_\bs_\bt_\ba_\bn_\bc_\be\n+static DUNE_EXPORT FakeMPIHelper & instance()\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mpihelper.hh:152\n+_\bD_\bu_\bn_\be_\b:_\b:_\bF_\ba_\bk_\be_\bM_\bP_\bI_\bH_\be_\bl_\bp_\be_\br_\b:_\b:_\bg_\be_\bt_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn\n+static Communication< MPICommunicator > getCommunication()\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mpihelper.hh:126\n+_\bD_\bu_\bn_\be_\b:_\b:_\bF_\ba_\bk_\be_\bM_\bP_\bI_\bH_\be_\bl_\bp_\be_\br_\b:_\b:_\bi_\bs_\bF_\ba_\bk_\be\n+static constexpr bool isFake\n+Are we fake (i.e. pretend to have MPI support but are compiled without.)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mpihelper.hh:82\n+_\bD_\bu_\bn_\be_\b:_\b:_\bF_\ba_\bk_\be_\bM_\bP_\bI_\bH_\be_\bl_\bp_\be_\br_\b:_\b:_\br_\ba_\bn_\bk\n+int rank() const\n+return rank of process, i.e. zero\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mpihelper.hh:161\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\bP_\bI_\bH_\be_\bl_\bp_\be_\br\n+A real mpi helper.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mpihelper.hh:181\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\bP_\bI_\bH_\be_\bl_\bp_\be_\br_\b:_\b:_\bs_\bi_\bz_\be\n+int size() const\n+return number of processes\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mpihelper.hh:298\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\bP_\bI_\bH_\be_\bl_\bp_\be_\br_\b:_\b:_\bi_\bs_\bF_\ba_\bk_\be\n+static constexpr bool isFake\n+Are we fake (i. e. pretend to have MPI support but are compiled without.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mpihelper.hh:187\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\bP_\bI_\bH_\be_\bl_\bp_\be_\br_\b:_\b:_\bi_\bn_\bs_\bt_\ba_\bn_\bc_\be\n+static DUNE_EXPORT MPIHelper & instance(int *argc=nullptr, char\n+***argv=nullptr)\n+Get the singleton instance of the helper.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mpihelper.hh:284\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\bP_\bI_\bH_\be_\bl_\bp_\be_\br_\b:_\b:_\bi_\bn_\bs_\bt_\ba_\bn_\bc_\be\n+static DUNE_EXPORT MPIHelper & instance(int &argc, char **&argv)\n+Get the singleton instance of the helper.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mpihelper.hh:252\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\bP_\bI_\bH_\be_\bl_\bp_\be_\br_\b:_\b:_\bg_\be_\bt_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn\n+static Communication< MPICommunicator > getCommunication()\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mpihelper.hh:229\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\bP_\bI_\bH_\be_\bl_\bp_\be_\br_\b:_\b:_\b~_\bM_\bP_\bI_\bH_\be_\bl_\bp_\be_\br\n+~MPIHelper()\n+calls MPI_Finalize\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mpihelper.hh:301\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\bP_\bI_\bH_\be_\bl_\bp_\be_\br_\b:_\b:_\br_\ba_\bn_\bk\n+int rank() const\n+return rank of process\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mpihelper.hh:294\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\bP_\bI_\bH_\be_\bl_\bp_\be_\br_\b:_\b:_\bM_\bP_\bI_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bo_\br\n+MPI_Comm MPICommunicator\n+The type of the mpi communicator.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mpihelper.hh:192\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\bP_\bI_\bH_\be_\bl_\bp_\be_\br_\b:_\b:_\bg_\be_\bt_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bo_\br\n+static MPICommunicator getCommunicator()\n+get the default communicator\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mpihelper.hh:200\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\bP_\bI_\bH_\be_\bl_\bp_\be_\br_\b:_\b:_\bg_\be_\bt_\bL_\bo_\bc_\ba_\bl_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bo_\br\n+static MPICommunicator getLocalCommunicator()\n+get a local communicator\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mpihelper.hh:211\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\bP_\bI_\bH_\be_\bl_\bp_\be_\br_\b:_\b:_\bg_\be_\bt_\bC_\bo_\bl_\bl_\be_\bc_\bt_\bi_\bv_\be_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn\n+static Communication< MPICommunicator > getCollectiveCommunication()\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mpihelper.hh:223\n ===============================================================================\n Generated by\u00a0_\b[_\bd_\bo_\bx_\by_\bg_\be_\bn_\b] 1.9.8\n"}]}, {"source1": "./usr/share/doc/libdune-common-doc/doxygen/a00050.html", "source2": "./usr/share/doc/libdune-common-doc/doxygen/a00050.html", "unified_diff": "@@ -1,15 +1,15 @@\n \n \n \n \n \n \n \n-dune-common: communication.hh File Reference\n+dune-common: indexset.hh File Reference\n \n \n \n \n \n \n \n@@ -72,64 +72,118 @@\n
  • dune
  • common
  • parallel
  • \n \n \n
    \n \n-
    communication.hh File Reference
    \n+ \n
    \n
    \n \n-

    Implements an utility class that provides collective communication methods for sequential programs. \n+

    Provides a map between global and local indices. \n More...

    \n-
    #include <iostream>
    \n-#include <complex>
    \n-#include <algorithm>
    \n-#include <vector>
    \n-#include <dune/common/binaryfunctions.hh>
    \n-#include <dune/common/exceptions.hh>
    \n-#include <dune/common/parallel/future.hh>
    \n+
    #include <algorithm>
    \n+#include <cstdint>
    \n+#include <iostream>
    \n+#include <dune/common/arraylist.hh>
    \n+#include <dune/common/exceptions.hh>
    \n+#include <dune/common/parallel/localindex.hh>
    \n+#include <dune/common/parallel/mpitraits.hh>
    \n
    \n

    Go to the source code of this file.

    \n \n \n-\n+\n+\n \n-\n-\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n \n

    \n Classes

    struct  Dune::No_Comm
    class  Dune::IndexPair< TG, TL >
     A pair consisting of a global and local index. More...
     
    class  Dune::Communication< Communicator >
     Collective communication interface and sequential default implementation. More...
    class  Dune::InvalidIndexSetState
     Exception indicating that the index set is not in the expected state. More...
     
    class  Dune::ParallelIndexSet< TG, TL, N >
     Manager class for the mapping between local indices and globally unique indices. More...
     
    class  Dune::ParallelIndexSet< TG, TL, N >::iterator
     The iterator over the pairs. More...
     
    class  Dune::GlobalLookupIndexSet< I >
     Decorates an index set with the possibility to find a global index that is mapped to a specific local. More...
     
    struct  Dune::LocalIndexComparator< T >
     
    struct  Dune::IndexSetSortFunctor< TG, TL >
     
    \n \n \n \n \n

    \n Namespaces

    namespace  Dune
     Dune namespace.
     
    \n-\n-\n-\n-\n+\n+\n+\n+\n

    \n-Typedefs

    template<class T >
    using Dune::CollectiveCommunication = Communication< T >
     

    \n+Enumerations

    enum  Dune::ParallelIndexSetState { Dune::GROUND\n+, Dune::RESIZE\n+ }
     The states the index set can be in. More...
     
    \n \n-\n-\n-\n-\n-\n-\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n

    \n Functions

    bool Dune::operator== (const No_Comm &, const No_Comm &)
     Comparison operator for MPI compatibility.
     
    bool Dune::operator!= (const No_Comm &, const No_Comm &)
     Comparison operator for MPI compatibility.
     
    template<class TG , class TL >
    std::ostream & Dune::operator<< (std::ostream &os, const IndexPair< TG, TL > &pair)
     Print an index pair.
     
    template<class TG , class TL >
    bool Dune::operator== (const IndexPair< TG, TL > &, const IndexPair< TG, TL > &)
     
    template<class TG , class TL >
    bool Dune::operator!= (const IndexPair< TG, TL > &, const IndexPair< TG, TL > &)
     
    template<class TG , class TL >
    bool Dune::operator< (const IndexPair< TG, TL > &, const IndexPair< TG, TL > &)
     
    template<class TG , class TL >
    bool Dune::operator> (const IndexPair< TG, TL > &, const IndexPair< TG, TL > &)
     
    template<class TG , class TL >
    bool Dune::operator<= (const IndexPair< TG, TL > &, const IndexPair< TG, TL > &)
     
    template<class TG , class TL >
    bool Dune::operator>= (const IndexPair< TG, TL > &, const IndexPair< TG, TL > &)
     
    template<class TG , class TL >
    bool Dune::operator== (const IndexPair< TG, TL > &, const TG &)
     
    template<class TG , class TL >
    bool Dune::operator!= (const IndexPair< TG, TL > &, const TG &)
     
    template<class TG , class TL >
    bool Dune::operator< (const IndexPair< TG, TL > &, const TG &)
     
    template<class TG , class TL >
    bool Dune::operator> (const IndexPair< TG, TL > &, const TG &)
     
    template<class TG , class TL >
    bool Dune::operator<= (const IndexPair< TG, TL > &, const TG &)
     
    template<class TG , class TL >
    bool Dune::operator>= (const IndexPair< TG, TL > &, const TG &)
     
    template<class TG , class TL , int N>
    std::ostream & Dune::operator<< (std::ostream &os, const ParallelIndexSet< TG, TL, N > &indexSet)
     Print an index set.
     
    \n

    Detailed Description

    \n-

    Implements an utility class that provides collective communication methods for sequential programs.

    \n-

    An abstraction to the basic methods of parallel communication, following the message-passing paradigm.

    \n+

    Provides a map between global and local indices.

    \n+
    Author
    Markus Blatt
    \n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,49 +1,109 @@\n dune-common\u00a02.10\n Loading...\n Searching...\n No Matches\n * _\bd_\bu_\bn_\be\n * _\bc_\bo_\bm_\bm_\bo_\bn\n * _\bp_\ba_\br_\ba_\bl_\bl_\be_\bl\n-_\bC_\bl_\ba_\bs_\bs_\be_\bs | _\bN_\ba_\bm_\be_\bs_\bp_\ba_\bc_\be_\bs | _\bT_\by_\bp_\be_\bd_\be_\bf_\bs | _\bF_\bu_\bn_\bc_\bt_\bi_\bo_\bn_\bs\n-communication.hh File Reference\n-_\bC_\bo_\bm_\bm_\bo_\bn \u00bb _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\b _\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn\n-Implements an utility class that provides collective communication methods for\n-sequential programs. _\bM_\bo_\br_\be_\b._\b._\b.\n-#include \n-#include \n+_\bC_\bl_\ba_\bs_\bs_\be_\bs | _\bN_\ba_\bm_\be_\bs_\bp_\ba_\bc_\be_\bs | _\bE_\bn_\bu_\bm_\be_\br_\ba_\bt_\bi_\bo_\bn_\bs | _\bF_\bu_\bn_\bc_\bt_\bi_\bo_\bn_\bs\n+indexset.hh File Reference\n+_\bC_\bo_\bm_\bm_\bo_\bn \u00bb _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\b _\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn \u00bb _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\b _\bC_\bo_\bm_\bp_\bu_\bt_\bi_\bn_\bg_\b _\bb_\ba_\bs_\be_\bd_\b _\bo_\bn_\b _\bI_\bn_\bd_\be_\bx_\bs_\be_\bt_\bs\n+Provides a map between global and local indices. _\bM_\bo_\br_\be_\b._\b._\b.\n #include \n-#include \n-#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bb_\bi_\bn_\ba_\br_\by_\bf_\bu_\bn_\bc_\bt_\bi_\bo_\bn_\bs_\b._\bh_\bh>\n+#include \n+#include \n+#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\ba_\br_\br_\ba_\by_\bl_\bi_\bs_\bt_\b._\bh_\bh>\n #include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\be_\bx_\bc_\be_\bp_\bt_\bi_\bo_\bn_\bs_\b._\bh_\bh>\n-#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bp_\ba_\br_\ba_\bl_\bl_\be_\bl_\b/_\bf_\bu_\bt_\bu_\br_\be_\b._\bh_\bh>\n+#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bp_\ba_\br_\ba_\bl_\bl_\be_\bl_\b/_\bl_\bo_\bc_\ba_\bl_\bi_\bn_\bd_\be_\bx_\b._\bh_\bh>\n+#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bp_\ba_\br_\ba_\bl_\bl_\be_\bl_\b/_\bm_\bp_\bi_\bt_\br_\ba_\bi_\bt_\bs_\b._\bh_\bh>\n _\bG_\bo_\b _\bt_\bo_\b _\bt_\bh_\be_\b _\bs_\bo_\bu_\br_\bc_\be_\b _\bc_\bo_\bd_\be_\b _\bo_\bf_\b _\bt_\bh_\bi_\bs_\b _\bf_\bi_\bl_\be_\b.\n C\bCl\bla\bas\bss\bse\bes\bs\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bN_\bo_\b__\bC_\bo_\bm_\bm\n+ class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bd_\be_\bx_\bP_\ba_\bi_\br_\b<_\b _\bT_\bG_\b,_\b _\bT_\bL_\b _\b>\n+\u00a0 A pair consisting of a global and local index. _\bM_\bo_\br_\be_\b._\b._\b.\n+\u00a0\n+ class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bv_\ba_\bl_\bi_\bd_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt_\bS_\bt_\ba_\bt_\be\n+\u00a0 _\bE_\bx_\bc_\be_\bp_\bt_\bi_\bo_\bn indicating that the index set is not in the expected state.\n+ _\bM_\bo_\br_\be_\b._\b._\b.\n+\u00a0\n+ class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt_\b<_\b _\bT_\bG_\b,_\b _\bT_\bL_\b,_\b _\bN_\b _\b>\n+\u00a0 Manager class for the mapping between local indices and globally\n+ unique indices. _\bM_\bo_\br_\be_\b._\b._\b.\n+\u00a0\n+ class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt_\b<_\b _\bT_\bG_\b,_\b _\bT_\bL_\b,_\b _\bN_\b _\b>_\b:_\b:_\bi_\bt_\be_\br_\ba_\bt_\bo_\br\n+\u00a0 The iterator over the pairs. _\bM_\bo_\br_\be_\b._\b._\b.\n \u00a0\n- class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b<_\b _\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bo_\br_\b _\b>\n-\u00a0 Collective communication interface and sequential default\n- implementation. _\bM_\bo_\br_\be_\b._\b._\b.\n+ class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bG_\bl_\bo_\bb_\ba_\bl_\bL_\bo_\bo_\bk_\bu_\bp_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt_\b<_\b _\bI_\b _\b>\n+\u00a0 Decorates an index set with the possibility to find a global index\n+ that is mapped to a specific local. _\bM_\bo_\br_\be_\b._\b._\b.\n+\u00a0\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bL_\bo_\bc_\ba_\bl_\bI_\bn_\bd_\be_\bx_\bC_\bo_\bm_\bp_\ba_\br_\ba_\bt_\bo_\br_\b<_\b _\bT_\b _\b>\n+\u00a0\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt_\bS_\bo_\br_\bt_\bF_\bu_\bn_\bc_\bt_\bo_\br_\b<_\b _\bT_\bG_\b,_\b _\bT_\bL_\b _\b>\n \u00a0\n N\bNa\bam\bme\bes\bsp\bpa\bac\bce\bes\bs\n namespace \u00a0 _\bD_\bu_\bn_\be\n \u00a0 _\bD_\bu_\bn_\be namespace.\n \u00a0\n-T\bTy\byp\bpe\bed\bde\bef\bfs\bs\n-template\n-using\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bl_\bl_\be_\bc_\bt_\bi_\bv_\be_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn = _\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn< T >\n+E\bEn\bnu\bum\bme\ber\bra\bat\bti\bio\bon\bns\bs\n+enum \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt_\bS_\bt_\ba_\bt_\be { _\bD_\bu_\bn_\be_\b:_\b:_\bG_\bR_\bO_\bU_\bN_\bD , _\bD_\bu_\bn_\be_\b:_\b:_\bR_\bE_\bS_\bI_\bZ_\bE }\n+\u00a0 The states the index set can be in. _\bM_\bo_\br_\be_\b._\b._\b.\n \u00a0\n F\bFu\bun\bnc\bct\bti\bio\bon\bns\bs\n-bool\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b=_\b= (const _\bN_\bo_\b__\bC_\bo_\bm_\bm &, const _\bN_\bo_\b__\bC_\bo_\bm_\bm &)\n-\u00a0 Comparison operator for MPI compatibility.\n+template\n+std::ostream &\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b<_\b< (std::ostream &os, const _\bI_\bn_\bd_\be_\bx_\bP_\ba_\bi_\br< TG, TL >\n+ &pair)\n+\u00a0 Print an index pair.\n+\u00a0\n+template\n+ bool\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b=_\b= (const _\bI_\bn_\bd_\be_\bx_\bP_\ba_\bi_\br< TG, TL > &, const _\bI_\bn_\bd_\be_\bx_\bP_\ba_\bi_\br<\n+ TG, TL > &)\n+\u00a0\n+template\n+ bool\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b!_\b= (const _\bI_\bn_\bd_\be_\bx_\bP_\ba_\bi_\br< TG, TL > &, const _\bI_\bn_\bd_\be_\bx_\bP_\ba_\bi_\br<\n+ TG, TL > &)\n+\u00a0\n+template\n+ bool\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b< (const _\bI_\bn_\bd_\be_\bx_\bP_\ba_\bi_\br< TG, TL > &, const _\bI_\bn_\bd_\be_\bx_\bP_\ba_\bi_\br<\n+ TG, TL > &)\n+\u00a0\n+template\n+ bool\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b> (const _\bI_\bn_\bd_\be_\bx_\bP_\ba_\bi_\br< TG, TL > &, const _\bI_\bn_\bd_\be_\bx_\bP_\ba_\bi_\br<\n+ TG, TL > &)\n+\u00a0\n+template\n+ bool\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b<_\b= (const _\bI_\bn_\bd_\be_\bx_\bP_\ba_\bi_\br< TG, TL > &, const _\bI_\bn_\bd_\be_\bx_\bP_\ba_\bi_\br<\n+ TG, TL > &)\n+\u00a0\n+template\n+ bool\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b>_\b= (const _\bI_\bn_\bd_\be_\bx_\bP_\ba_\bi_\br< TG, TL > &, const _\bI_\bn_\bd_\be_\bx_\bP_\ba_\bi_\br<\n+ TG, TL > &)\n+\u00a0\n+template\n+ bool\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b=_\b= (const _\bI_\bn_\bd_\be_\bx_\bP_\ba_\bi_\br< TG, TL > &, const TG &)\n+\u00a0\n+template\n+ bool\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b!_\b= (const _\bI_\bn_\bd_\be_\bx_\bP_\ba_\bi_\br< TG, TL > &, const TG &)\n+\u00a0\n+template\n+ bool\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b< (const _\bI_\bn_\bd_\be_\bx_\bP_\ba_\bi_\br< TG, TL > &, const TG &)\n+\u00a0\n+template\n+ bool\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b> (const _\bI_\bn_\bd_\be_\bx_\bP_\ba_\bi_\br< TG, TL > &, const TG &)\n+\u00a0\n+template\n+ bool\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b<_\b= (const _\bI_\bn_\bd_\be_\bx_\bP_\ba_\bi_\br< TG, TL > &, const TG &)\n+\u00a0\n+template\n+ bool\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b>_\b= (const _\bI_\bn_\bd_\be_\bx_\bP_\ba_\bi_\br< TG, TL > &, const TG &)\n \u00a0\n-bool\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b!_\b= (const _\bN_\bo_\b__\bC_\bo_\bm_\bm &, const _\bN_\bo_\b__\bC_\bo_\bm_\bm &)\n-\u00a0 Comparison operator for MPI compatibility.\n+template\n+std::ostream &\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b<_\b< (std::ostream &os, const _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt< TG,\n+ TL, N > &indexSet)\n+\u00a0 Print an index set.\n \u00a0\n *\b**\b**\b**\b**\b* D\bDe\bet\bta\bai\bil\ble\bed\bd D\bDe\bes\bsc\bcr\bri\bip\bpt\bti\bio\bon\bn *\b**\b**\b**\b**\b*\n-Implements an utility class that provides collective communication methods for\n-sequential programs.\n-An abstraction to the basic methods of parallel communication, following the\n-message-passing paradigm.\n+Provides a map between global and local indices.\n+ Author\n+ Markus Blatt\n ===============================================================================\n Generated by\u00a0_\b[_\bd_\bo_\bx_\by_\bg_\be_\bn_\b] 1.9.8\n"}]}, {"source1": "./usr/share/doc/libdune-common-doc/doxygen/a00050_source.html", "source2": "./usr/share/doc/libdune-common-doc/doxygen/a00050_source.html", "unified_diff": "@@ -1,15 +1,15 @@\n \n \n \n \n \n \n \n-dune-common: communication.hh Source File\n+dune-common: indexset.hh Source File\n \n \n \n \n \n \n \n@@ -74,413 +74,960 @@\n \n \n
    \n
    \n-
    communication.hh
    \n+
    indexset.hh
    \n
    \n
    \n Go to the documentation of this file.
    1// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
    \n
    2// vi: set et ts=4 sw=2 sts=2:
    \n
    3// SPDX-FileCopyrightInfo: Copyright \u00a9 DUNE Project contributors, see file LICENSE.md in module root
    \n
    4// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception
    \n-
    5#ifndef DUNE_COMMON_PARALLEL_COMMUNICATION_HH
    \n-
    6#define DUNE_COMMON_PARALLEL_COMMUNICATION_HH
    \n-
    14#include <iostream>
    \n-
    15#include <complex>
    \n-
    16#include <algorithm>
    \n-
    17#include <vector>
    \n-
    18
    \n-\n-\n-\n-
    22
    \n-
    42namespace Dune
    \n-
    43{
    \n-
    44
    \n-
    45 /* define some type that definitely differs from MPI_Comm */
    \n-
    46 struct No_Comm {};
    \n-
    47
    \n-
    \n-
    52 inline bool operator==(const No_Comm&, const No_Comm&)
    \n-
    53 {
    \n-
    54 return true;
    \n-
    55 }
    \n-
    \n-
    56
    \n-
    \n-
    61 inline bool operator!=(const No_Comm&, const No_Comm&)
    \n-
    62 {
    \n-
    63 return false;
    \n-
    64 }
    \n-
    \n-
    65
    \n-
    98 template<typename Communicator>
    \n-
    \n-\n-
    100 {
    \n+
    5#ifndef DUNE_COMMON_PARALLEL_INDEXSET_HH
    \n+
    6#define DUNE_COMMON_PARALLEL_INDEXSET_HH
    \n+
    7
    \n+
    8#include <algorithm>
    \n+
    9#include <cstdint> // for uint32_t
    \n+
    10#include <iostream>
    \n+
    11
    \n+\n+\n+\n+\n+
    16
    \n+
    17namespace Dune
    \n+
    18{
    \n+
    28 // forward declarations
    \n+
    29
    \n+
    30 template<class TG, class TL>
    \n+
    31 class IndexPair;
    \n+
    32
    \n+
    38 template<class TG, class TL>
    \n+
    39 std::ostream& operator<<(std::ostream& os, const IndexPair<TG,TL>& pair);
    \n+
    40
    \n+
    41 template<class TG, class TL>
    \n+
    42 bool operator==(const IndexPair<TG,TL>&, const IndexPair<TG,TL>&);
    \n+
    43
    \n+
    44 template<class TG, class TL>
    \n+
    45 bool operator!=(const IndexPair<TG,TL>&, const IndexPair<TG,TL>&);
    \n+
    46
    \n+
    47 template<class TG, class TL>
    \n+
    48 bool operator<(const IndexPair<TG,TL>&, const IndexPair<TG,TL>&);
    \n+
    49
    \n+
    50 template<class TG, class TL>
    \n+
    51 bool operator>(const IndexPair<TG,TL>&, const IndexPair<TG,TL>&);
    \n+
    52
    \n+
    53 template<class TG, class TL>
    \n+
    54 bool operator<=(const IndexPair<TG,TL>&, const IndexPair<TG,TL>&);
    \n+
    55
    \n+
    56 template<class TG, class TL>
    \n+
    57 bool operator >=(const IndexPair<TG,TL>&, const IndexPair<TG,TL>&);
    \n+
    58
    \n+
    59 template<class TG, class TL>
    \n+
    60 bool operator==(const IndexPair<TG,TL>&, const TG&);
    \n+
    61
    \n+
    62 template<class TG, class TL>
    \n+
    63 bool operator!=(const IndexPair<TG,TL>&, const TG&);
    \n+
    64
    \n+
    65 template<class TG, class TL>
    \n+
    66 bool operator<(const IndexPair<TG,TL>&, const TG&);
    \n+
    67
    \n+
    68 template<class TG, class TL>
    \n+
    69 bool operator>(const IndexPair<TG,TL>&, const TG&);
    \n+
    70
    \n+
    71 template<class TG, class TL>
    \n+
    72 bool operator<=(const IndexPair<TG,TL>&, const TG&);
    \n+
    73
    \n+
    74 template<class TG, class TL>
    \n+
    75 bool operator >=(const IndexPair<TG,TL>&, const TG&);
    \n+
    76
    \n+
    77 template<typename T>
    \n+
    78 struct MPITraits;
    \n+
    79
    \n+
    83 template<class TG, class TL>
    \n+
    \n+\n+
    85 {
    \n+
    86 friend std::ostream& operator<<<>(std::ostream&, const IndexPair<TG,TL>&);
    \n+
    87 friend bool operator==<>(const IndexPair<TG,TL>&, const IndexPair<TG,TL>&);
    \n+
    88 friend bool operator!=<>(const IndexPair<TG,TL>&, const IndexPair<TG,TL>&);
    \n+
    89 friend bool operator< <>(const IndexPair<TG,TL>&, const IndexPair<TG,TL>&);
    \n+
    90 friend bool operator><>(const IndexPair<TG,TL>&, const IndexPair<TG,TL>&);
    \n+
    91 friend bool operator<=<>(const IndexPair<TG,TL>&, const IndexPair<TG,TL>&);
    \n+
    92 friend bool operator>=<>(const IndexPair<TG,TL>&, const IndexPair<TG,TL>&);
    \n+
    93 friend bool operator==<>(const IndexPair<TG,TL>&, const TG &);
    \n+
    94 friend bool operator!=<>(const IndexPair<TG,TL>&, const TG &);
    \n+
    95 friend bool operator< <>(const IndexPair<TG,TL>&, const TG &);
    \n+
    96 friend bool operator> <>(const IndexPair<TG,TL>&, const TG &);
    \n+
    97 friend bool operator<=<>(const IndexPair<TG,TL>&, const TG &);
    \n+
    98 friend bool operator>=<>(const IndexPair<TG,TL>&, const TG &);
    \n+
    99 friend struct MPITraits<IndexPair<TG,TL> >;
    \n+
    100
    \n
    101 public:
    \n-
    \n-\n-
    104 {}
    \n-
    \n-
    105
    \n-
    \n-
    110 Communication (const Communicator&)
    \n-
    111 {}
    \n-
    \n-
    112
    \n-
    \n-
    114 int rank () const
    \n-
    115 {
    \n-
    116 return 0;
    \n-
    117 }
    \n-
    \n-
    118
    \n-
    \n-
    120 operator No_Comm() const
    \n-
    121 {
    \n-
    122 return {};
    \n-
    123 }
    \n-
    \n-
    124
    \n-
    \n-
    126 int size () const
    \n-
    127 {
    \n-
    128 return 1;
    \n-
    129 }
    \n-
    \n-
    130
    \n-
    134 template<class T>
    \n-
    \n-
    135 int send([[maybe_unused]] const T& data,
    \n-
    136 [[maybe_unused]] int dest_rank,
    \n-
    137 [[maybe_unused]] int tag)
    \n-
    138 {
    \n-
    139 DUNE_THROW(ParallelError, "This method is not supported in sequential programs");
    \n-
    140 }
    \n-
    \n+
    107 typedef TG GlobalIndex;
    \n+
    108
    \n+
    120 typedef TL LocalIndex;
    \n+
    121
    \n+\n+
    129
    \n+\n+\n
    141
    \n-
    145 template<class T>
    \n-
    \n-
    146 PseudoFuture<T> isend([[maybe_unused]] const T&& data,
    \n-
    147 [[maybe_unused]] int dest_rank,
    \n-
    148 [[maybe_unused]] int tag)
    \n-
    149 {
    \n-
    150 DUNE_THROW(ParallelError, "This method is not supported in sequential programs");
    \n-
    151 }
    \n-
    \n-
    152
    \n-
    156 template<class T>
    \n-
    \n-
    157 T recv([[maybe_unused]] T&& data,
    \n-
    158 [[maybe_unused]] int source_rank,
    \n-
    159 [[maybe_unused]] int tag,
    \n-
    160 [[maybe_unused]] void* status = 0)
    \n-
    161 {
    \n-
    162 DUNE_THROW(ParallelError, "This method is not supported in sequential programs");
    \n-
    163 }
    \n-
    \n-
    164
    \n-
    168 template<class T>
    \n-
    \n-
    169 PseudoFuture<T> irecv([[maybe_unused]] T&& data,
    \n-
    170 [[maybe_unused]] int source_rank,
    \n-
    171 [[maybe_unused]] int tag)
    \n-
    172 {
    \n-
    173 DUNE_THROW(ParallelError, "This method is not supported in sequential programs");
    \n-
    174 }
    \n+
    147 inline const GlobalIndex& global() const;
    \n+
    148
    \n+
    154 inline LocalIndex& local();
    \n+
    155
    \n+
    161 inline const LocalIndex& local() const;
    \n+
    162
    \n+
    168 inline void setLocal(int index);
    \n+
    169 private:
    \n+
    171 GlobalIndex global_;
    \n+\n+
    174 };
    \n
    \n
    175
    \n-
    176 template<class T>
    \n-
    \n-
    177 T rrecv([[maybe_unused]] T&& data,
    \n-
    178 [[maybe_unused]] int source_rank,
    \n-
    179 [[maybe_unused]] int tag,
    \n-
    180 [[maybe_unused]] void* status = 0) const
    \n-
    181 {
    \n-
    182 DUNE_THROW(ParallelError, "This method is not supported in sequential programs");
    \n-
    183 }
    \n-
    \n-
    187 template<typename T>
    \n-
    \n-
    188 T sum (const T& in) const
    \n-
    189 {
    \n-
    190 return in;
    \n-
    191 }
    \n-
    \n-
    192
    \n-
    198 template<typename T>
    \n-
    \n-
    199 int sum ([[maybe_unused]] T* inout, [[maybe_unused]] int len) const
    \n-
    200 {
    \n-
    201 return 0;
    \n-
    202 }
    \n-
    \n-
    203
    \n-
    207 template<typename T>
    \n-
    \n-
    208 T prod (const T& in) const
    \n-
    209 {
    \n-
    210 return in;
    \n-
    211 }
    \n-
    \n-
    212
    \n-
    218 template<typename T>
    \n-
    \n-
    219 int prod ([[maybe_unused]] T* inout, [[maybe_unused]] int len) const
    \n-
    220 {
    \n-
    221 return 0;
    \n-
    222 }
    \n-
    \n-
    223
    \n-
    227 template<typename T>
    \n-
    \n-
    228 T min (const T& in) const
    \n-
    229 {
    \n-
    230 return in;
    \n-
    231 }
    \n-
    \n-
    232
    \n-
    238 template<typename T>
    \n-
    \n-
    239 int min ([[maybe_unused]] T* inout, [[maybe_unused]] int len) const
    \n-
    240 {
    \n-
    241 return 0;
    \n-
    242 }
    \n-
    \n-
    243
    \n-
    247 template<typename T>
    \n-
    \n-
    248 T max (const T& in) const
    \n-
    249 {
    \n-
    250 return in;
    \n-
    251 }
    \n-
    \n-
    252
    \n-
    258 template<typename T>
    \n-
    \n-
    259 int max ([[maybe_unused]] T* inout, [[maybe_unused]] int len) const
    \n-
    260 {
    \n-
    261 return 0;
    \n-
    262 }
    \n-
    \n-
    263
    \n-
    \n-
    267 int barrier () const
    \n-
    268 {
    \n-
    269 return 0;
    \n-
    270 }
    \n-
    \n-
    271
    \n-
    \n-\n-
    276 {
    \n-
    277 return {true}; // return a valid future
    \n-
    278 }
    \n-
    \n-
    279
    \n-
    283 template<typename T>
    \n-
    \n-
    284 int broadcast ([[maybe_unused]] T* inout,
    \n-
    285 [[maybe_unused]] int len,
    \n-
    286 [[maybe_unused]] int root) const
    \n-
    287 {
    \n-
    288 return 0;
    \n-
    289 }
    \n+
    \n+\n+
    181 {
    \n+\n+
    190 RESIZE
    \n+
    200 };
    \n+
    \n+
    201
    \n+\n+
    206
    \n+
    207 // Forward declaration
    \n+
    208 template<class I> class GlobalLookupIndexSet;
    \n+
    209
    \n+
    216 template<typename TG, typename TL, int N=100>
    \n+
    \n+\n+
    218 {
    \n+
    219 friend class GlobalLookupIndexSet<ParallelIndexSet<TG,TL,N> >;
    \n+
    220
    \n+
    221 public:
    \n+
    226 typedef TG GlobalIndex;
    \n+
    227
    \n+
    239 typedef TL LocalIndex;
    \n+
    240
    \n+\n+
    245
    \n+
    252 constexpr static int arraySize = (N>0) ? N : 1;
    \n+
    253
    \n+
    \n+
    255 class iterator :
    \n+
    256 public ArrayList<IndexPair,N>::iterator
    \n+
    257 {
    \n+
    258 typedef typename ArrayList<IndexPair,N>::iterator
    \n+\n+\n+
    261 public:
    \n+
    \n+
    262 iterator(ParallelIndexSet<TG,TL,N>& indexSet, const Father& father)
    \n+
    263 : Father(father), indexSet_(&indexSet)
    \n+
    264 {}
    \n+
    \n+
    265
    \n+
    266 private:
    \n+
    276 inline void markAsDeleted() const
    \n+
    277 {
    \n+
    278#ifndef NDEBUG
    \n+
    279 if(indexSet_->state_ != RESIZE)
    \n+
    280 DUNE_THROW(InvalidIndexSetState, "Indices can only be removed "
    \n+
    281 <<"while in RESIZE state!");
    \n+
    282#endif
    \n+
    283 Father::operator*().local().setState(DELETED);
    \n+
    284 }
    \n+
    285
    \n+
    287 ParallelIndexSet<TG,TL,N>* indexSet_;
    \n+
    288
    \n+
    289 };
    \n
    \n
    290
    \n-
    294 template<class T>
    \n-
    \n-
    295 PseudoFuture<T> ibroadcast(T&& data, int root) const{
    \n-
    296 return {std::forward<T>(data)};
    \n-
    297 }
    \n-
    \n-
    298
    \n-
    299
    \n-
    312 template<typename T>
    \n-
    \n-
    313 int gather (const T* in, T* out, int len, [[maybe_unused]] int root) const // note out must have same size as in
    \n-
    314 {
    \n-
    315 for (int i=0; i<len; i++)
    \n-
    316 out[i] = in[i];
    \n-
    317 return 0;
    \n-
    318 }
    \n-
    \n-
    319
    \n-
    323 template<class TIN, class TOUT = std::vector<TIN>>
    \n-
    \n-
    324 PseudoFuture<TOUT> igather(TIN&& data_in, TOUT&& data_out, int root){
    \n-
    325 *(data_out.begin()) = std::forward<TIN>(data_in);
    \n-
    326 return {std::forward<TOUT>(data_out)};
    \n-
    327 }
    \n-
    \n+
    291
    \n+
    292
    \n+
    294 typedef typename
    \n+\n+\n+
    297
    \n+\n+
    302
    \n+
    \n+\n+
    308 {
    \n+
    309 return state_;
    \n+
    310 }
    \n+
    \n+
    311
    \n+\n+
    318
    \n+
    327 inline void add(const GlobalIndex& global);
    \n
    328
    \n-
    329
    \n-
    349 template<typename T>
    \n-
    \n-
    350 int gatherv (const T* in,
    \n-
    351 int sendDataLen,
    \n-
    352 T* out,
    \n-
    353 [[maybe_unused]] int* recvDataLen,
    \n-
    354 int* displ,
    \n-
    355 [[maybe_unused]] int root) const
    \n-
    356 {
    \n-
    357 for (int i=*displ; i<sendDataLen; i++)
    \n-
    358 out[i] = in[i];
    \n-
    359 return 0;
    \n-
    360 }
    \n-
    \n+
    337 inline void add(const GlobalIndex& global, const LocalIndex& local);
    \n+
    338
    \n+
    346 inline void markAsDeleted(const iterator& position);
    \n+
    347
    \n+
    360 void endResize();
    \n
    361
    \n-
    375 template<typename T>
    \n-
    \n-
    376 int scatter (const T* sendData, T* recvData, int len, [[maybe_unused]] int root) const // note out must have same size as in
    \n-
    377 {
    \n-
    378 for (int i=0; i<len; i++)
    \n-
    379 recvData[i] = sendData[i];
    \n-
    380 return 0;
    \n-
    381 }
    \n-
    \n-
    382
    \n-
    386 template<class TIN, class TOUT = TIN>
    \n-
    \n-
    387 PseudoFuture<TOUT> iscatter(TIN&& data_in, TOUT&& data_out, int root){
    \n-
    388 data_out = *(std::forward<TIN>(data_in).begin());
    \n-
    389 return {std::forward<TOUT>(data_out)};
    \n-
    390 }
    \n-
    \n-
    391
    \n-
    410 template<typename T>
    \n-
    \n-
    411 int scatterv (const T* sendData,int* sendDataLen, int* displ, T* recvData,
    \n-
    412 [[maybe_unused]] int recvDataLen, [[maybe_unused]] int root) const
    \n-
    413 {
    \n-
    414 for (int i=*displ; i<*sendDataLen; i++)
    \n-
    415 recvData[i] = sendData[i];
    \n-
    416 return 0;
    \n-
    417 }
    \n-
    \n-
    418
    \n-
    432 template<typename T>
    \n-
    \n-
    433 int allgather(const T* sbuf, int count, T* rbuf) const
    \n-
    434 {
    \n-
    435 for(const T* end=sbuf+count; sbuf < end; ++sbuf, ++rbuf)
    \n-
    436 *rbuf=*sbuf;
    \n-
    437 return 0;
    \n-
    438 }
    \n-
    \n-
    439
    \n-
    444 template<class TIN, class TOUT = TIN>
    \n-
    \n-
    445 PseudoFuture<TOUT> iallgather(TIN&& data_in, TOUT&& data_out){
    \n-
    446 return {std::forward<TOUT>(data_out)};
    \n-
    447 }
    \n-
    \n-
    448
    \n-
    465 template<typename T>
    \n-
    \n-
    466 int allgatherv (const T* in, int sendDataLen, T* out, [[maybe_unused]] int* recvDataLen, int* displ) const
    \n-
    467 {
    \n-
    468 for (int i=*displ; i<sendDataLen; i++)
    \n-
    469 out[i] = in[i];
    \n-
    470 return 0;
    \n-
    471 }
    \n-
    \n+
    372 inline IndexPair&
    \n+
    373 operator[](const GlobalIndex& global);
    \n+
    374
    \n+
    384 inline IndexPair&
    \n+
    385 at(const GlobalIndex& global);
    \n+
    386
    \n+
    396 inline bool
    \n+
    397 exists (const GlobalIndex& global) const;
    \n+
    398
    \n+
    409 inline const IndexPair&
    \n+
    410 operator[](const GlobalIndex& global) const;
    \n+
    411
    \n+
    421 inline const IndexPair&
    \n+
    422 at(const GlobalIndex& global) const;
    \n+
    423
    \n+
    428 inline iterator begin();
    \n+
    429
    \n+
    434 inline iterator end();
    \n+
    435
    \n+
    440 inline const_iterator begin() const;
    \n+
    441
    \n+
    446 inline const_iterator end() const;
    \n+
    447
    \n+
    457 inline void renumberLocal();
    \n+
    458
    \n+
    465 inline int seqNo() const;
    \n+
    466
    \n+
    471 inline size_t size() const;
    \n
    472
    \n-
    485 template<typename BinaryFunction, typename Type>
    \n-
    \n-
    486 int allreduce([[maybe_unused]] Type* inout, [[maybe_unused]] int len) const
    \n-
    487 {
    \n-
    488 return 0;
    \n-
    489 }
    \n+
    473 private:
    \n+
    475 ArrayList<IndexPair,N> localIndices_;
    \n+
    477 ArrayList<IndexPair,N> newIndices_;
    \n+\n+
    481 int seqNo_;
    \n+
    483 bool deletedEntries_;
    \n+
    488 inline void merge();
    \n+
    489 };
    \n
    \n
    490
    \n-
    495 template<class BinaryFunction, class TIN, class TOUT = TIN>
    \n-
    \n-
    496 PseudoFuture<TOUT> iallreduce(TIN&& data_in, TOUT&& data_out){
    \n-
    497 data_out = std::forward<TIN>(data_in);
    \n-
    498 return {std::forward<TOUT>(data_out)};
    \n-
    499 }
    \n-
    \n-
    500
    \n-
    505 template<class BinaryFunction, class T>
    \n-
    \n-\n-
    507 return {std::forward<T>(data)};
    \n-
    508 }
    \n-
    \n-
    509
    \n-
    510
    \n-
    524 template<typename BinaryFunction, typename Type>
    \n-
    \n-
    525 int allreduce(const Type* in, Type* out, int len) const
    \n-
    526 {
    \n-
    527 std::copy(in, in+len, out);
    \n-
    528 return 0;
    \n-
    529 }
    \n-
    \n+
    491
    \n+
    497 template<class TG, class TL, int N>
    \n+
    498 std::ostream& operator<<(std::ostream& os, const ParallelIndexSet<TG,TL,N>& indexSet);
    \n+
    499
    \n+
    505 template<class I>
    \n+
    \n+\n+
    507 {
    \n+
    508 public:
    \n+\n+
    513
    \n+\n+
    518
    \n+\n+
    523
    \n+\n+
    528
    \n+\n
    530
    \n-
    531 };
    \n-
    \n-
    532
    \n-
    538 template<class T>
    \n-\n-
    540 [[deprecated("CollectiveCommunication is deprecated. Use Communication instead.")]]
    \n-\n-
    542}
    \n-
    543
    \n-
    544#endif // DUNE_COMMON_PARALLEL_COMMUNICATION_HH
    \n-\n-
    A few common exception classes.
    \n-
    helper classes to provide unique types for standard functions
    \n+
    537 GlobalLookupIndexSet(const ParallelIndexSet& indexset, std::size_t size);
    \n+
    538
    \n+\n+
    545
    \n+\n+
    550
    \n+
    560 inline const IndexPair&
    \n+
    561 operator[](const GlobalIndex& global) const;
    \n+
    562
    \n+
    566 inline const IndexPair*
    \n+
    567 pair(const std::size_t& local) const;
    \n+
    568
    \n+
    573 inline const_iterator begin() const;
    \n+
    574
    \n+
    579 inline const_iterator end() const;
    \n+
    580
    \n+
    587 inline int seqNo() const;
    \n+
    588
    \n+
    593 inline size_t size() const;
    \n+
    594 private:
    \n+
    598 const ParallelIndexSet& indexSet_;
    \n+
    599
    \n+
    603 std::size_t size_;
    \n+
    604
    \n+
    608 std::vector<const IndexPair*> indices_;
    \n+
    609
    \n+
    610 };
    \n+
    \n+
    611
    \n+
    612
    \n+
    613 template<typename T>
    \n+
    \n+\n+
    615 {
    \n+
    \n+
    616 static bool compare([[maybe_unused]] const T& t1, [[maybe_unused]] const T& t2)
    \n+
    617 {
    \n+
    618 return false;
    \n+
    619 }
    \n+
    \n+
    620 };
    \n+
    \n+
    621
    \n+
    622 template<class TG, class TL>
    \n+
    \n+\n+
    624 {
    \n+
    \n+\n+
    626 {
    \n+
    627 return i1.global()<i2.global() || (i1.global()==i2.global() &&
    \n+\n+
    629 i2.local()));
    \n+
    630 }
    \n+
    \n+
    631 };
    \n+
    \n+
    632
    \n+
    633
    \n+
    634
    \n+
    635 template<class TG, class TL>
    \n+
    \n+
    636 inline std::ostream& operator<<(std::ostream& os, const IndexPair<TG,TL>& pair)
    \n+
    637 {
    \n+
    638 os<<"{global="<<pair.global_<<", local="<<pair.local_<<"}";
    \n+
    639 return os;
    \n+
    640 }
    \n+
    \n+
    641
    \n+
    642 template<class TG, class TL, int N>
    \n+
    \n+
    643 inline std::ostream& operator<<(std::ostream& os, const ParallelIndexSet<TG,TL,N>& indexSet)
    \n+
    644 {
    \n+
    645 typedef typename ParallelIndexSet<TG,TL,N>::const_iterator Iterator;
    \n+
    646 Iterator end = indexSet.end();
    \n+
    647 os<<"{";
    \n+
    648 for(Iterator index = indexSet.begin(); index != end; ++index)
    \n+
    649 os<<*index<<" ";
    \n+
    650 os<<"}";
    \n+
    651 return os;
    \n+
    652
    \n+
    653 }
    \n+
    \n+
    654
    \n+
    655 template<class TG, class TL>
    \n+
    \n+
    656 inline bool operator==(const IndexPair<TG,TL>& a, const IndexPair<TG,TL>& b)
    \n+
    657 {
    \n+
    658 return a.global_==b.global_;
    \n+
    659 }
    \n+
    \n+
    660
    \n+
    661 template<class TG, class TL>
    \n+
    \n+
    662 inline bool operator!=(const IndexPair<TG,TL>& a, const IndexPair<TG,TL>& b)
    \n+
    663 {
    \n+
    664 return a.global_!=b.global_;
    \n+
    665 }
    \n+
    \n+
    666
    \n+
    667 template<class TG, class TL>
    \n+
    \n+
    668 inline bool operator<(const IndexPair<TG,TL>& a, const IndexPair<TG,TL>& b)
    \n+
    669 {
    \n+
    670 return a.global_<b.global_;
    \n+
    671 }
    \n+
    \n+
    672
    \n+
    673 template<class TG, class TL>
    \n+
    \n+
    674 inline bool operator>(const IndexPair<TG,TL>& a, const IndexPair<TG,TL>& b)
    \n+
    675 {
    \n+
    676 return a.global_>b.global_;
    \n+
    677 }
    \n+
    \n+
    678
    \n+
    679 template<class TG, class TL>
    \n+
    \n+
    680 inline bool operator<=(const IndexPair<TG,TL>& a, const IndexPair<TG,TL>& b)
    \n+
    681 {
    \n+
    682 return a.global_<=b.global_;
    \n+
    683 }
    \n+
    \n+
    684
    \n+
    685 template<class TG, class TL>
    \n+
    \n+
    686 inline bool operator >=(const IndexPair<TG,TL>& a, const IndexPair<TG,TL>& b)
    \n+
    687 {
    \n+
    688 return a.global_>=b.global_;
    \n+
    689 }
    \n+
    \n+
    690
    \n+
    691 template<class TG, class TL>
    \n+
    \n+
    692 inline bool operator==(const IndexPair<TG,TL>& a, const TG& b)
    \n+
    693 {
    \n+
    694 return a.global_==b;
    \n+
    695 }
    \n+
    \n+
    696
    \n+
    697 template<class TG, class TL>
    \n+
    \n+
    698 inline bool operator!=(const IndexPair<TG,TL>& a, const TG& b)
    \n+
    699 {
    \n+
    700 return a.global_!=b;
    \n+
    701 }
    \n+
    \n+
    702
    \n+
    703 template<class TG, class TL>
    \n+
    \n+
    704 inline bool operator<(const IndexPair<TG,TL>& a, const TG& b)
    \n+
    705 {
    \n+
    706 return a.global_<b;
    \n+
    707 }
    \n+
    \n+
    708
    \n+
    709 template<class TG, class TL>
    \n+
    \n+
    710 inline bool operator>(const IndexPair<TG,TL>& a, const TG& b)
    \n+
    711 {
    \n+
    712 return a.global_>b;
    \n+
    713 }
    \n+
    \n+
    714
    \n+
    715 template<class TG, class TL>
    \n+
    \n+
    716 inline bool operator<=(const IndexPair<TG,TL>& a, const TG& b)
    \n+
    717 {
    \n+
    718 return a.global_<=b;
    \n+
    719 }
    \n+
    \n+
    720
    \n+
    721 template<class TG, class TL>
    \n+
    \n+
    722 inline bool operator >=(const IndexPair<TG,TL>& a, const TG& b)
    \n+
    723 {
    \n+
    724 return a.global_>=b;
    \n+
    725 }
    \n+
    \n+
    726
    \n+
    727#ifndef DOXYGEN
    \n+
    728
    \n+
    729 template<class TG, class TL>
    \n+
    730 IndexPair<TG,TL>::IndexPair(const TG& global, const TL& local)
    \n+
    731 : global_(global), local_(local){}
    \n+
    732
    \n+
    733 template<class TG, class TL>
    \n+
    734 IndexPair<TG,TL>::IndexPair(const TG& global)
    \n+
    735 : global_(global), local_(){}
    \n+
    736
    \n+
    737 template<class TG, class TL>
    \n+\n+
    739 : global_(), local_(){}
    \n+
    740
    \n+
    741 template<class TG, class TL>
    \n+
    742 inline const TG& IndexPair<TG,TL>::global() const {
    \n+
    743 return global_;
    \n+
    744 }
    \n+
    745
    \n+
    746 template<class TG, class TL>
    \n+
    747 inline TL& IndexPair<TG,TL>::local() {
    \n+
    748 return local_;
    \n+
    749 }
    \n+
    750
    \n+
    751 template<class TG, class TL>
    \n+
    752 inline const TL& IndexPair<TG,TL>::local() const {
    \n+
    753 return local_;
    \n+
    754 }
    \n+
    755
    \n+
    756 template<class TG, class TL>
    \n+
    757 inline void IndexPair<TG,TL>::setLocal(int local){
    \n+
    758 local_=local;
    \n+
    759 }
    \n+
    760
    \n+
    761 template<class TG, class TL, int N>
    \n+\n+
    763 : state_(GROUND), seqNo_(0), deletedEntries_()
    \n+
    764 {}
    \n+
    765
    \n+
    766 template<class TG, class TL, int N>
    \n+\n+
    768 {
    \n+
    769
    \n+
    770 // Checks in unproductive code
    \n+
    771#ifndef NDEBUG
    \n+
    772 if(state_!=GROUND)
    \n+
    773 DUNE_THROW(InvalidIndexSetState,
    \n+
    774 "IndexSet has to be in GROUND state, when "
    \n+
    775 << "beginResize() is called!");
    \n+
    776#endif
    \n+
    777
    \n+
    778 state_ = RESIZE;
    \n+
    779 deletedEntries_ = false;
    \n+
    780 }
    \n+
    781
    \n+
    782 template<class TG, class TL, int N>
    \n+
    783 inline void ParallelIndexSet<TG,TL,N>::add(const GlobalIndex& global)
    \n+
    784 {
    \n+
    785 // Checks in unproductive code
    \n+
    786#ifndef NDEBUG
    \n+
    787 if(state_ != RESIZE)
    \n+
    788 DUNE_THROW(InvalidIndexSetState, "Indices can only be added "
    \n+
    789 <<"while in RESIZE state!");
    \n+
    790#endif
    \n+
    791 newIndices_.push_back(IndexPair(global));
    \n+
    792 }
    \n+
    793
    \n+
    794 template<class TG, class TL, int N>
    \n+
    795 inline void ParallelIndexSet<TG,TL,N>::add(const TG& global, const TL& local)
    \n+
    796 {
    \n+
    797 // Checks in unproductive code
    \n+
    798#ifndef NDEBUG
    \n+
    799 if(state_ != RESIZE)
    \n+
    800 DUNE_THROW(InvalidIndexSetState, "Indices can only be added "
    \n+
    801 <<"while in RESIZE state!");
    \n+
    802#endif
    \n+
    803 newIndices_.push_back(IndexPair(global,local));
    \n+
    804 }
    \n+
    805
    \n+
    806 template<class TG, class TL, int N>
    \n+
    807 inline void ParallelIndexSet<TG,TL,N>::markAsDeleted(const iterator& global)
    \n+
    808 {
    \n+
    809 // Checks in unproductive code
    \n+
    810#ifndef NDEBUG
    \n+
    811 if(state_ != RESIZE)
    \n+
    812 DUNE_THROW(InvalidIndexSetState, "Indices can only be removed "
    \n+
    813 <<"while in RESIZE state!");
    \n+
    814#endif
    \n+
    815 deletedEntries_ = true;
    \n+
    816
    \n+
    817 global.markAsDeleted();
    \n+
    818 }
    \n+
    819
    \n+
    820 template<class TG, class TL, int N>
    \n+\n+
    822 // Checks in unproductive code
    \n+
    823#ifndef NDEBUG
    \n+
    824 if(state_ != RESIZE)
    \n+
    825 DUNE_THROW(InvalidIndexSetState, "endResize called while not "
    \n+
    826 <<"in RESIZE state!");
    \n+
    827#endif
    \n+
    828
    \n+
    829 std::sort(newIndices_.begin(), newIndices_.end(), IndexSetSortFunctor<TG,TL>());
    \n+
    830 merge();
    \n+
    831 seqNo_++;
    \n+
    832 state_ = GROUND;
    \n+
    833 }
    \n+
    834
    \n+
    835
    \n+
    836 template<class TG, class TL, int N>
    \n+
    837 inline void ParallelIndexSet<TG,TL,N>::merge(){
    \n+
    838 if(localIndices_.size()==0)
    \n+
    839 {
    \n+
    840 localIndices_=newIndices_;
    \n+
    841 newIndices_.clear();
    \n+
    842 }
    \n+
    843 else if(newIndices_.size()>0 || deletedEntries_)
    \n+
    844 {
    \n+
    845 ArrayList<IndexPair,N> tempPairs;
    \n+
    846
    \n+
    847 auto old = localIndices_.begin();
    \n+
    848 auto added = newIndices_.begin();
    \n+
    849 const auto endold = localIndices_.end();
    \n+
    850 const auto endadded = newIndices_.end();
    \n+
    851
    \n+
    852 while(old != endold && added!= endadded)
    \n+
    853 {
    \n+
    854 if(old->local().state()==DELETED) {
    \n+
    855 old.eraseToHere();
    \n+
    856 }
    \n+
    857 else
    \n+
    858 {
    \n+
    859 if(old->global() < added->global() ||
    \n+
    860 (old->global() == added->global()
    \n+
    861 && LocalIndexComparator<TL>::compare(old->local(),added->local())))
    \n+
    862 {
    \n+
    863 tempPairs.push_back(*old);
    \n+
    864 old.eraseToHere();
    \n+
    865 continue;
    \n+
    866 }else
    \n+
    867 {
    \n+
    868 tempPairs.push_back(*added);
    \n+
    869 added.eraseToHere();
    \n+
    870 }
    \n+
    871 }
    \n+
    872 }
    \n+
    873
    \n+
    874 while(old != endold)
    \n+
    875 {
    \n+
    876 if(old->local().state()!=DELETED) {
    \n+
    877 tempPairs.push_back(*old);
    \n+
    878 }
    \n+
    879 old.eraseToHere();
    \n+
    880 }
    \n+
    881
    \n+
    882 while(added!= endadded)
    \n+
    883 {
    \n+
    884 tempPairs.push_back(*added);
    \n+
    885 added.eraseToHere();
    \n+
    886 }
    \n+
    887 localIndices_ = tempPairs;
    \n+
    888 }
    \n+
    889 }
    \n+
    890
    \n+
    891
    \n+
    892 template<class TG, class TL, int N>
    \n+
    893 inline const IndexPair<TG,TL>&
    \n+
    894 ParallelIndexSet<TG,TL,N>::at(const TG& global) const
    \n+
    895 {
    \n+
    896 // perform a binary search
    \n+
    897 int low=0, high=localIndices_.size()-1, probe=-1;
    \n+
    898
    \n+
    899 while(low<high)
    \n+
    900 {
    \n+
    901 probe = (high + low) / 2;
    \n+
    902 if(global <= localIndices_[probe].global())
    \n+
    903 high = probe;
    \n+
    904 else
    \n+
    905 low = probe+1;
    \n+
    906 }
    \n+
    907
    \n+
    908 if(probe==-1)
    \n+
    909 DUNE_THROW(RangeError, "No entries!");
    \n+
    910
    \n+
    911 if( localIndices_[low].global() != global)
    \n+
    912 DUNE_THROW(RangeError, "Could not find entry of "<<global);
    \n+
    913 else
    \n+
    914 return localIndices_[low];
    \n+
    915 }
    \n+
    916
    \n+
    917 template<class TG, class TL, int N>
    \n+
    918 inline const IndexPair<TG,TL>&
    \n+
    919 ParallelIndexSet<TG,TL,N>::operator[](const TG& global) const
    \n+
    920 {
    \n+
    921 // perform a binary search
    \n+
    922 int low=0, high=localIndices_.size()-1, probe=-1;
    \n+
    923
    \n+
    924 while(low<high)
    \n+
    925 {
    \n+
    926 probe = (high + low) / 2;
    \n+
    927 if(global <= localIndices_[probe].global())
    \n+
    928 high = probe;
    \n+
    929 else
    \n+
    930 low = probe+1;
    \n+
    931 }
    \n+
    932
    \n+
    933 return localIndices_[low];
    \n+
    934 }
    \n+
    935 template<class TG, class TL, int N>
    \n+
    936 inline IndexPair<TG,TL>& ParallelIndexSet<TG,TL,N>::at(const TG& global)
    \n+
    937 {
    \n+
    938 // perform a binary search
    \n+
    939 int low=0, high=localIndices_.size()-1, probe=-1;
    \n+
    940
    \n+
    941 while(low<high)
    \n+
    942 {
    \n+
    943 probe = (high + low) / 2;
    \n+
    944 if(localIndices_[probe].global() >= global)
    \n+
    945 high = probe;
    \n+
    946 else
    \n+
    947 low = probe+1;
    \n+
    948 }
    \n+
    949
    \n+
    950 if(probe==-1)
    \n+
    951 DUNE_THROW(RangeError, "No entries!");
    \n+
    952
    \n+
    953 if( localIndices_[low].global() != global)
    \n+
    954 DUNE_THROW(RangeError, "Could not find entry of "<<global);
    \n+
    955 else
    \n+
    956 return localIndices_[low];
    \n+
    957 }
    \n+
    958
    \n+
    959 template<class TG, class TL, int N>
    \n+
    960 inline bool ParallelIndexSet<TG,TL,N>::exists (const TG& global) const
    \n+
    961 {
    \n+
    962 // perform a binary search
    \n+
    963 int low=0, high=localIndices_.size()-1, probe=-1;
    \n+
    964
    \n+
    965 while(low<high)
    \n+
    966 {
    \n+
    967 probe = (high + low) / 2;
    \n+
    968 if(localIndices_[probe].global() >= global)
    \n+
    969 high = probe;
    \n+
    970 else
    \n+
    971 low = probe+1;
    \n+
    972 }
    \n+
    973
    \n+
    974 if(probe==-1)
    \n+
    975 return false;
    \n+
    976
    \n+
    977 if( localIndices_[low].global() != global)
    \n+
    978 return false;
    \n+
    979 return true;
    \n+
    980 }
    \n+
    981
    \n+
    982 template<class TG, class TL, int N>
    \n+
    983 inline IndexPair<TG,TL>& ParallelIndexSet<TG,TL,N>::operator[](const TG& global)
    \n+
    984 {
    \n+
    985 // perform a binary search
    \n+
    986 int low=0, high=localIndices_.size()-1, probe=-1;
    \n+
    987
    \n+
    988 while(low<high)
    \n+
    989 {
    \n+
    990 probe = (high + low) / 2;
    \n+
    991 if(localIndices_[probe].global() >= global)
    \n+
    992 high = probe;
    \n+
    993 else
    \n+
    994 low = probe+1;
    \n+
    995 }
    \n+
    996
    \n+
    997 return localIndices_[low];
    \n+
    998 }
    \n+
    999 template<class TG, class TL, int N>
    \n+
    1000 inline typename ParallelIndexSet<TG,TL,N>::iterator
    \n+\n+
    1002 {
    \n+
    1003 return iterator(*this, localIndices_.begin());
    \n+
    1004 }
    \n+
    1005
    \n+
    1006
    \n+
    1007 template<class TG, class TL, int N>
    \n+
    1008 inline typename ParallelIndexSet<TG,TL,N>::iterator
    \n+\n+
    1010 {
    \n+
    1011 return iterator(*this,localIndices_.end());
    \n+
    1012 }
    \n+
    1013
    \n+
    1014 template<class TG, class TL, int N>
    \n+
    1015 inline typename ParallelIndexSet<TG,TL,N>::const_iterator
    \n+\n+
    1017 {
    \n+
    1018 return localIndices_.begin();
    \n+
    1019 }
    \n+
    1020
    \n+
    1021
    \n+
    1022 template<class TG, class TL, int N>
    \n+
    1023 inline typename ParallelIndexSet<TG,TL,N>::const_iterator
    \n+\n+
    1025 {
    \n+
    1026 return localIndices_.end();
    \n+
    1027 }
    \n+
    1028
    \n+
    1029 template<class TG, class TL, int N>
    \n+\n+
    1031#ifndef NDEBUG
    \n+
    1032 if(state_==RESIZE)
    \n+
    1033 DUNE_THROW(InvalidIndexSetState, "IndexSet has to be in "
    \n+
    1034 <<"GROUND state for renumberLocal()");
    \n+
    1035#endif
    \n+
    1036
    \n+
    1037 const auto end_ = end();
    \n+
    1038 uint32_t index=0;
    \n+
    1039
    \n+
    1040 for(auto pair=begin(); pair!=end_; index++, ++pair)
    \n+
    1041 pair->local()=index;
    \n+
    1042 }
    \n+
    1043
    \n+
    1044 template<class TG, class TL, int N>
    \n+
    1045 inline int ParallelIndexSet<TG,TL,N>::seqNo() const
    \n+
    1046 {
    \n+
    1047 return seqNo_;
    \n+
    1048 }
    \n+
    1049
    \n+
    1050 template<class TG, class TL, int N>
    \n+
    1051 inline size_t ParallelIndexSet<TG,TL,N>::size() const
    \n+
    1052 {
    \n+
    1053 return localIndices_.size();
    \n+
    1054 }
    \n+
    1055
    \n+
    1056 template<class I>
    \n+\n+
    1058 std::size_t size)
    \n+
    1059 : indexSet_(indexset), size_(size),
    \n+
    1060 indices_(size_, static_cast<const IndexPair*>(0))
    \n+
    1061 {
    \n+
    1062 const_iterator end_ = indexSet_.end();
    \n+
    1063
    \n+
    1064 for(const_iterator pair = indexSet_.begin(); pair!=end_; ++pair) {
    \n+
    1065 assert(pair->local()<size_);
    \n+
    1066 indices_[pair->local()] = &(*pair);
    \n+
    1067 }
    \n+
    1068 }
    \n+
    1069
    \n+
    1070 template<class I>
    \n+\n+
    1072 : indexSet_(indexset), size_(0)
    \n+
    1073 {
    \n+
    1074 const_iterator end_ = indexSet_.end();
    \n+
    1075 for(const_iterator pair = indexSet_.begin(); pair!=end_; ++pair)
    \n+
    1076 size_=std::max(size_,static_cast<std::size_t>(pair->local()));
    \n+
    1077
    \n+
    1078 indices_.resize(++size_, 0);
    \n+
    1079
    \n+
    1080 for(const_iterator pair = indexSet_.begin(); pair!=end_; ++pair)
    \n+
    1081 indices_[pair->local()] = &(*pair);
    \n+
    1082 }
    \n+
    1083
    \n+
    1084 template<class I>
    \n+\n+
    1086 {}
    \n+
    1087
    \n+
    1088 template<class I>
    \n+
    1089 inline const IndexPair<typename I::GlobalIndex, typename I::LocalIndex>*
    \n+
    1090 GlobalLookupIndexSet<I>::pair(const std::size_t& local) const
    \n+
    1091 {
    \n+
    1092 return indices_[local];
    \n+
    1093 }
    \n+
    1094
    \n+
    1095 template<class I>
    \n+
    1096 inline const IndexPair<typename I::GlobalIndex, typename I::LocalIndex>&
    \n+
    1097 GlobalLookupIndexSet<I>::operator[](const GlobalIndex& global) const
    \n+
    1098 {
    \n+
    1099 return indexSet_[global];
    \n+
    1100 }
    \n+
    1101
    \n+
    1102 template<class I>
    \n+
    1103 typename I::const_iterator GlobalLookupIndexSet<I>::begin() const
    \n+
    1104 {
    \n+
    1105 return indexSet_.begin();
    \n+
    1106 }
    \n+
    1107
    \n+
    1108 template<class I>
    \n+
    1109 typename I::const_iterator GlobalLookupIndexSet<I>::end() const
    \n+
    1110 {
    \n+
    1111 return indexSet_.end();
    \n+
    1112 }
    \n+
    1113
    \n+
    1114 template<class I>
    \n+
    1115 inline size_t GlobalLookupIndexSet<I>::size() const
    \n+
    1116 {
    \n+
    1117 return size_;
    \n+
    1118 }
    \n+
    1119
    \n+
    1120 template<class I>
    \n+
    1121 inline int GlobalLookupIndexSet<I>::seqNo() const
    \n+
    1122 {
    \n+
    1123 return indexSet_.seqNo();
    \n+
    1124 }
    \n+
    1125
    \n+
    1126 template<typename TG, typename TL, int N, typename TG1, typename TL1, int N1>
    \n+
    1127 bool operator==(const ParallelIndexSet<TG,TL,N>& idxset,
    \n+
    1128 const ParallelIndexSet<TG1,TL1,N1>& idxset1)
    \n+
    1129 {
    \n+
    1130 if(idxset.size()!=idxset1.size())
    \n+
    1131 return false;
    \n+
    1132 typedef typename ParallelIndexSet<TG,TL,N>::const_iterator Iter;
    \n+
    1133 typedef typename ParallelIndexSet<TG1,TL1,N1>::const_iterator Iter1;
    \n+
    1134 Iter iter=idxset.begin();
    \n+
    1135 for(Iter1 iter1=idxset1.begin(); iter1 != idxset1.end(); ++iter, ++iter1) {
    \n+
    1136 if(iter1->global()!=iter->global())
    \n+
    1137 return false;
    \n+
    1138 typedef typename ParallelIndexSet<TG,TL,N>::LocalIndex PI;
    \n+
    1139 const PI& pi=iter->local(), pi1=iter1->local();
    \n+
    1140
    \n+
    1141 if(pi!=pi1)
    \n+
    1142 return false;
    \n+
    1143 }
    \n+
    1144 return true;
    \n+
    1145 }
    \n+
    1146
    \n+
    1147 template<typename TG, typename TL, int N, typename TG1, typename TL1, int N1>
    \n+
    1148 bool operator!=(const ParallelIndexSet<TG,TL,N>& idxset,
    \n+
    1149 const ParallelIndexSet<TG1,TL1,N1>& idxset1)
    \n+
    1150 {
    \n+
    1151 return !(idxset==idxset1);
    \n+
    1152 }
    \n+
    1153
    \n+
    1154
    \n+
    1155#endif // DOXYGEN
    \n+
    1156
    \n+
    1157}
    \n+
    1158
    \n+
    1159#endif // DUNE_COMMON_PARALLEL_INDEXSET_HH
    \n+
    Provides classes for use as the local index in ParallelIndexSet.
    \n+
    Traits classes for mapping types onto MPI_Datatype.
    \n+
    Implements a random-access container that can efficiently change size (similar to std::deque)
    \n+
    A few common exception classes.
    \n+
    std::ostream & operator<<(std::ostream &s, const bigunsignedint< k > &x)
    Definition bigunsignedint.hh:278
    \n
    #define DUNE_THROW(E, m)
    Definition exceptions.hh:218
    \n+
    EnableIfInterOperable< T1, T2, bool >::type operator<(const RandomAccessIteratorFacade< T1, V1, R1, D > &lhs, const RandomAccessIteratorFacade< T2, V2, R2, D > &rhs)
    Comparison operator.
    Definition iteratorfacades.hh:638
    \n+
    EnableIfInterOperable< T1, T2, bool >::type operator>(const RandomAccessIteratorFacade< T1, V1, R1, D > &lhs, const RandomAccessIteratorFacade< T2, V2, R2, D > &rhs)
    Comparison operator.
    Definition iteratorfacades.hh:684
    \n+
    EnableIfInterOperable< T1, T2, bool >::type operator<=(const RandomAccessIteratorFacade< T1, V1, R1, D > &lhs, const RandomAccessIteratorFacade< T2, V2, R2, D > &rhs)
    Comparison operator.
    Definition iteratorfacades.hh:661
    \n
    EnableIfInterOperable< T1, T2, bool >::type operator==(const ForwardIteratorFacade< T1, V1, R1, D > &lhs, const ForwardIteratorFacade< T2, V2, R2, D > &rhs)
    Checks for equality.
    Definition iteratorfacades.hh:238
    \n+
    EnableIfInterOperable< T1, T2, bool >::type operator>=(const RandomAccessIteratorFacade< T1, V1, R1, D > &lhs, const RandomAccessIteratorFacade< T2, V2, R2, D > &rhs)
    Comparison operator.
    Definition iteratorfacades.hh:706
    \n
    EnableIfInterOperable< T1, T2, bool >::type operator!=(const ForwardIteratorFacade< T1, V1, R1, D > &lhs, const ForwardIteratorFacade< T2, V2, R2, D > &rhs)
    Checks for inequality.
    Definition iteratorfacades.hh:260
    \n+
    IndexPair & operator[](const GlobalIndex &global)
    Find the index pair with a specific global id.
    \n+
    static constexpr int arraySize
    The size of the individual arrays in the underlying ArrayList.
    Definition indexset.hh:252
    \n+
    void beginResize()
    Indicate that the index set is to be resized.
    \n+
    ParallelIndexSetState
    The states the index set can be in.
    Definition indexset.hh:181
    \n+
    void renumberLocal()
    Renumbers the local index numbers.
    \n+
    bool exists(const GlobalIndex &global) const
    Find the index pair with a specific global id.
    \n+
    size_t size() const
    Get the total number (public and nonpublic) indices.
    \n+
    ArrayList< IndexPair, N >::const_iterator const_iterator
    The constant iterator over the pairs.
    Definition indexset.hh:296
    \n+
    bool operator()(const IndexPair< TG, TL > &i1, const IndexPair< TG, TL > &i2)
    Definition indexset.hh:625
    \n+
    void add(const GlobalIndex &global)
    Add an new index to the set.
    \n+
    const_iterator end() const
    Get an iterator over the indices positioned after the last index.
    \n+
    const LocalIndex & local() const
    Get the local index.
    \n+
    const IndexPair & at(const GlobalIndex &global) const
    Find the index pair with a specific global id.
    \n+
    GlobalLookupIndexSet(const ParallelIndexSet &indexset)
    Constructor.
    \n+
    TL LocalIndex
    the type of the local index.
    Definition indexset.hh:120
    \n+
    int seqNo() const
    Get the internal sequence number.
    \n+
    static bool compare(const T &t1, const T &t2)
    Definition indexset.hh:616
    \n+
    iterator begin()
    Get an iterator over the indices positioned at the first index.
    \n+
    Dune::IndexPair< typename I::GlobalIndex, typename I::LocalIndex > IndexPair
    Definition indexset.hh:529
    \n+
    iterator end()
    Get an iterator over the indices positioned after the last index.
    \n+
    ParallelIndexSet::const_iterator const_iterator
    The iterator over the index pairs.
    Definition indexset.hh:527
    \n+
    const_iterator begin() const
    Get an iterator over the indices positioned at the first index.
    \n+
    const IndexPair & operator[](const GlobalIndex &global) const
    Find the index pair with a specific global id.
    \n+
    const ParallelIndexSetState & state()
    Get the state the index set is in.
    Definition indexset.hh:307
    \n+
    const_iterator begin() const
    Get an iterator over the indices positioned at the first index.
    \n+
    const IndexPair & operator[](const GlobalIndex &global) const
    Find the index pair with a specific global id.
    \n+
    IndexPair()
    Construct a new Pair.
    \n+
    I ParallelIndexSet
    The type of the index set.
    Definition indexset.hh:512
    \n+
    TL LocalIndex
    The type of the local index, e.g. ParallelLocalIndex.
    Definition indexset.hh:239
    \n+
    void markAsDeleted(const iterator &position)
    Mark an index as deleted.
    \n+
    ParallelIndexSet::LocalIndex LocalIndex
    The type of the local index.
    Definition indexset.hh:517
    \n+
    IndexPair(const GlobalIndex &global, const LocalIndex &local)
    Constructs a new Pair.
    \n+
    void setLocal(int index)
    Set the local index.
    \n+
    const GlobalIndex & global() const
    Get the global index.
    \n+
    void add(const GlobalIndex &global, const LocalIndex &local)
    Add an new index to the set.
    \n+
    const_iterator end() const
    Get an iterator over the indices positioned after the last index.
    \n+
    IndexPair & at(const GlobalIndex &global)
    Find the index pair with a specific global id.
    \n+
    ParallelIndexSet()
    Constructor.
    \n+
    void endResize()
    Indicate that the resizing finishes.
    \n+
    ~GlobalLookupIndexSet()
    Destructor.
    \n+
    const IndexPair * pair(const std::size_t &local) const
    Get the index pair corresponding to a local index.
    \n+
    LocalIndex & local()
    Get the local index.
    \n+
    size_t size() const
    Get the total number (public and nonpublic) indices.
    \n+
    IndexPair(const GlobalIndex &global)
    Constructs a new Pair.
    \n+
    TG GlobalIndex
    the type of the global index. This type has to provide at least a operator< for sorting.
    Definition indexset.hh:226
    \n+
    TG GlobalIndex
    the type of the global index.
    Definition indexset.hh:107
    \n+
    int seqNo() const
    Get the internal sequence number.
    \n+
    iterator(ParallelIndexSet< TG, TL, N > &indexSet, const Father &father)
    Definition indexset.hh:262
    \n+
    GlobalLookupIndexSet(const ParallelIndexSet &indexset, std::size_t size)
    Constructor.
    \n+
    ParallelIndexSet::GlobalIndex GlobalIndex
    The type of the global index.
    Definition indexset.hh:522
    \n+
    Dune::IndexPair< GlobalIndex, LocalIndex > IndexPair
    The type of the pair stored.
    Definition indexset.hh:244
    \n+
    @ RESIZE
    Indicates that the index set is currently being resized.
    Definition indexset.hh:190
    \n+
    @ GROUND
    The default mode. Indicates that the index set is ready to be used.
    Definition indexset.hh:186
    \n+
    @ DELETED
    Definition localindex.hh:28
    \n
    Dune namespace.
    Definition alignedallocator.hh:13
    \n-
    Default exception if an error in the parallel communication of the program occurred.
    Definition exceptions.hh:287
    \n-
    Definition communication.hh:46
    \n-
    Collective communication interface and sequential default implementation.
    Definition communication.hh:100
    \n-
    PseudoFuture< TOUT > iallreduce(TIN &&data_in, TOUT &&data_out)
    Compute something over all processes nonblocking.
    Definition communication.hh:496
    \n-
    int send(const T &data, int dest_rank, int tag)
    Sends the data to the dest_rank.
    Definition communication.hh:135
    \n-
    int allreduce(const Type *in, Type *out, int len) const
    Compute something over all processes for each component of an array and return the result in every pr...
    Definition communication.hh:525
    \n-
    T max(const T &in) const
    Compute the maximum of the argument over all processes and return the result in every process....
    Definition communication.hh:248
    \n-
    int rank() const
    Return rank, is between 0 and size()-1.
    Definition communication.hh:114
    \n-
    T sum(const T &in) const
    Compute the sum of the argument over all processes and return the result in every process....
    Definition communication.hh:188
    \n-
    int scatterv(const T *sendData, int *sendDataLen, int *displ, T *recvData, int recvDataLen, int root) const
    Scatter arrays of variable length from a root to all other tasks.
    Definition communication.hh:411
    \n-
    int prod(T *inout, int len) const
    Compute the product over all processes for each component of an array and return the result in every ...
    Definition communication.hh:219
    \n-
    T recv(T &&data, int source_rank, int tag, void *status=0)
    Receives the data from the source_rank.
    Definition communication.hh:157
    \n-
    PseudoFuture< T > isend(const T &&data, int dest_rank, int tag)
    Sends the data to the dest_rank nonblocking.
    Definition communication.hh:146
    \n-
    PseudoFuture< void > ibarrier() const
    Nonblocking barrier.
    Definition communication.hh:275
    \n-
    int allreduce(Type *inout, int len) const
    Compute something over all processes for each component of an array and return the result in every pr...
    Definition communication.hh:486
    \n-
    int size() const
    Number of processes in set, is greater than 0.
    Definition communication.hh:126
    \n-
    int sum(T *inout, int len) const
    Compute the sum over all processes for each component of an array and return the result in every proc...
    Definition communication.hh:199
    \n-
    int allgatherv(const T *in, int sendDataLen, T *out, int *recvDataLen, int *displ) const
    Gathers data of variable length from all tasks and distribute it to all.
    Definition communication.hh:466
    \n-
    T min(const T &in) const
    Compute the minimum of the argument over all processes and return the result in every process....
    Definition communication.hh:228
    \n-
    PseudoFuture< T > irecv(T &&data, int source_rank, int tag)
    Receives the data from the source_rank nonblocking.
    Definition communication.hh:169
    \n-
    int gatherv(const T *in, int sendDataLen, T *out, int *recvDataLen, int *displ, int root) const
    Gather arrays of variable size on root task.
    Definition communication.hh:350
    \n-
    PseudoFuture< T > ibroadcast(T &&data, int root) const
    Distribute an array from the process with rank root to all other processes nonblocking.
    Definition communication.hh:295
    \n-
    int allgather(const T *sbuf, int count, T *rbuf) const
    Gathers data from all tasks and distribute it to all.
    Definition communication.hh:433
    \n-
    int scatter(const T *sendData, T *recvData, int len, int root) const
    Scatter array from a root to all other task.
    Definition communication.hh:376
    \n-
    int gather(const T *in, T *out, int len, int root) const
    Gather arrays on root task.
    Definition communication.hh:313
    \n-
    PseudoFuture< T > iallreduce(T &&data)
    Compute something over all processes nonblocking and in-place.
    Definition communication.hh:506
    \n-
    Communication(const Communicator &)
    Constructor with a given communicator.
    Definition communication.hh:110
    \n-
    int max(T *inout, int len) const
    Compute the maximum over all processes for each component of an array and return the result in every ...
    Definition communication.hh:259
    \n-
    T prod(const T &in) const
    Compute the product of the argument over all processes and return the result in every process....
    Definition communication.hh:208
    \n-
    int broadcast(T *inout, int len, int root) const
    Distribute an array from the process with rank root to all other processes.
    Definition communication.hh:284
    \n-
    T rrecv(T &&data, int source_rank, int tag, void *status=0) const
    Definition communication.hh:177
    \n-
    PseudoFuture< TOUT > iscatter(TIN &&data_in, TOUT &&data_out, int root)
    Scatter array from a root to all other task nonblocking.
    Definition communication.hh:387
    \n-
    int min(T *inout, int len) const
    Compute the minimum over all processes for each component of an array and return the result in every ...
    Definition communication.hh:239
    \n-
    int barrier() const
    Wait until all processes have arrived at this point in the program.
    Definition communication.hh:267
    \n-
    PseudoFuture< TOUT > igather(TIN &&data_in, TOUT &&data_out, int root)
    Gather arrays on root task nonblocking.
    Definition communication.hh:324
    \n-
    PseudoFuture< TOUT > iallgather(TIN &&data_in, TOUT &&data_out)
    Gathers data from all tasks and distribute it to all nonblocking.
    Definition communication.hh:445
    \n-
    Communication()
    Construct default object.
    Definition communication.hh:103
    \n-
    A wrapper-class for a object which is ready immediately.
    Definition future.hh:124
    \n+
    constexpr std::integral_constant< std::size_t, sizeof...(II)> size(std::integer_sequence< T, II... >)
    Return the size of the sequence.
    Definition integersequence.hh:75
    \n+
    A random access iterator for the Dune::ArrayList class.
    Definition arraylist.hh:255
    \n+
    A constant random access iterator for the Dune::ArrayList class.
    Definition arraylist.hh:368
    \n+
    A dynamically growing random access list.
    Definition arraylist.hh:62
    \n+
    ConstArrayListIterator< MemberType, N, A > const_iterator
    A constant random access iterator.
    Definition arraylist.hh:110
    \n+
    A traits class describing the mapping of types onto MPI_Datatypes.
    Definition mpitraits.hh:41
    \n+
    Default exception if a function was called while the object is not in a valid state for that function...
    Definition exceptions.hh:281
    \n+\n+
    A pair consisting of a global and local index.
    Definition indexset.hh:85
    \n+
    Exception indicating that the index set is not in the expected state.
    Definition indexset.hh:205
    \n+
    Decorates an index set with the possibility to find a global index that is mapped to a specific local...
    Definition indexset.hh:507
    \n+
    Manager class for the mapping between local indices and globally unique indices.
    Definition indexset.hh:218
    \n+
    The iterator over the pairs.
    Definition indexset.hh:257
    \n+
    Definition indexset.hh:615
    \n+
    Definition indexset.hh:624
    \n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,480 +1,1122 @@\n dune-common\u00a02.10\n Loading...\n Searching...\n No Matches\n * _\bd_\bu_\bn_\be\n * _\bc_\bo_\bm_\bm_\bo_\bn\n * _\bp_\ba_\br_\ba_\bl_\bl_\be_\bl\n-communication.hh\n+indexset.hh\n _\bG_\bo_\b _\bt_\bo_\b _\bt_\bh_\be_\b _\bd_\bo_\bc_\bu_\bm_\be_\bn_\bt_\ba_\bt_\bi_\bo_\bn_\b _\bo_\bf_\b _\bt_\bh_\bi_\bs_\b _\bf_\bi_\bl_\be_\b.\n 1// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-\n 2// vi: set et ts=4 sw=2 sts=2:\n 3// SPDX-FileCopyrightInfo: Copyright \u00c2\u00a9 DUNE Project contributors, see file\n LICENSE.md in module root\n 4// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception\n-5#ifndef DUNE_COMMON_PARALLEL_COMMUNICATION_HH\n-6#define DUNE_COMMON_PARALLEL_COMMUNICATION_HH\n-14#include \n-15#include \n-16#include \n-17#include \n-18\n-19#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bb_\bi_\bn_\ba_\br_\by_\bf_\bu_\bn_\bc_\bt_\bi_\bo_\bn_\bs_\b._\bh_\bh>\n-20#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\be_\bx_\bc_\be_\bp_\bt_\bi_\bo_\bn_\bs_\b._\bh_\bh>\n-21#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bp_\ba_\br_\ba_\bl_\bl_\be_\bl_\b/_\bf_\bu_\bt_\bu_\br_\be_\b._\bh_\bh>\n-22\n-42namespace _\bD_\bu_\bn_\be\n-43{\n-44\n-45 /* define some type that definitely differs from MPI_Comm */\n-_\b4_\b6 struct _\bN_\bo_\b__\bC_\bo_\bm_\bm {};\n-47\n-_\b5_\b2 inline bool _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b=_\b=(const _\bN_\bo_\b__\bC_\bo_\bm_\bm&, const _\bN_\bo_\b__\bC_\bo_\bm_\bm&)\n-53 {\n-54 return true;\n-55 }\n-56\n-_\b6_\b1 inline bool _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b!_\b=(const _\bN_\bo_\b__\bC_\bo_\bm_\bm&, const _\bN_\bo_\b__\bC_\bo_\bm_\bm&)\n-62 {\n-63 return false;\n-64 }\n-65\n-98 template\n-_\b9_\b9 class _\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn\n-100 {\n+5#ifndef DUNE_COMMON_PARALLEL_INDEXSET_HH\n+6#define DUNE_COMMON_PARALLEL_INDEXSET_HH\n+7\n+8#include \n+9#include // for uint32_t\n+10#include \n+11\n+12#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\ba_\br_\br_\ba_\by_\bl_\bi_\bs_\bt_\b._\bh_\bh>\n+13#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\be_\bx_\bc_\be_\bp_\bt_\bi_\bo_\bn_\bs_\b._\bh_\bh>\n+14#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bp_\ba_\br_\ba_\bl_\bl_\be_\bl_\b/_\bl_\bo_\bc_\ba_\bl_\bi_\bn_\bd_\be_\bx_\b._\bh_\bh>\n+15#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bp_\ba_\br_\ba_\bl_\bl_\be_\bl_\b/_\bm_\bp_\bi_\bt_\br_\ba_\bi_\bt_\bs_\b._\bh_\bh>\n+16\n+17namespace _\bD_\bu_\bn_\be\n+18{\n+28 // forward declarations\n+29\n+30 template\n+31 class IndexPair;\n+32\n+38 template\n+39 std::ostream& _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b<_\b<(std::ostream& os, const IndexPair& pair);\n+40\n+41 template\n+42 bool _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b=_\b=(const IndexPair&, const IndexPair&);\n+43\n+44 template\n+45 bool _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b!_\b=(const IndexPair&, const IndexPair&);\n+46\n+47 template\n+48 bool _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b<(const IndexPair&, const IndexPair&);\n+49\n+50 template\n+51 bool _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b>(const IndexPair&, const IndexPair&);\n+52\n+53 template\n+54 bool _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b<_\b=(const IndexPair&, const IndexPair&);\n+55\n+56 template\n+57 bool _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b _\b>_\b=(const IndexPair&, const IndexPair&);\n+58\n+59 template\n+60 bool _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b=_\b=(const IndexPair&, const TG&);\n+61\n+62 template\n+63 bool _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b!_\b=(const IndexPair&, const TG&);\n+64\n+65 template\n+66 bool _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b<(const IndexPair&, const TG&);\n+67\n+68 template\n+69 bool _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b>(const IndexPair&, const TG&);\n+70\n+71 template\n+72 bool _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b<_\b=(const IndexPair&, const TG&);\n+73\n+74 template\n+75 bool _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b _\b>_\b=(const IndexPair&, const TG&);\n+76\n+77 template\n+78 struct MPITraits;\n+79\n+83 template\n+_\b8_\b4 class _\bI_\bn_\bd_\be_\bx_\bP_\ba_\bi_\br\n+85 {\n+86 friend std::ostream& operator<<<>(std::ostream&, const _\bI_\bn_\bd_\be_\bx_\bP_\ba_\bi_\br_\b<_\bT_\bG_\b,_\bT_\bL_\b>&);\n+87 friend bool operator==<>(const _\bI_\bn_\bd_\be_\bx_\bP_\ba_\bi_\br_\b<_\bT_\bG_\b,_\bT_\bL_\b>&, const _\bI_\bn_\bd_\be_\bx_\bP_\ba_\bi_\br_\b<_\bT_\bG_\b,_\bT_\bL_\b>&);\n+88 friend bool operator!=<>(const _\bI_\bn_\bd_\be_\bx_\bP_\ba_\bi_\br_\b<_\bT_\bG_\b,_\bT_\bL_\b>&, const _\bI_\bn_\bd_\be_\bx_\bP_\ba_\bi_\br_\b<_\bT_\bG_\b,_\bT_\bL_\b>&);\n+89 friend bool operator< <>(const _\bI_\bn_\bd_\be_\bx_\bP_\ba_\bi_\br_\b<_\bT_\bG_\b,_\bT_\bL_\b>&, const _\bI_\bn_\bd_\be_\bx_\bP_\ba_\bi_\br_\b<_\bT_\bG_\b,_\bT_\bL_\b>&);\n+90 friend bool operator><>(const _\bI_\bn_\bd_\be_\bx_\bP_\ba_\bi_\br_\b<_\bT_\bG_\b,_\bT_\bL_\b>&, const _\bI_\bn_\bd_\be_\bx_\bP_\ba_\bi_\br_\b<_\bT_\bG_\b,_\bT_\bL_\b>&);\n+91 friend bool operator<=<>(const _\bI_\bn_\bd_\be_\bx_\bP_\ba_\bi_\br_\b<_\bT_\bG_\b,_\bT_\bL_\b>&, const _\bI_\bn_\bd_\be_\bx_\bP_\ba_\bi_\br_\b<_\bT_\bG_\b,_\bT_\bL_\b>&);\n+92 friend bool operator>=<>(const _\bI_\bn_\bd_\be_\bx_\bP_\ba_\bi_\br_\b<_\bT_\bG_\b,_\bT_\bL_\b>&, const _\bI_\bn_\bd_\be_\bx_\bP_\ba_\bi_\br_\b<_\bT_\bG_\b,_\bT_\bL_\b>&);\n+93 friend bool operator==<>(const _\bI_\bn_\bd_\be_\bx_\bP_\ba_\bi_\br_\b<_\bT_\bG_\b,_\bT_\bL_\b>&, const TG &);\n+94 friend bool operator!=<>(const _\bI_\bn_\bd_\be_\bx_\bP_\ba_\bi_\br_\b<_\bT_\bG_\b,_\bT_\bL_\b>&, const TG &);\n+95 friend bool operator< <>(const _\bI_\bn_\bd_\be_\bx_\bP_\ba_\bi_\br_\b<_\bT_\bG_\b,_\bT_\bL_\b>&, const TG &);\n+96 friend bool operator> <>(const _\bI_\bn_\bd_\be_\bx_\bP_\ba_\bi_\br_\b<_\bT_\bG_\b,_\bT_\bL_\b>&, const TG &);\n+97 friend bool operator<=<>(const _\bI_\bn_\bd_\be_\bx_\bP_\ba_\bi_\br_\b<_\bT_\bG_\b,_\bT_\bL_\b>&, const TG &);\n+_\b9_\b8 friend bool operator>=<>(const _\bI_\bn_\bd_\be_\bx_\bP_\ba_\bi_\br_\b<_\bT_\bG_\b,_\bT_\bL_\b>&, const TG &);\n+99 friend struct _\bM_\bP_\bI_\bT_\br_\ba_\bi_\bt_\bs<_\bI_\bn_\bd_\be_\bx_\bP_\ba_\bi_\br >;\n+100\n 101 public:\n-_\b1_\b0_\b3 _\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn()\n-104 {}\n-105\n-_\b1_\b1_\b0 _\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn (const Communicator&)\n-111 {}\n-112\n-_\b1_\b1_\b4 int _\br_\ba_\bn_\bk () const\n-115 {\n-116 return 0;\n-117 }\n-118\n-_\b1_\b2_\b0 operator _\bN_\bo_\b__\bC_\bo_\bm_\bm() const\n-121 {\n-122 return {};\n-123 }\n-124\n-_\b1_\b2_\b6 int _\bs_\bi_\bz_\be () const\n-127 {\n-128 return 1;\n-129 }\n-130\n-134 template\n-_\b1_\b3_\b5 int _\bs_\be_\bn_\bd([[maybe_unused]] const T& data,\n-136 [[maybe_unused]] int dest_rank,\n-137 [[maybe_unused]] int tag)\n-138 {\n-139 _\bD_\bU_\bN_\bE_\b__\bT_\bH_\bR_\bO_\bW(_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bE_\br_\br_\bo_\br, \"This method is not supported in sequential\n-programs\");\n-140 }\n+_\b1_\b0_\b7 typedef TG _\bG_\bl_\bo_\bb_\ba_\bl_\bI_\bn_\bd_\be_\bx;\n+108\n+_\b1_\b2_\b0 typedef TL _\bL_\bo_\bc_\ba_\bl_\bI_\bn_\bd_\be_\bx;\n+121\n+_\b1_\b2_\b8 _\bI_\bn_\bd_\be_\bx_\bP_\ba_\bi_\br(const _\bG_\bl_\bo_\bb_\ba_\bl_\bI_\bn_\bd_\be_\bx& _\bg_\bl_\bo_\bb_\ba_\bl, const _\bL_\bo_\bc_\ba_\bl_\bI_\bn_\bd_\be_\bx& _\bl_\bo_\bc_\ba_\bl);\n+129\n+_\b1_\b3_\b3 _\bI_\bn_\bd_\be_\bx_\bP_\ba_\bi_\br();\n+_\b1_\b4_\b0 _\bI_\bn_\bd_\be_\bx_\bP_\ba_\bi_\br(const _\bG_\bl_\bo_\bb_\ba_\bl_\bI_\bn_\bd_\be_\bx& _\bg_\bl_\bo_\bb_\ba_\bl);\n 141\n-145 template\n-_\b1_\b4_\b6 _\bP_\bs_\be_\bu_\bd_\bo_\bF_\bu_\bt_\bu_\br_\be_\b<_\bT_\b> _\bi_\bs_\be_\bn_\bd([[maybe_unused]] const T&& data,\n-147 [[maybe_unused]] int dest_rank,\n-148 [[maybe_unused]] int tag)\n-149 {\n-150 _\bD_\bU_\bN_\bE_\b__\bT_\bH_\bR_\bO_\bW(_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bE_\br_\br_\bo_\br, \"This method is not supported in sequential\n-programs\");\n-151 }\n-152\n-156 template\n-_\b1_\b5_\b7 T _\br_\be_\bc_\bv([[maybe_unused]] T&& data,\n-158 [[maybe_unused]] int source_rank,\n-159 [[maybe_unused]] int tag,\n-160 [[maybe_unused]] void* status = 0)\n-161 {\n-162 _\bD_\bU_\bN_\bE_\b__\bT_\bH_\bR_\bO_\bW(_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bE_\br_\br_\bo_\br, \"This method is not supported in sequential\n-programs\");\n-163 }\n-164\n-168 template\n-_\b1_\b6_\b9 _\bP_\bs_\be_\bu_\bd_\bo_\bF_\bu_\bt_\bu_\br_\be_\b<_\bT_\b> _\bi_\br_\be_\bc_\bv([[maybe_unused]] T&& data,\n-170 [[maybe_unused]] int source_rank,\n-171 [[maybe_unused]] int tag)\n-172 {\n-173 _\bD_\bU_\bN_\bE_\b__\bT_\bH_\bR_\bO_\bW(_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bE_\br_\br_\bo_\br, \"This method is not supported in sequential\n-programs\");\n-174 }\n+_\b1_\b4_\b7 inline const _\bG_\bl_\bo_\bb_\ba_\bl_\bI_\bn_\bd_\be_\bx& _\bg_\bl_\bo_\bb_\ba_\bl() const;\n+148\n+_\b1_\b5_\b4 inline _\bL_\bo_\bc_\ba_\bl_\bI_\bn_\bd_\be_\bx& _\bl_\bo_\bc_\ba_\bl();\n+155\n+_\b1_\b6_\b1 inline const _\bL_\bo_\bc_\ba_\bl_\bI_\bn_\bd_\be_\bx& _\bl_\bo_\bc_\ba_\bl() const;\n+162\n+_\b1_\b6_\b8 inline void _\bs_\be_\bt_\bL_\bo_\bc_\ba_\bl(int index);\n+169 private:\n+171 _\bG_\bl_\bo_\bb_\ba_\bl_\bI_\bn_\bd_\be_\bx global_;\n+_\b1_\b7_\b3 _\bL_\bo_\bc_\ba_\bl_\bI_\bn_\bd_\be_\bx local_;\n+174 };\n 175\n-176 template\n-_\b1_\b7_\b7 T _\br_\br_\be_\bc_\bv([[maybe_unused]] T&& data,\n-178 [[maybe_unused]] int source_rank,\n-179 [[maybe_unused]] int tag,\n-180 [[maybe_unused]] void* status = 0) const\n+_\b1_\b8_\b0 enum _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt_\bS_\bt_\ba_\bt_\be\n 181 {\n-182 _\bD_\bU_\bN_\bE_\b__\bT_\bH_\bR_\bO_\bW(_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bE_\br_\br_\bo_\br, \"This method is not supported in sequential\n-programs\");\n-183 }\n-187 template\n-_\b1_\b8_\b8 T _\bs_\bu_\bm (const T& in) const\n-189 {\n-190 return in;\n-191 }\n-192\n-198 template\n-_\b1_\b9_\b9 int _\bs_\bu_\bm ([[maybe_unused]] T* inout, [[maybe_unused]] int len) const\n-200 {\n-201 return 0;\n-202 }\n-203\n-207 template\n-_\b2_\b0_\b8 T _\bp_\br_\bo_\bd (const T& in) const\n-209 {\n-210 return in;\n-211 }\n-212\n-218 template\n-_\b2_\b1_\b9 int _\bp_\br_\bo_\bd ([[maybe_unused]] T* inout, [[maybe_unused]] int len) const\n-220 {\n-221 return 0;\n-222 }\n-223\n-227 template\n-_\b2_\b2_\b8 T _\bm_\bi_\bn (const T& in) const\n-229 {\n-230 return in;\n-231 }\n-232\n-238 template\n-_\b2_\b3_\b9 int _\bm_\bi_\bn ([[maybe_unused]] T* inout, [[maybe_unused]] int len) const\n-240 {\n-241 return 0;\n-242 }\n-243\n-247 template\n-_\b2_\b4_\b8 T _\bm_\ba_\bx (const T& in) const\n-249 {\n-250 return in;\n-251 }\n-252\n-258 template\n-_\b2_\b5_\b9 int _\bm_\ba_\bx ([[maybe_unused]] T* inout, [[maybe_unused]] int len) const\n-260 {\n-261 return 0;\n-262 }\n-263\n-_\b2_\b6_\b7 int _\bb_\ba_\br_\br_\bi_\be_\br () const\n-268 {\n-269 return 0;\n-270 }\n-271\n-_\b2_\b7_\b5 _\bP_\bs_\be_\bu_\bd_\bo_\bF_\bu_\bt_\bu_\br_\be_\b<_\bv_\bo_\bi_\bd_\b> _\bi_\bb_\ba_\br_\br_\bi_\be_\br () const\n-276 {\n-277 return {true}; // return a valid future\n-278 }\n-279\n-283 template\n-_\b2_\b8_\b4 int _\bb_\br_\bo_\ba_\bd_\bc_\ba_\bs_\bt ([[maybe_unused]] T* inout,\n-285 [[maybe_unused]] int len,\n-286 [[maybe_unused]] int root) const\n-287 {\n-288 return 0;\n-289 }\n+_\b1_\b8_\b6 _\bG_\bR_\bO_\bU_\bN_\bD,\n+190 _\bR_\bE_\bS_\bI_\bZ_\bE\n+_\b2_\b0_\b0 };\n+201\n+_\b2_\b0_\b5 class _\bI_\bn_\bv_\ba_\bl_\bi_\bd_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt_\bS_\bt_\ba_\bt_\be : public _\bI_\bn_\bv_\ba_\bl_\bi_\bd_\bS_\bt_\ba_\bt_\be_\bE_\bx_\bc_\be_\bp_\bt_\bi_\bo_\bn {};\n+206\n+207 // Forward declaration\n+208 template class _\bG_\bl_\bo_\bb_\ba_\bl_\bL_\bo_\bo_\bk_\bu_\bp_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt;\n+209\n+216 template\n+_\b2_\b1_\b7 class _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt\n+218 {\n+219 friend class _\bG_\bl_\bo_\bb_\ba_\bl_\bL_\bo_\bo_\bk_\bu_\bp_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt<_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt >;\n+220\n+221 public:\n+_\b2_\b2_\b6 typedef TG _\bG_\bl_\bo_\bb_\ba_\bl_\bI_\bn_\bd_\be_\bx;\n+227\n+_\b2_\b3_\b9 typedef TL _\bL_\bo_\bc_\ba_\bl_\bI_\bn_\bd_\be_\bx;\n+240\n+_\b2_\b4_\b4 typedef _\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bd_\be_\bx_\bP_\ba_\bi_\br_\b<_\bG_\bl_\bo_\bb_\ba_\bl_\bI_\bn_\bd_\be_\bx_\b,_\bL_\bo_\bc_\ba_\bl_\bI_\bn_\bd_\be_\bx_\b> _\bI_\bn_\bd_\be_\bx_\bP_\ba_\bi_\br;\n+245\n+_\b2_\b5_\b2 constexpr static int _\ba_\br_\br_\ba_\by_\bS_\bi_\bz_\be = (N>0) ? N : 1;\n+253\n+_\b2_\b5_\b5 class _\bi_\bt_\be_\br_\ba_\bt_\bo_\br :\n+256 public _\bA_\br_\br_\ba_\by_\bL_\bi_\bs_\bt::iterator\n+257 {\n+258 typedef typename _\bA_\br_\br_\ba_\by_\bL_\bi_\bs_\bt_\b<_\bI_\bn_\bd_\be_\bx_\bP_\ba_\bi_\br_\b,_\bN_\b>_\b:_\b:_\bi_\bt_\be_\br_\ba_\bt_\bo_\br\n+_\b2_\b5_\b9 _\bF_\ba_\bt_\bh_\be_\br;\n+260 friend class _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt<_\bG_\bl_\bo_\bb_\ba_\bl_\bI_\bn_\bd_\be_\bx,_\bL_\bo_\bc_\ba_\bl_\bI_\bn_\bd_\be_\bx,N>;\n+261 public:\n+_\b2_\b6_\b2 _\bi_\bt_\be_\br_\ba_\bt_\bo_\br(_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt_\b<_\bT_\bG_\b,_\bT_\bL_\b,_\bN_\b>& indexSet, const _\bF_\ba_\bt_\bh_\be_\br& father)\n+263 : _\bF_\ba_\bt_\bh_\be_\br(father), indexSet_(&indexSet)\n+264 {}\n+265\n+266 private:\n+276 inline void markAsDeleted() const\n+277 {\n+278#ifndef NDEBUG\n+279 if(indexSet_->state_ != _\bR_\bE_\bS_\bI_\bZ_\bE)\n+280 _\bD_\bU_\bN_\bE_\b__\bT_\bH_\bR_\bO_\bW(_\bI_\bn_\bv_\ba_\bl_\bi_\bd_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt_\bS_\bt_\ba_\bt_\be, \"Indices can only be removed \"\n+281 <<\"while in RESIZE state!\");\n+282#endif\n+283 _\bF_\ba_\bt_\bh_\be_\br_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b*().local().setState(_\bD_\bE_\bL_\bE_\bT_\bE_\bD);\n+284 }\n+285\n+287 _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt_\b<_\bT_\bG_\b,_\bT_\bL_\b,_\bN_\b>* indexSet_;\n+288\n+289 };\n 290\n-294 template\n-_\b2_\b9_\b5 _\bP_\bs_\be_\bu_\bd_\bo_\bF_\bu_\bt_\bu_\br_\be_\b<_\bT_\b> _\bi_\bb_\br_\bo_\ba_\bd_\bc_\ba_\bs_\bt(T&& data, int root) const{\n-296 return {std::forward(data)};\n-297 }\n-298\n-299\n-312 template\n-_\b3_\b1_\b3 int _\bg_\ba_\bt_\bh_\be_\br (const T* in, T* out, int len, [[maybe_unused]] int root) const\n-// note out must have same size as in\n-314 {\n-315 for (int i=0; i>\n-_\b3_\b2_\b4 _\bP_\bs_\be_\bu_\bd_\bo_\bF_\bu_\bt_\bu_\br_\be_\b<_\bT_\bO_\bU_\bT_\b> _\bi_\bg_\ba_\bt_\bh_\be_\br(TIN&& data_in, TOUT&& data_out, int root){\n-325 *(data_out.begin()) = std::forward(data_in);\n-326 return {std::forward(data_out)};\n-327 }\n+291\n+292\n+294 typedef typename\n+295 _\bA_\br_\br_\ba_\by_\bL_\bi_\bs_\bt_\b<_\bI_\bn_\bd_\be_\bx_\bP_\ba_\bi_\br_\b,_\bN_\b>_\b:_\b:_\bc_\bo_\bn_\bs_\bt_\b__\bi_\bt_\be_\br_\ba_\bt_\bo_\br\n+_\b2_\b9_\b6 _\bc_\bo_\bn_\bs_\bt_\b__\bi_\bt_\be_\br_\ba_\bt_\bo_\br;\n+297\n+_\b3_\b0_\b1 _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt();\n+302\n+_\b3_\b0_\b7 inline const _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt_\bS_\bt_\ba_\bt_\be& _\bs_\bt_\ba_\bt_\be()\n+308 {\n+309 return state_;\n+310 }\n+311\n+_\b3_\b1_\b7 void _\bb_\be_\bg_\bi_\bn_\bR_\be_\bs_\bi_\bz_\be();\n+318\n+_\b3_\b2_\b7 inline void _\ba_\bd_\bd(const _\bG_\bl_\bo_\bb_\ba_\bl_\bI_\bn_\bd_\be_\bx& global);\n 328\n-329\n-349 template\n-_\b3_\b5_\b0 int _\bg_\ba_\bt_\bh_\be_\br_\bv (const T* in,\n-351 int sendDataLen,\n-352 T* out,\n-353 [[maybe_unused]] int* recvDataLen,\n-354 int* displ,\n-355 [[maybe_unused]] int root) const\n-356 {\n-357 for (int i=*displ; i\n-_\b3_\b7_\b6 int _\bs_\bc_\ba_\bt_\bt_\be_\br (const T* sendData, T* recvData, int len, [[maybe_unused]] int\n-root) const // note out must have same size as in\n-377 {\n-378 for (int i=0; i\n-_\b3_\b8_\b7 _\bP_\bs_\be_\bu_\bd_\bo_\bF_\bu_\bt_\bu_\br_\be_\b<_\bT_\bO_\bU_\bT_\b> _\bi_\bs_\bc_\ba_\bt_\bt_\be_\br(TIN&& data_in, TOUT&& data_out, int root){\n-388 data_out = *(std::forward(data_in).begin());\n-389 return {std::forward(data_out)};\n-390 }\n-391\n-410 template\n-_\b4_\b1_\b1 int _\bs_\bc_\ba_\bt_\bt_\be_\br_\bv (const T* sendData,int* sendDataLen, int* displ, T* recvData,\n-412 [[maybe_unused]] int recvDataLen, [[maybe_unused]] int root) const\n-413 {\n-414 for (int i=*displ; i<*sendDataLen; i++)\n-415 recvData[i] = sendData[i];\n-416 return 0;\n-417 }\n-418\n-432 template\n-_\b4_\b3_\b3 int _\ba_\bl_\bl_\bg_\ba_\bt_\bh_\be_\br(const T* sbuf, int count, T* rbuf) const\n-434 {\n-435 for(const T* end=sbuf+count; sbuf < end; ++sbuf, ++rbuf)\n-436 *rbuf=*sbuf;\n-437 return 0;\n-438 }\n-439\n-444 template\n-_\b4_\b4_\b5 _\bP_\bs_\be_\bu_\bd_\bo_\bF_\bu_\bt_\bu_\br_\be_\b<_\bT_\bO_\bU_\bT_\b> _\bi_\ba_\bl_\bl_\bg_\ba_\bt_\bh_\be_\br(TIN&& data_in, TOUT&& data_out){\n-446 return {std::forward(data_out)};\n-447 }\n-448\n-465 template\n-_\b4_\b6_\b6 int _\ba_\bl_\bl_\bg_\ba_\bt_\bh_\be_\br_\bv (const T* in, int sendDataLen, T* out, [[maybe_unused]] int*\n-recvDataLen, int* displ) const\n-467 {\n-468 for (int i=*displ; i\n-_\b4_\b8_\b6 int _\ba_\bl_\bl_\br_\be_\bd_\bu_\bc_\be([[maybe_unused]] Type* inout, [[maybe_unused]] int len) const\n-487 {\n-488 return 0;\n-489 }\n+473 private:\n+475 _\bA_\br_\br_\ba_\by_\bL_\bi_\bs_\bt_\b<_\bI_\bn_\bd_\be_\bx_\bP_\ba_\bi_\br_\b,_\bN_\b> localIndices_;\n+477 _\bA_\br_\br_\ba_\by_\bL_\bi_\bs_\bt_\b<_\bI_\bn_\bd_\be_\bx_\bP_\ba_\bi_\br_\b,_\bN_\b> newIndices_;\n+479 _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt_\bS_\bt_\ba_\bt_\be state_;\n+481 int seqNo_;\n+483 bool deletedEntries_;\n+488 inline void merge();\n+489 };\n 490\n-495 template\n-_\b4_\b9_\b6 _\bP_\bs_\be_\bu_\bd_\bo_\bF_\bu_\bt_\bu_\br_\be_\b<_\bT_\bO_\bU_\bT_\b> _\bi_\ba_\bl_\bl_\br_\be_\bd_\bu_\bc_\be(TIN&& data_in, TOUT&& data_out){\n-497 data_out = std::forward(data_in);\n-498 return {std::forward(data_out)};\n-499 }\n-500\n-505 template\n-_\b5_\b0_\b6 _\bP_\bs_\be_\bu_\bd_\bo_\bF_\bu_\bt_\bu_\br_\be_\b<_\bT_\b> _\bi_\ba_\bl_\bl_\br_\be_\bd_\bu_\bc_\be(T&& data){\n-507 return {std::forward(data)};\n-508 }\n-509\n-510\n-524 template\n-_\b5_\b2_\b5 int _\ba_\bl_\bl_\br_\be_\bd_\bu_\bc_\be(const Type* in, Type* out, int len) const\n-526 {\n-527 std::copy(in, in+len, out);\n-528 return 0;\n-529 }\n+491\n+497 template\n+498 std::ostream& _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b<_\b<(std::ostream& os, const _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt_\b<_\bT_\bG_\b,_\bT_\bL_\b,_\bN_\b>&\n+indexSet);\n+499\n+505 template\n+_\b5_\b0_\b6 class _\bG_\bl_\bo_\bb_\ba_\bl_\bL_\bo_\bo_\bk_\bu_\bp_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt\n+507 {\n+508 public:\n+_\b5_\b1_\b2 typedef I _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt;\n+513\n+_\b5_\b1_\b7 typedef typename _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt_\b:_\b:_\bL_\bo_\bc_\ba_\bl_\bI_\bn_\bd_\be_\bx _\bL_\bo_\bc_\ba_\bl_\bI_\bn_\bd_\be_\bx;\n+518\n+_\b5_\b2_\b2 typedef typename _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt_\b:_\b:_\bG_\bl_\bo_\bb_\ba_\bl_\bI_\bn_\bd_\be_\bx _\bG_\bl_\bo_\bb_\ba_\bl_\bI_\bn_\bd_\be_\bx;\n+523\n+_\b5_\b2_\b7 typedef typename _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt_\b:_\b:_\bc_\bo_\bn_\bs_\bt_\b__\bi_\bt_\be_\br_\ba_\bt_\bo_\br _\bc_\bo_\bn_\bs_\bt_\b__\bi_\bt_\be_\br_\ba_\bt_\bo_\br;\n+528\n+_\b5_\b2_\b9 typedef _\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bd_\be_\bx_\bP_\ba_\bi_\br_\b<_\bt_\by_\bp_\be_\bn_\ba_\bm_\be_\b _\bI_\b:_\b:_\bG_\bl_\bo_\bb_\ba_\bl_\bI_\bn_\bd_\be_\bx_\b,_\b _\bt_\by_\bp_\be_\bn_\ba_\bm_\be_\b _\bI_\b:_\b:_\bL_\bo_\bc_\ba_\bl_\bI_\bn_\bd_\be_\bx_\b>\n+_\bI_\bn_\bd_\be_\bx_\bP_\ba_\bi_\br;\n 530\n-531 };\n-532\n-538 template\n-_\b5_\b3_\b9 using _\bC_\bo_\bl_\bl_\be_\bc_\bt_\bi_\bv_\be_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn\n-540 [[deprecated(\"CollectiveCommunication is deprecated. Use Communication\n-instead.\")]]\n-541 = _\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b<_\bT_\b>;\n-542}\n-543\n-544#endif // DUNE_COMMON_PARALLEL_COMMUNICATION_HH\n-_\bf_\bu_\bt_\bu_\br_\be_\b._\bh_\bh\n+_\b5_\b3_\b7 _\bG_\bl_\bo_\bb_\ba_\bl_\bL_\bo_\bo_\bk_\bu_\bp_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt(const _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt& indexset, std::size_t _\bs_\bi_\bz_\be);\n+538\n+_\b5_\b4_\b4 _\bG_\bl_\bo_\bb_\ba_\bl_\bL_\bo_\bo_\bk_\bu_\bp_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt(const _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt& indexset);\n+545\n+_\b5_\b4_\b9 _\b~_\bG_\bl_\bo_\bb_\ba_\bl_\bL_\bo_\bo_\bk_\bu_\bp_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt();\n+550\n+560 inline const _\bI_\bn_\bd_\be_\bx_\bP_\ba_\bi_\br&\n+_\b5_\b6_\b1 _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b[_\b](const _\bG_\bl_\bo_\bb_\ba_\bl_\bI_\bn_\bd_\be_\bx& global) const;\n+562\n+566 inline const _\bI_\bn_\bd_\be_\bx_\bP_\ba_\bi_\br*\n+_\b5_\b6_\b7 _\bp_\ba_\bi_\br(const std::size_t& local) const;\n+568\n+_\b5_\b7_\b3 inline _\bc_\bo_\bn_\bs_\bt_\b__\bi_\bt_\be_\br_\ba_\bt_\bo_\br _\bb_\be_\bg_\bi_\bn() const;\n+574\n+_\b5_\b7_\b9 inline _\bc_\bo_\bn_\bs_\bt_\b__\bi_\bt_\be_\br_\ba_\bt_\bo_\br _\be_\bn_\bd() const;\n+580\n+_\b5_\b8_\b7 inline int _\bs_\be_\bq_\bN_\bo() const;\n+588\n+_\b5_\b9_\b3 inline size_t _\bs_\bi_\bz_\be() const;\n+594 private:\n+598 const _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt& indexSet_;\n+599\n+603 std::size_t size_;\n+604\n+608 std::vector indices_;\n+609\n+610 };\n+611\n+612\n+613 template\n+_\b6_\b1_\b4 struct _\bL_\bo_\bc_\ba_\bl_\bI_\bn_\bd_\be_\bx_\bC_\bo_\bm_\bp_\ba_\br_\ba_\bt_\bo_\br\n+615 {\n+_\b6_\b1_\b6 static bool _\bc_\bo_\bm_\bp_\ba_\br_\be([[maybe_unused]] const T& t1, [[maybe_unused]] const T&\n+t2)\n+617 {\n+618 return false;\n+619 }\n+620 };\n+621\n+622 template\n+_\b6_\b2_\b3 struct _\bI_\bn_\bd_\be_\bx_\bS_\be_\bt_\bS_\bo_\br_\bt_\bF_\bu_\bn_\bc_\bt_\bo_\br\n+624 {\n+_\b6_\b2_\b5 bool _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b(_\b)(const _\bI_\bn_\bd_\be_\bx_\bP_\ba_\bi_\br_\b<_\bT_\bG_\b,_\bT_\bL_\b>& i1, const _\bI_\bn_\bd_\be_\bx_\bP_\ba_\bi_\br_\b<_\bT_\bG_\b,_\bT_\bL_\b>& i2)\n+626 {\n+627 return i1._\bg_\bl_\bo_\bb_\ba_\bl()_\b:_\b:_\bc_\bo_\bm_\bp_\ba_\br_\be(i1._\bl_\bo_\bc_\ba_\bl(),\n+629 i2._\bl_\bo_\bc_\ba_\bl()));\n+630 }\n+631 };\n+632\n+633\n+634\n+635 template\n+_\b6_\b3_\b6 inline std::ostream& _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b<_\b<(std::ostream& os, const _\bI_\bn_\bd_\be_\bx_\bP_\ba_\bi_\br_\b<_\bT_\bG_\b,_\bT_\bL_\b>&\n+pair)\n+637 {\n+638 os<<\"{global=\"<\n+_\b6_\b4_\b3 inline std::ostream& _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b<_\b<(std::ostream& os, const\n+_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt_\b<_\bT_\bG_\b,_\bT_\bL_\b,_\bN_\b>& indexSet)\n+644 {\n+645 typedef typename _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt_\b<_\bT_\bG_\b,_\bT_\bL_\b,_\bN_\b>_\b:_\b:_\bc_\bo_\bn_\bs_\bt_\b__\bi_\bt_\be_\br_\ba_\bt_\bo_\br Iterator;\n+646 Iterator end = indexSet._\be_\bn_\bd();\n+647 os<<\"{\";\n+648 for(Iterator index = indexSet._\bb_\be_\bg_\bi_\bn(); index != end; ++index)\n+649 os<<*index<<\" \";\n+650 os<<\"}\";\n+651 return os;\n+652\n+653 }\n+654\n+655 template\n+_\b6_\b5_\b6 inline bool _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b=_\b=(const _\bI_\bn_\bd_\be_\bx_\bP_\ba_\bi_\br_\b<_\bT_\bG_\b,_\bT_\bL_\b>& a, const _\bI_\bn_\bd_\be_\bx_\bP_\ba_\bi_\br_\b<_\bT_\bG_\b,_\bT_\bL_\b>&\n+b)\n+657 {\n+658 return a.global_==b.global_;\n+659 }\n+660\n+661 template\n+_\b6_\b6_\b2 inline bool _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b!_\b=(const _\bI_\bn_\bd_\be_\bx_\bP_\ba_\bi_\br_\b<_\bT_\bG_\b,_\bT_\bL_\b>& a, const _\bI_\bn_\bd_\be_\bx_\bP_\ba_\bi_\br_\b<_\bT_\bG_\b,_\bT_\bL_\b>&\n+b)\n+663 {\n+664 return a.global_!=b.global_;\n+665 }\n+666\n+667 template\n+_\b6_\b6_\b8 inline bool _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b<(const _\bI_\bn_\bd_\be_\bx_\bP_\ba_\bi_\br_\b<_\bT_\bG_\b,_\bT_\bL_\b>& a, const _\bI_\bn_\bd_\be_\bx_\bP_\ba_\bi_\br_\b<_\bT_\bG_\b,_\bT_\bL_\b>& b)\n+669 {\n+670 return a.global_\n+_\b6_\b7_\b4 inline bool _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b>(const _\bI_\bn_\bd_\be_\bx_\bP_\ba_\bi_\br_\b<_\bT_\bG_\b,_\bT_\bL_\b>& a, const _\bI_\bn_\bd_\be_\bx_\bP_\ba_\bi_\br_\b<_\bT_\bG_\b,_\bT_\bL_\b>& b)\n+675 {\n+676 return a.global_>b.global_;\n+677 }\n+678\n+679 template\n+_\b6_\b8_\b0 inline bool _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b<_\b=(const _\bI_\bn_\bd_\be_\bx_\bP_\ba_\bi_\br_\b<_\bT_\bG_\b,_\bT_\bL_\b>& a, const _\bI_\bn_\bd_\be_\bx_\bP_\ba_\bi_\br_\b<_\bT_\bG_\b,_\bT_\bL_\b>&\n+b)\n+681 {\n+682 return a.global_<=b.global_;\n+683 }\n+684\n+685 template\n+_\b6_\b8_\b6 inline bool _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b _\b>_\b=(const _\bI_\bn_\bd_\be_\bx_\bP_\ba_\bi_\br_\b<_\bT_\bG_\b,_\bT_\bL_\b>& a, const _\bI_\bn_\bd_\be_\bx_\bP_\ba_\bi_\br_\b<_\bT_\bG_\b,_\bT_\bL_\b>&\n+b)\n+687 {\n+688 return a.global_>=b.global_;\n+689 }\n+690\n+691 template\n+_\b6_\b9_\b2 inline bool _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b=_\b=(const _\bI_\bn_\bd_\be_\bx_\bP_\ba_\bi_\br_\b<_\bT_\bG_\b,_\bT_\bL_\b>& a, const TG& b)\n+693 {\n+694 return a.global_==b;\n+695 }\n+696\n+697 template\n+_\b6_\b9_\b8 inline bool _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b!_\b=(const _\bI_\bn_\bd_\be_\bx_\bP_\ba_\bi_\br_\b<_\bT_\bG_\b,_\bT_\bL_\b>& a, const TG& b)\n+699 {\n+700 return a.global_!=b;\n+701 }\n+702\n+703 template\n+_\b7_\b0_\b4 inline bool _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b<(const _\bI_\bn_\bd_\be_\bx_\bP_\ba_\bi_\br_\b<_\bT_\bG_\b,_\bT_\bL_\b>& a, const TG& b)\n+705 {\n+706 return a.global_\n+_\b7_\b1_\b0 inline bool _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b>(const _\bI_\bn_\bd_\be_\bx_\bP_\ba_\bi_\br_\b<_\bT_\bG_\b,_\bT_\bL_\b>& a, const TG& b)\n+711 {\n+712 return a.global_>b;\n+713 }\n+714\n+715 template\n+_\b7_\b1_\b6 inline bool _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b<_\b=(const _\bI_\bn_\bd_\be_\bx_\bP_\ba_\bi_\br_\b<_\bT_\bG_\b,_\bT_\bL_\b>& a, const TG& b)\n+717 {\n+718 return a.global_<=b;\n+719 }\n+720\n+721 template\n+_\b7_\b2_\b2 inline bool _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b _\b>_\b=(const _\bI_\bn_\bd_\be_\bx_\bP_\ba_\bi_\br_\b<_\bT_\bG_\b,_\bT_\bL_\b>& a, const TG& b)\n+723 {\n+724 return a.global_>=b;\n+725 }\n+726\n+727#ifndef DOXYGEN\n+728\n+729 template\n+730 _\bI_\bn_\bd_\be_\bx_\bP_\ba_\bi_\br_\b<_\bT_\bG_\b,_\bT_\bL_\b>_\b:_\b:_\bI_\bn_\bd_\be_\bx_\bP_\ba_\bi_\br(const TG& global, const TL& local)\n+731 : global_(global), local_(local){}\n+732\n+733 template\n+734 _\bI_\bn_\bd_\be_\bx_\bP_\ba_\bi_\br_\b<_\bT_\bG_\b,_\bT_\bL_\b>_\b:_\b:_\bI_\bn_\bd_\be_\bx_\bP_\ba_\bi_\br(const TG& global)\n+735 : global_(global), local_(){}\n+736\n+737 template\n+738 _\bI_\bn_\bd_\be_\bx_\bP_\ba_\bi_\br_\b<_\bT_\bG_\b,_\bT_\bL_\b>_\b:_\b:_\bI_\bn_\bd_\be_\bx_\bP_\ba_\bi_\br()\n+739 : global_(), local_(){}\n+740\n+741 template\n+742 inline const TG& _\bI_\bn_\bd_\be_\bx_\bP_\ba_\bi_\br_\b<_\bT_\bG_\b,_\bT_\bL_\b>_\b:_\b:_\bg_\bl_\bo_\bb_\ba_\bl() const {\n+743 return global_;\n+744 }\n+745\n+746 template\n+747 inline TL& _\bI_\bn_\bd_\be_\bx_\bP_\ba_\bi_\br_\b<_\bT_\bG_\b,_\bT_\bL_\b>_\b:_\b:_\bl_\bo_\bc_\ba_\bl() {\n+748 return local_;\n+749 }\n+750\n+751 template\n+752 inline const TL& _\bI_\bn_\bd_\be_\bx_\bP_\ba_\bi_\br_\b<_\bT_\bG_\b,_\bT_\bL_\b>_\b:_\b:_\bl_\bo_\bc_\ba_\bl() const {\n+753 return local_;\n+754 }\n+755\n+756 template\n+757 inline void _\bI_\bn_\bd_\be_\bx_\bP_\ba_\bi_\br_\b<_\bT_\bG_\b,_\bT_\bL_\b>_\b:_\b:_\bs_\be_\bt_\bL_\bo_\bc_\ba_\bl(int local){\n+758 local_=local;\n+759 }\n+760\n+761 template\n+762 _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt_\b<_\bT_\bG_\b,_\bT_\bL_\b,_\bN_\b>_\b:_\b:_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt()\n+763 : state_(_\bG_\bR_\bO_\bU_\bN_\bD), seqNo_(0), deletedEntries_()\n+764 {}\n+765\n+766 template\n+767 void _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt_\b<_\bT_\bG_\b,_\bT_\bL_\b,_\bN_\b>_\b:_\b:_\bb_\be_\bg_\bi_\bn_\bR_\be_\bs_\bi_\bz_\be()\n+768 {\n+769\n+770 // Checks in unproductive code\n+771#ifndef NDEBUG\n+772 if(state_!=_\bG_\bR_\bO_\bU_\bN_\bD)\n+773 _\bD_\bU_\bN_\bE_\b__\bT_\bH_\bR_\bO_\bW(InvalidIndexSetState,\n+774 \"IndexSet has to be in GROUND state, when \"\n+775 << \"beginResize() is called!\");\n+776#endif\n+777\n+778 state_ = _\bR_\bE_\bS_\bI_\bZ_\bE;\n+779 deletedEntries_ = false;\n+780 }\n+781\n+782 template\n+783 inline void _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt_\b<_\bT_\bG_\b,_\bT_\bL_\b,_\bN_\b>_\b:_\b:_\ba_\bd_\bd(const GlobalIndex& global)\n+784 {\n+785 // Checks in unproductive code\n+786#ifndef NDEBUG\n+787 if(state_ != _\bR_\bE_\bS_\bI_\bZ_\bE)\n+788 _\bD_\bU_\bN_\bE_\b__\bT_\bH_\bR_\bO_\bW(InvalidIndexSetState, \"Indices can only be added \"\n+789 <<\"while in RESIZE state!\");\n+790#endif\n+791 newIndices_.push_back(IndexPair(global));\n+792 }\n+793\n+794 template\n+795 inline void _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt_\b<_\bT_\bG_\b,_\bT_\bL_\b,_\bN_\b>_\b:_\b:_\ba_\bd_\bd(const TG& global, const TL&\n+local)\n+796 {\n+797 // Checks in unproductive code\n+798#ifndef NDEBUG\n+799 if(state_ != _\bR_\bE_\bS_\bI_\bZ_\bE)\n+800 _\bD_\bU_\bN_\bE_\b__\bT_\bH_\bR_\bO_\bW(InvalidIndexSetState, \"Indices can only be added \"\n+801 <<\"while in RESIZE state!\");\n+802#endif\n+803 newIndices_.push_back(IndexPair(global,local));\n+804 }\n+805\n+806 template\n+807 inline void _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt_\b<_\bT_\bG_\b,_\bT_\bL_\b,_\bN_\b>_\b:_\b:_\bm_\ba_\br_\bk_\bA_\bs_\bD_\be_\bl_\be_\bt_\be_\bd(const iterator&\n+global)\n+808 {\n+809 // Checks in unproductive code\n+810#ifndef NDEBUG\n+811 if(state_ != _\bR_\bE_\bS_\bI_\bZ_\bE)\n+812 _\bD_\bU_\bN_\bE_\b__\bT_\bH_\bR_\bO_\bW(InvalidIndexSetState, \"Indices can only be removed \"\n+813 <<\"while in RESIZE state!\");\n+814#endif\n+815 deletedEntries_ = true;\n+816\n+817 global.markAsDeleted();\n+818 }\n+819\n+820 template\n+821 void _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt_\b<_\bT_\bG_\b,_\bT_\bL_\b,_\bN_\b>_\b:_\b:_\be_\bn_\bd_\bR_\be_\bs_\bi_\bz_\be() {\n+822 // Checks in unproductive code\n+823#ifndef NDEBUG\n+824 if(state_ != _\bR_\bE_\bS_\bI_\bZ_\bE)\n+825 _\bD_\bU_\bN_\bE_\b__\bT_\bH_\bR_\bO_\bW(InvalidIndexSetState, \"endResize called while not \"\n+826 <<\"in RESIZE state!\");\n+827#endif\n+828\n+829 std::sort(newIndices_.begin(), newIndices_.end(),\n+IndexSetSortFunctor());\n+830 merge();\n+831 seqNo_++;\n+832 state_ = _\bG_\bR_\bO_\bU_\bN_\bD;\n+833 }\n+834\n+835\n+836 template\n+837 inline void ParallelIndexSet::merge(){\n+838 if(localIndices_.size()==0)\n+839 {\n+840 localIndices_=newIndices_;\n+841 newIndices_.clear();\n+842 }\n+843 else if(newIndices_.size()>0 || deletedEntries_)\n+844 {\n+845 ArrayList tempPairs;\n+846\n+847 auto old = localIndices_.begin();\n+848 auto added = newIndices_.begin();\n+849 const auto endold = localIndices_.end();\n+850 const auto endadded = newIndices_.end();\n+851\n+852 while(old != endold && added!= endadded)\n+853 {\n+854 if(old->local().state()==_\bD_\bE_\bL_\bE_\bT_\bE_\bD) {\n+855 old.eraseToHere();\n+856 }\n+857 else\n+858 {\n+859 if(old->global() < added->global() ||\n+860 (old->global() == added->global()\n+861 && _\bL_\bo_\bc_\ba_\bl_\bI_\bn_\bd_\be_\bx_\bC_\bo_\bm_\bp_\ba_\br_\ba_\bt_\bo_\br_\b<_\bT_\bL_\b>_\b:_\b:_\bc_\bo_\bm_\bp_\ba_\br_\be(old->local(),added->local())))\n+862 {\n+863 tempPairs.push_back(*old);\n+864 old.eraseToHere();\n+865 continue;\n+866 }else\n+867 {\n+868 tempPairs.push_back(*added);\n+869 added.eraseToHere();\n+870 }\n+871 }\n+872 }\n+873\n+874 while(old != endold)\n+875 {\n+876 if(old->local().state()!=_\bD_\bE_\bL_\bE_\bT_\bE_\bD) {\n+877 tempPairs.push_back(*old);\n+878 }\n+879 old.eraseToHere();\n+880 }\n+881\n+882 while(added!= endadded)\n+883 {\n+884 tempPairs.push_back(*added);\n+885 added.eraseToHere();\n+886 }\n+887 localIndices_ = tempPairs;\n+888 }\n+889 }\n+890\n+891\n+892 template\n+893 inline const IndexPair&\n+894 _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt_\b<_\bT_\bG_\b,_\bT_\bL_\b,_\bN_\b>_\b:_\b:_\ba_\bt(const TG& global) const\n+895 {\n+896 // perform a binary search\n+897 int low=0, high=localIndices_.size()-1, probe=-1;\n+898\n+899 while(low\n+918 inline const IndexPair&\n+919 _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt_\b<_\bT_\bG_\b,_\bT_\bL_\b,_\bN_\b>_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b[_\b](const TG& global) const\n+920 {\n+921 // perform a binary search\n+922 int low=0, high=localIndices_.size()-1, probe=-1;\n+923\n+924 while(low\n+936 inline IndexPair& _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt_\b<_\bT_\bG_\b,_\bT_\bL_\b,_\bN_\b>_\b:_\b:_\ba_\bt(const TG& global)\n+937 {\n+938 // perform a binary search\n+939 int low=0, high=localIndices_.size()-1, probe=-1;\n+940\n+941 while(low= global)\n+945 high = probe;\n+946 else\n+947 low = probe+1;\n+948 }\n+949\n+950 if(probe==-1)\n+951 _\bD_\bU_\bN_\bE_\b__\bT_\bH_\bR_\bO_\bW(RangeError, \"No entries!\");\n+952\n+953 if( localIndices_[low].global() != global)\n+954 _\bD_\bU_\bN_\bE_\b__\bT_\bH_\bR_\bO_\bW(RangeError, \"Could not find entry of \"<\n+960 inline bool _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt_\b<_\bT_\bG_\b,_\bT_\bL_\b,_\bN_\b>_\b:_\b:_\be_\bx_\bi_\bs_\bt_\bs (const TG& global) const\n+961 {\n+962 // perform a binary search\n+963 int low=0, high=localIndices_.size()-1, probe=-1;\n+964\n+965 while(low= global)\n+969 high = probe;\n+970 else\n+971 low = probe+1;\n+972 }\n+973\n+974 if(probe==-1)\n+975 return false;\n+976\n+977 if( localIndices_[low].global() != global)\n+978 return false;\n+979 return true;\n+980 }\n+981\n+982 template\n+983 inline IndexPair& _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt_\b<_\bT_\bG_\b,_\bT_\bL_\b,_\bN_\b>_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b[_\b](const TG&\n+global)\n+984 {\n+985 // perform a binary search\n+986 int low=0, high=localIndices_.size()-1, probe=-1;\n+987\n+988 while(low= global)\n+992 high = probe;\n+993 else\n+994 low = probe+1;\n+995 }\n+996\n+997 return localIndices_[low];\n+998 }\n+999 template\n+1000 inline typename ParallelIndexSet::iterator\n+1001 _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt_\b<_\bT_\bG_\b,_\bT_\bL_\b,_\bN_\b>_\b:_\b:_\bb_\be_\bg_\bi_\bn()\n+1002 {\n+1003 return iterator(*this, localIndices_.begin());\n+1004 }\n+1005\n+1006\n+1007 template\n+1008 inline typename ParallelIndexSet::iterator\n+1009 _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt_\b<_\bT_\bG_\b,_\bT_\bL_\b,_\bN_\b>_\b:_\b:_\be_\bn_\bd()\n+1010 {\n+1011 return iterator(*this,localIndices_.end());\n+1012 }\n+1013\n+1014 template\n+1015 inline typename ParallelIndexSet::const_iterator\n+1016 _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt_\b<_\bT_\bG_\b,_\bT_\bL_\b,_\bN_\b>_\b:_\b:_\bb_\be_\bg_\bi_\bn() const\n+1017 {\n+1018 return localIndices_.begin();\n+1019 }\n+1020\n+1021\n+1022 template\n+1023 inline typename ParallelIndexSet::const_iterator\n+1024 _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt_\b<_\bT_\bG_\b,_\bT_\bL_\b,_\bN_\b>_\b:_\b:_\be_\bn_\bd() const\n+1025 {\n+1026 return localIndices_.end();\n+1027 }\n+1028\n+1029 template\n+1030 void _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt_\b<_\bT_\bG_\b,_\bT_\bL_\b,_\bN_\b>_\b:_\b:_\br_\be_\bn_\bu_\bm_\bb_\be_\br_\bL_\bo_\bc_\ba_\bl(){\n+1031#ifndef NDEBUG\n+1032 if(state_==_\bR_\bE_\bS_\bI_\bZ_\bE)\n+1033 _\bD_\bU_\bN_\bE_\b__\bT_\bH_\bR_\bO_\bW(InvalidIndexSetState, \"IndexSet has to be in \"\n+1034 <<\"GROUND state for renumberLocal()\");\n+1035#endif\n+1036\n+1037 const auto end_ = end();\n+1038 uint32_t index=0;\n+1039\n+1040 for(auto pair=begin(); pair!=end_; index++, ++pair)\n+1041 pair->local()=index;\n+1042 }\n+1043\n+1044 template\n+1045 inline int _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt_\b<_\bT_\bG_\b,_\bT_\bL_\b,_\bN_\b>_\b:_\b:_\bs_\be_\bq_\bN_\bo() const\n+1046 {\n+1047 return seqNo_;\n+1048 }\n+1049\n+1050 template\n+1051 inline size_t _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt_\b<_\bT_\bG_\b,_\bT_\bL_\b,_\bN_\b>_\b:_\b:_\bs_\bi_\bz_\be() const\n+1052 {\n+1053 return localIndices_.size();\n+1054 }\n+1055\n+1056 template\n+1057 _\bG_\bl_\bo_\bb_\ba_\bl_\bL_\bo_\bo_\bk_\bu_\bp_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt_\b<_\bI_\b>_\b:_\b:_\bG_\bl_\bo_\bb_\ba_\bl_\bL_\bo_\bo_\bk_\bu_\bp_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt(const I& indexset,\n+1058 std::size_t _\bs_\bi_\bz_\be)\n+1059 : indexSet_(indexset), size_(_\bs_\bi_\bz_\be),\n+1060 indices_(size_, static_cast(0))\n+1061 {\n+1062 const_iterator end_ = indexSet_.end();\n+1063\n+1064 for(const_iterator pair = indexSet_.begin(); pair!=end_; ++pair) {\n+1065 assert(pair->local()local()] = &(*pair);\n+1067 }\n+1068 }\n+1069\n+1070 template\n+1071 _\bG_\bl_\bo_\bb_\ba_\bl_\bL_\bo_\bo_\bk_\bu_\bp_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt_\b<_\bI_\b>_\b:_\b:_\bG_\bl_\bo_\bb_\ba_\bl_\bL_\bo_\bo_\bk_\bu_\bp_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt(const I& indexset)\n+1072 : indexSet_(indexset), size_(0)\n+1073 {\n+1074 const_iterator end_ = indexSet_.end();\n+1075 for(const_iterator pair = indexSet_.begin(); pair!=end_; ++pair)\n+1076 size_=std::max(size_,static_cast(pair->local()));\n+1077\n+1078 indices_.resize(++size_, 0);\n+1079\n+1080 for(const_iterator pair = indexSet_.begin(); pair!=end_; ++pair)\n+1081 indices_[pair->local()] = &(*pair);\n+1082 }\n+1083\n+1084 template\n+1085 _\bG_\bl_\bo_\bb_\ba_\bl_\bL_\bo_\bo_\bk_\bu_\bp_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt_\b<_\bI_\b>_\b:_\b:_\b~_\bG_\bl_\bo_\bb_\ba_\bl_\bL_\bo_\bo_\bk_\bu_\bp_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt()\n+1086 {}\n+1087\n+1088 template\n+1089 inline const IndexPair*\n+1090 _\bG_\bl_\bo_\bb_\ba_\bl_\bL_\bo_\bo_\bk_\bu_\bp_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt_\b<_\bI_\b>_\b:_\b:_\bp_\ba_\bi_\br(const std::size_t& local) const\n+1091 {\n+1092 return indices_[local];\n+1093 }\n+1094\n+1095 template\n+1096 inline const IndexPair&\n+1097 _\bG_\bl_\bo_\bb_\ba_\bl_\bL_\bo_\bo_\bk_\bu_\bp_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt_\b<_\bI_\b>_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b[_\b](const GlobalIndex& global) const\n+1098 {\n+1099 return indexSet_[global];\n+1100 }\n+1101\n+1102 template\n+1103 typename I::const_iterator _\bG_\bl_\bo_\bb_\ba_\bl_\bL_\bo_\bo_\bk_\bu_\bp_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt_\b<_\bI_\b>_\b:_\b:_\bb_\be_\bg_\bi_\bn() const\n+1104 {\n+1105 return indexSet_.begin();\n+1106 }\n+1107\n+1108 template\n+1109 typename I::const_iterator _\bG_\bl_\bo_\bb_\ba_\bl_\bL_\bo_\bo_\bk_\bu_\bp_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt_\b<_\bI_\b>_\b:_\b:_\be_\bn_\bd() const\n+1110 {\n+1111 return indexSet_.end();\n+1112 }\n+1113\n+1114 template\n+1115 inline size_t _\bG_\bl_\bo_\bb_\ba_\bl_\bL_\bo_\bo_\bk_\bu_\bp_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt_\b<_\bI_\b>_\b:_\b:_\bs_\bi_\bz_\be() const\n+1116 {\n+1117 return size_;\n+1118 }\n+1119\n+1120 template\n+1121 inline int _\bG_\bl_\bo_\bb_\ba_\bl_\bL_\bo_\bo_\bk_\bu_\bp_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt_\b<_\bI_\b>_\b:_\b:_\bs_\be_\bq_\bN_\bo() const\n+1122 {\n+1123 return indexSet_.seqNo();\n+1124 }\n+1125\n+1126 template\n+1127 bool _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b=_\b=(const ParallelIndexSet& idxset,\n+1128 const ParallelIndexSet& idxset1)\n+1129 {\n+1130 if(idxset.size()!=idxset1.size())\n+1131 return false;\n+1132 typedef typename ParallelIndexSet::const_iterator Iter;\n+1133 typedef typename _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt_\b<_\bT_\bG_\b1_\b,_\bT_\bL_\b1_\b,_\bN_\b1_\b>_\b:_\b:_\bc_\bo_\bn_\bs_\bt_\b__\bi_\bt_\be_\br_\ba_\bt_\bo_\br Iter1;\n+1134 Iter iter=idxset.begin();\n+1135 for(Iter1 iter1=idxset1.begin(); iter1 != idxset1.end(); ++iter, ++iter1)\n+{\n+1136 if(iter1->global()!=iter->global())\n+1137 return false;\n+1138 typedef typename ParallelIndexSet::LocalIndex PI;\n+1139 const PI& pi=iter->local(), pi1=iter1->local();\n+1140\n+1141 if(pi!=pi1)\n+1142 return false;\n+1143 }\n+1144 return true;\n+1145 }\n+1146\n+1147 template\n+1148 bool _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b!_\b=(const ParallelIndexSet& idxset,\n+1149 const ParallelIndexSet& idxset1)\n+1150 {\n+1151 return !(idxset==idxset1);\n+1152 }\n+1153\n+1154\n+1155#endif // DOXYGEN\n+1156\n+1157}\n+1158\n+1159#endif // DUNE_COMMON_PARALLEL_INDEXSET_HH\n+_\bl_\bo_\bc_\ba_\bl_\bi_\bn_\bd_\be_\bx_\b._\bh_\bh\n+Provides classes for use as the local index in ParallelIndexSet.\n+_\bm_\bp_\bi_\bt_\br_\ba_\bi_\bt_\bs_\b._\bh_\bh\n+Traits classes for mapping types onto MPI_Datatype.\n+_\ba_\br_\br_\ba_\by_\bl_\bi_\bs_\bt_\b._\bh_\bh\n+Implements a random-access container that can efficiently change size (similar\n+to std::deque)\n _\be_\bx_\bc_\be_\bp_\bt_\bi_\bo_\bn_\bs_\b._\bh_\bh\n A few common exception classes.\n-_\bb_\bi_\bn_\ba_\br_\by_\bf_\bu_\bn_\bc_\bt_\bi_\bo_\bn_\bs_\b._\bh_\bh\n-helper classes to provide unique types for standard functions\n+_\bD_\bu_\bn_\be_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b<_\b<\n+std::ostream & operator<<(std::ostream &s, const bigunsignedint< k > &x)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bigunsignedint.hh:278\n _\bD_\bU_\bN_\bE_\b__\bT_\bH_\bR_\bO_\bW\n #define DUNE_THROW(E, m)\n D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn exceptions.hh:218\n+_\bD_\bu_\bn_\be_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b<\n+EnableIfInterOperable< T1, T2, bool >::type operator<(const\n+RandomAccessIteratorFacade< T1, V1, R1, D > &lhs, const\n+RandomAccessIteratorFacade< T2, V2, R2, D > &rhs)\n+Comparison operator.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn iteratorfacades.hh:638\n+_\bD_\bu_\bn_\be_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b>\n+EnableIfInterOperable< T1, T2, bool >::type operator>(const\n+RandomAccessIteratorFacade< T1, V1, R1, D > &lhs, const\n+RandomAccessIteratorFacade< T2, V2, R2, D > &rhs)\n+Comparison operator.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn iteratorfacades.hh:684\n+_\bD_\bu_\bn_\be_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b<_\b=\n+EnableIfInterOperable< T1, T2, bool >::type operator<=(const\n+RandomAccessIteratorFacade< T1, V1, R1, D > &lhs, const\n+RandomAccessIteratorFacade< T2, V2, R2, D > &rhs)\n+Comparison operator.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn iteratorfacades.hh:661\n _\bD_\bu_\bn_\be_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b=_\b=\n EnableIfInterOperable< T1, T2, bool >::type operator==(const\n ForwardIteratorFacade< T1, V1, R1, D > &lhs, const ForwardIteratorFacade< T2,\n V2, R2, D > &rhs)\n Checks for equality.\n D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn iteratorfacades.hh:238\n+_\bD_\bu_\bn_\be_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b>_\b=\n+EnableIfInterOperable< T1, T2, bool >::type operator>=(const\n+RandomAccessIteratorFacade< T1, V1, R1, D > &lhs, const\n+RandomAccessIteratorFacade< T2, V2, R2, D > &rhs)\n+Comparison operator.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn iteratorfacades.hh:706\n _\bD_\bu_\bn_\be_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b!_\b=\n EnableIfInterOperable< T1, T2, bool >::type operator!=(const\n ForwardIteratorFacade< T1, V1, R1, D > &lhs, const ForwardIteratorFacade< T2,\n V2, R2, D > &rhs)\n Checks for inequality.\n D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn iteratorfacades.hh:260\n+_\bD_\bu_\bn_\be_\b:_\b:_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b[_\b]\n+IndexPair & operator[](const GlobalIndex &global)\n+Find the index pair with a specific global id.\n+_\bD_\bu_\bn_\be_\b:_\b:_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt_\b:_\b:_\ba_\br_\br_\ba_\by_\bS_\bi_\bz_\be\n+static constexpr int arraySize\n+The size of the individual arrays in the underlying ArrayList.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn indexset.hh:252\n+_\bD_\bu_\bn_\be_\b:_\b:_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt_\b:_\b:_\bb_\be_\bg_\bi_\bn_\bR_\be_\bs_\bi_\bz_\be\n+void beginResize()\n+Indicate that the index set is to be resized.\n+_\bD_\bu_\bn_\be_\b:_\b:_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt_\bS_\bt_\ba_\bt_\be\n+ParallelIndexSetState\n+The states the index set can be in.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn indexset.hh:181\n+_\bD_\bu_\bn_\be_\b:_\b:_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt_\b:_\b:_\br_\be_\bn_\bu_\bm_\bb_\be_\br_\bL_\bo_\bc_\ba_\bl\n+void renumberLocal()\n+Renumbers the local index numbers.\n+_\bD_\bu_\bn_\be_\b:_\b:_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt_\b:_\b:_\be_\bx_\bi_\bs_\bt_\bs\n+bool exists(const GlobalIndex &global) const\n+Find the index pair with a specific global id.\n+_\bD_\bu_\bn_\be_\b:_\b:_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt_\b:_\b:_\bs_\bi_\bz_\be\n+size_t size() const\n+Get the total number (public and nonpublic) indices.\n+_\bD_\bu_\bn_\be_\b:_\b:_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt_\b:_\b:_\bc_\bo_\bn_\bs_\bt_\b__\bi_\bt_\be_\br_\ba_\bt_\bo_\br\n+ArrayList< IndexPair, N >::const_iterator const_iterator\n+The constant iterator over the pairs.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn indexset.hh:296\n+_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt_\bS_\bo_\br_\bt_\bF_\bu_\bn_\bc_\bt_\bo_\br_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b(_\b)\n+bool operator()(const IndexPair< TG, TL > &i1, const IndexPair< TG, TL > &i2)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn indexset.hh:625\n+_\bD_\bu_\bn_\be_\b:_\b:_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt_\b:_\b:_\ba_\bd_\bd\n+void add(const GlobalIndex &global)\n+Add an new index to the set.\n+_\bD_\bu_\bn_\be_\b:_\b:_\bG_\bl_\bo_\bb_\ba_\bl_\bL_\bo_\bo_\bk_\bu_\bp_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt_\b:_\b:_\be_\bn_\bd\n+const_iterator end() const\n+Get an iterator over the indices positioned after the last index.\n+_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bd_\be_\bx_\bP_\ba_\bi_\br_\b:_\b:_\bl_\bo_\bc_\ba_\bl\n+const LocalIndex & local() const\n+Get the local index.\n+_\bD_\bu_\bn_\be_\b:_\b:_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt_\b:_\b:_\ba_\bt\n+const IndexPair & at(const GlobalIndex &global) const\n+Find the index pair with a specific global id.\n+_\bD_\bu_\bn_\be_\b:_\b:_\bG_\bl_\bo_\bb_\ba_\bl_\bL_\bo_\bo_\bk_\bu_\bp_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt_\b:_\b:_\bG_\bl_\bo_\bb_\ba_\bl_\bL_\bo_\bo_\bk_\bu_\bp_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt\n+GlobalLookupIndexSet(const ParallelIndexSet &indexset)\n+Constructor.\n+_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bd_\be_\bx_\bP_\ba_\bi_\br_\b:_\b:_\bL_\bo_\bc_\ba_\bl_\bI_\bn_\bd_\be_\bx\n+TL LocalIndex\n+the type of the local index.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn indexset.hh:120\n+_\bD_\bu_\bn_\be_\b:_\b:_\bG_\bl_\bo_\bb_\ba_\bl_\bL_\bo_\bo_\bk_\bu_\bp_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt_\b:_\b:_\bs_\be_\bq_\bN_\bo\n+int seqNo() const\n+Get the internal sequence number.\n+_\bD_\bu_\bn_\be_\b:_\b:_\bL_\bo_\bc_\ba_\bl_\bI_\bn_\bd_\be_\bx_\bC_\bo_\bm_\bp_\ba_\br_\ba_\bt_\bo_\br_\b:_\b:_\bc_\bo_\bm_\bp_\ba_\br_\be\n+static bool compare(const T &t1, const T &t2)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn indexset.hh:616\n+_\bD_\bu_\bn_\be_\b:_\b:_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt_\b:_\b:_\bb_\be_\bg_\bi_\bn\n+iterator begin()\n+Get an iterator over the indices positioned at the first index.\n+_\bD_\bu_\bn_\be_\b:_\b:_\bG_\bl_\bo_\bb_\ba_\bl_\bL_\bo_\bo_\bk_\bu_\bp_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt_\b:_\b:_\bI_\bn_\bd_\be_\bx_\bP_\ba_\bi_\br\n+Dune::IndexPair< typename I::GlobalIndex, typename I::LocalIndex > IndexPair\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn indexset.hh:529\n+_\bD_\bu_\bn_\be_\b:_\b:_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt_\b:_\b:_\be_\bn_\bd\n+iterator end()\n+Get an iterator over the indices positioned after the last index.\n+_\bD_\bu_\bn_\be_\b:_\b:_\bG_\bl_\bo_\bb_\ba_\bl_\bL_\bo_\bo_\bk_\bu_\bp_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt_\b:_\b:_\bc_\bo_\bn_\bs_\bt_\b__\bi_\bt_\be_\br_\ba_\bt_\bo_\br\n+ParallelIndexSet::const_iterator const_iterator\n+The iterator over the index pairs.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn indexset.hh:527\n+_\bD_\bu_\bn_\be_\b:_\b:_\bG_\bl_\bo_\bb_\ba_\bl_\bL_\bo_\bo_\bk_\bu_\bp_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt_\b:_\b:_\bb_\be_\bg_\bi_\bn\n+const_iterator begin() const\n+Get an iterator over the indices positioned at the first index.\n+_\bD_\bu_\bn_\be_\b:_\b:_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b[_\b]\n+const IndexPair & operator[](const GlobalIndex &global) const\n+Find the index pair with a specific global id.\n+_\bD_\bu_\bn_\be_\b:_\b:_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt_\b:_\b:_\bs_\bt_\ba_\bt_\be\n+const ParallelIndexSetState & state()\n+Get the state the index set is in.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn indexset.hh:307\n+_\bD_\bu_\bn_\be_\b:_\b:_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt_\b:_\b:_\bb_\be_\bg_\bi_\bn\n+const_iterator begin() const\n+Get an iterator over the indices positioned at the first index.\n+_\bD_\bu_\bn_\be_\b:_\b:_\bG_\bl_\bo_\bb_\ba_\bl_\bL_\bo_\bo_\bk_\bu_\bp_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b[_\b]\n+const IndexPair & operator[](const GlobalIndex &global) const\n+Find the index pair with a specific global id.\n+_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bd_\be_\bx_\bP_\ba_\bi_\br_\b:_\b:_\bI_\bn_\bd_\be_\bx_\bP_\ba_\bi_\br\n+IndexPair()\n+Construct a new Pair.\n+_\bD_\bu_\bn_\be_\b:_\b:_\bG_\bl_\bo_\bb_\ba_\bl_\bL_\bo_\bo_\bk_\bu_\bp_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt_\b:_\b:_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt\n+I ParallelIndexSet\n+The type of the index set.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn indexset.hh:512\n+_\bD_\bu_\bn_\be_\b:_\b:_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt_\b:_\b:_\bL_\bo_\bc_\ba_\bl_\bI_\bn_\bd_\be_\bx\n+TL LocalIndex\n+The type of the local index, e.g. ParallelLocalIndex.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn indexset.hh:239\n+_\bD_\bu_\bn_\be_\b:_\b:_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt_\b:_\b:_\bm_\ba_\br_\bk_\bA_\bs_\bD_\be_\bl_\be_\bt_\be_\bd\n+void markAsDeleted(const iterator &position)\n+Mark an index as deleted.\n+_\bD_\bu_\bn_\be_\b:_\b:_\bG_\bl_\bo_\bb_\ba_\bl_\bL_\bo_\bo_\bk_\bu_\bp_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt_\b:_\b:_\bL_\bo_\bc_\ba_\bl_\bI_\bn_\bd_\be_\bx\n+ParallelIndexSet::LocalIndex LocalIndex\n+The type of the local index.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn indexset.hh:517\n+_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bd_\be_\bx_\bP_\ba_\bi_\br_\b:_\b:_\bI_\bn_\bd_\be_\bx_\bP_\ba_\bi_\br\n+IndexPair(const GlobalIndex &global, const LocalIndex &local)\n+Constructs a new Pair.\n+_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bd_\be_\bx_\bP_\ba_\bi_\br_\b:_\b:_\bs_\be_\bt_\bL_\bo_\bc_\ba_\bl\n+void setLocal(int index)\n+Set the local index.\n+_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bd_\be_\bx_\bP_\ba_\bi_\br_\b:_\b:_\bg_\bl_\bo_\bb_\ba_\bl\n+const GlobalIndex & global() const\n+Get the global index.\n+_\bD_\bu_\bn_\be_\b:_\b:_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt_\b:_\b:_\ba_\bd_\bd\n+void add(const GlobalIndex &global, const LocalIndex &local)\n+Add an new index to the set.\n+_\bD_\bu_\bn_\be_\b:_\b:_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt_\b:_\b:_\be_\bn_\bd\n+const_iterator end() const\n+Get an iterator over the indices positioned after the last index.\n+_\bD_\bu_\bn_\be_\b:_\b:_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt_\b:_\b:_\ba_\bt\n+IndexPair & at(const GlobalIndex &global)\n+Find the index pair with a specific global id.\n+_\bD_\bu_\bn_\be_\b:_\b:_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt_\b:_\b:_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt\n+ParallelIndexSet()\n+Constructor.\n+_\bD_\bu_\bn_\be_\b:_\b:_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt_\b:_\b:_\be_\bn_\bd_\bR_\be_\bs_\bi_\bz_\be\n+void endResize()\n+Indicate that the resizing finishes.\n+_\bD_\bu_\bn_\be_\b:_\b:_\bG_\bl_\bo_\bb_\ba_\bl_\bL_\bo_\bo_\bk_\bu_\bp_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt_\b:_\b:_\b~_\bG_\bl_\bo_\bb_\ba_\bl_\bL_\bo_\bo_\bk_\bu_\bp_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt\n+~GlobalLookupIndexSet()\n+Destructor.\n+_\bD_\bu_\bn_\be_\b:_\b:_\bG_\bl_\bo_\bb_\ba_\bl_\bL_\bo_\bo_\bk_\bu_\bp_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt_\b:_\b:_\bp_\ba_\bi_\br\n+const IndexPair * pair(const std::size_t &local) const\n+Get the index pair corresponding to a local index.\n+_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bd_\be_\bx_\bP_\ba_\bi_\br_\b:_\b:_\bl_\bo_\bc_\ba_\bl\n+LocalIndex & local()\n+Get the local index.\n+_\bD_\bu_\bn_\be_\b:_\b:_\bG_\bl_\bo_\bb_\ba_\bl_\bL_\bo_\bo_\bk_\bu_\bp_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt_\b:_\b:_\bs_\bi_\bz_\be\n+size_t size() const\n+Get the total number (public and nonpublic) indices.\n+_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bd_\be_\bx_\bP_\ba_\bi_\br_\b:_\b:_\bI_\bn_\bd_\be_\bx_\bP_\ba_\bi_\br\n+IndexPair(const GlobalIndex &global)\n+Constructs a new Pair.\n+_\bD_\bu_\bn_\be_\b:_\b:_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt_\b:_\b:_\bG_\bl_\bo_\bb_\ba_\bl_\bI_\bn_\bd_\be_\bx\n+TG GlobalIndex\n+the type of the global index. This type has to provide at least a operator< for\n+sorting.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn indexset.hh:226\n+_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bd_\be_\bx_\bP_\ba_\bi_\br_\b:_\b:_\bG_\bl_\bo_\bb_\ba_\bl_\bI_\bn_\bd_\be_\bx\n+TG GlobalIndex\n+the type of the global index.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn indexset.hh:107\n+_\bD_\bu_\bn_\be_\b:_\b:_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt_\b:_\b:_\bs_\be_\bq_\bN_\bo\n+int seqNo() const\n+Get the internal sequence number.\n+_\bD_\bu_\bn_\be_\b:_\b:_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt_\b:_\b:_\bi_\bt_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\bi_\bt_\be_\br_\ba_\bt_\bo_\br\n+iterator(ParallelIndexSet< TG, TL, N > &indexSet, const Father &father)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn indexset.hh:262\n+_\bD_\bu_\bn_\be_\b:_\b:_\bG_\bl_\bo_\bb_\ba_\bl_\bL_\bo_\bo_\bk_\bu_\bp_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt_\b:_\b:_\bG_\bl_\bo_\bb_\ba_\bl_\bL_\bo_\bo_\bk_\bu_\bp_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt\n+GlobalLookupIndexSet(const ParallelIndexSet &indexset, std::size_t size)\n+Constructor.\n+_\bD_\bu_\bn_\be_\b:_\b:_\bG_\bl_\bo_\bb_\ba_\bl_\bL_\bo_\bo_\bk_\bu_\bp_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt_\b:_\b:_\bG_\bl_\bo_\bb_\ba_\bl_\bI_\bn_\bd_\be_\bx\n+ParallelIndexSet::GlobalIndex GlobalIndex\n+The type of the global index.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn indexset.hh:522\n+_\bD_\bu_\bn_\be_\b:_\b:_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt_\b:_\b:_\bI_\bn_\bd_\be_\bx_\bP_\ba_\bi_\br\n+Dune::IndexPair< GlobalIndex, LocalIndex > IndexPair\n+The type of the pair stored.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn indexset.hh:244\n+_\bD_\bu_\bn_\be_\b:_\b:_\bR_\bE_\bS_\bI_\bZ_\bE\n+@ RESIZE\n+Indicates that the index set is currently being resized.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn indexset.hh:190\n+_\bD_\bu_\bn_\be_\b:_\b:_\bG_\bR_\bO_\bU_\bN_\bD\n+@ GROUND\n+The default mode. Indicates that the index set is ready to be used.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn indexset.hh:186\n+_\bD_\bu_\bn_\be_\b:_\b:_\bD_\bE_\bL_\bE_\bT_\bE_\bD\n+@ DELETED\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn localindex.hh:28\n _\bD_\bu_\bn_\be\n Dune namespace.\n D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn alignedallocator.hh:13\n-_\bD_\bu_\bn_\be_\b:_\b:_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bE_\br_\br_\bo_\br\n-Default exception if an error in the parallel communication of the program\n-occurred.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn exceptions.hh:287\n-_\bD_\bu_\bn_\be_\b:_\b:_\bN_\bo_\b__\bC_\bo_\bm_\bm\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn communication.hh:46\n-_\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn\n-Collective communication interface and sequential default implementation.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn communication.hh:100\n-_\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\bi_\ba_\bl_\bl_\br_\be_\bd_\bu_\bc_\be\n-PseudoFuture< TOUT > iallreduce(TIN &&data_in, TOUT &&data_out)\n-Compute something over all processes nonblocking.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn communication.hh:496\n-_\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\bs_\be_\bn_\bd\n-int send(const T &data, int dest_rank, int tag)\n-Sends the data to the dest_rank.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn communication.hh:135\n-_\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\ba_\bl_\bl_\br_\be_\bd_\bu_\bc_\be\n-int allreduce(const Type *in, Type *out, int len) const\n-Compute something over all processes for each component of an array and return\n-the result in every pr...\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn communication.hh:525\n-_\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\bm_\ba_\bx\n-T max(const T &in) const\n-Compute the maximum of the argument over all processes and return the result in\n-every process....\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn communication.hh:248\n-_\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\br_\ba_\bn_\bk\n-int rank() const\n-Return rank, is between 0 and size()-1.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn communication.hh:114\n-_\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\bs_\bu_\bm\n-T sum(const T &in) const\n-Compute the sum of the argument over all processes and return the result in\n-every process....\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn communication.hh:188\n-_\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\bs_\bc_\ba_\bt_\bt_\be_\br_\bv\n-int scatterv(const T *sendData, int *sendDataLen, int *displ, T *recvData, int\n-recvDataLen, int root) const\n-Scatter arrays of variable length from a root to all other tasks.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn communication.hh:411\n-_\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\bp_\br_\bo_\bd\n-int prod(T *inout, int len) const\n-Compute the product over all processes for each component of an array and\n-return the result in every ...\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn communication.hh:219\n-_\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\br_\be_\bc_\bv\n-T recv(T &&data, int source_rank, int tag, void *status=0)\n-Receives the data from the source_rank.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn communication.hh:157\n-_\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\bi_\bs_\be_\bn_\bd\n-PseudoFuture< T > isend(const T &&data, int dest_rank, int tag)\n-Sends the data to the dest_rank nonblocking.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn communication.hh:146\n-_\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\bi_\bb_\ba_\br_\br_\bi_\be_\br\n-PseudoFuture< void > ibarrier() const\n-Nonblocking barrier.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn communication.hh:275\n-_\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\ba_\bl_\bl_\br_\be_\bd_\bu_\bc_\be\n-int allreduce(Type *inout, int len) const\n-Compute something over all processes for each component of an array and return\n-the result in every pr...\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn communication.hh:486\n-_\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\bs_\bi_\bz_\be\n-int size() const\n-Number of processes in set, is greater than 0.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn communication.hh:126\n-_\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\bs_\bu_\bm\n-int sum(T *inout, int len) const\n-Compute the sum over all processes for each component of an array and return\n-the result in every proc...\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn communication.hh:199\n-_\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\ba_\bl_\bl_\bg_\ba_\bt_\bh_\be_\br_\bv\n-int allgatherv(const T *in, int sendDataLen, T *out, int *recvDataLen, int\n-*displ) const\n-Gathers data of variable length from all tasks and distribute it to all.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn communication.hh:466\n-_\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\bm_\bi_\bn\n-T min(const T &in) const\n-Compute the minimum of the argument over all processes and return the result in\n-every process....\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn communication.hh:228\n-_\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\bi_\br_\be_\bc_\bv\n-PseudoFuture< T > irecv(T &&data, int source_rank, int tag)\n-Receives the data from the source_rank nonblocking.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn communication.hh:169\n-_\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\bg_\ba_\bt_\bh_\be_\br_\bv\n-int gatherv(const T *in, int sendDataLen, T *out, int *recvDataLen, int *displ,\n-int root) const\n-Gather arrays of variable size on root task.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn communication.hh:350\n-_\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\bi_\bb_\br_\bo_\ba_\bd_\bc_\ba_\bs_\bt\n-PseudoFuture< T > ibroadcast(T &&data, int root) const\n-Distribute an array from the process with rank root to all other processes\n-nonblocking.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn communication.hh:295\n-_\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\ba_\bl_\bl_\bg_\ba_\bt_\bh_\be_\br\n-int allgather(const T *sbuf, int count, T *rbuf) const\n-Gathers data from all tasks and distribute it to all.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn communication.hh:433\n-_\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\bs_\bc_\ba_\bt_\bt_\be_\br\n-int scatter(const T *sendData, T *recvData, int len, int root) const\n-Scatter array from a root to all other task.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn communication.hh:376\n-_\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\bg_\ba_\bt_\bh_\be_\br\n-int gather(const T *in, T *out, int len, int root) const\n-Gather arrays on root task.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn communication.hh:313\n-_\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\bi_\ba_\bl_\bl_\br_\be_\bd_\bu_\bc_\be\n-PseudoFuture< T > iallreduce(T &&data)\n-Compute something over all processes nonblocking and in-place.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn communication.hh:506\n-_\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn\n-Communication(const Communicator &)\n-Constructor with a given communicator.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn communication.hh:110\n-_\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\bm_\ba_\bx\n-int max(T *inout, int len) const\n-Compute the maximum over all processes for each component of an array and\n-return the result in every ...\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn communication.hh:259\n-_\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\bp_\br_\bo_\bd\n-T prod(const T &in) const\n-Compute the product of the argument over all processes and return the result in\n-every process....\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn communication.hh:208\n-_\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\bb_\br_\bo_\ba_\bd_\bc_\ba_\bs_\bt\n-int broadcast(T *inout, int len, int root) const\n-Distribute an array from the process with rank root to all other processes.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn communication.hh:284\n-_\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\br_\br_\be_\bc_\bv\n-T rrecv(T &&data, int source_rank, int tag, void *status=0) const\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn communication.hh:177\n-_\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\bi_\bs_\bc_\ba_\bt_\bt_\be_\br\n-PseudoFuture< TOUT > iscatter(TIN &&data_in, TOUT &&data_out, int root)\n-Scatter array from a root to all other task nonblocking.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn communication.hh:387\n-_\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\bm_\bi_\bn\n-int min(T *inout, int len) const\n-Compute the minimum over all processes for each component of an array and\n-return the result in every ...\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn communication.hh:239\n-_\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\bb_\ba_\br_\br_\bi_\be_\br\n-int barrier() const\n-Wait until all processes have arrived at this point in the program.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn communication.hh:267\n-_\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\bi_\bg_\ba_\bt_\bh_\be_\br\n-PseudoFuture< TOUT > igather(TIN &&data_in, TOUT &&data_out, int root)\n-Gather arrays on root task nonblocking.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn communication.hh:324\n-_\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\bi_\ba_\bl_\bl_\bg_\ba_\bt_\bh_\be_\br\n-PseudoFuture< TOUT > iallgather(TIN &&data_in, TOUT &&data_out)\n-Gathers data from all tasks and distribute it to all nonblocking.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn communication.hh:445\n-_\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn\n-Communication()\n-Construct default object.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn communication.hh:103\n-_\bD_\bu_\bn_\be_\b:_\b:_\bP_\bs_\be_\bu_\bd_\bo_\bF_\bu_\bt_\bu_\br_\be\n-A wrapper-class for a object which is ready immediately.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn future.hh:124\n+_\bD_\bu_\bn_\be_\b:_\b:_\bs_\bi_\bz_\be\n+constexpr std::integral_constant< std::size_t, sizeof...(II)> size(std::\n+integer_sequence< T, II... >)\n+Return the size of the sequence.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn integersequence.hh:75\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\br_\br_\ba_\by_\bL_\bi_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br\n+A random access iterator for the Dune::ArrayList class.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn arraylist.hh:255\n+_\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bn_\bs_\bt_\bA_\br_\br_\ba_\by_\bL_\bi_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br\n+A constant random access iterator for the Dune::ArrayList class.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn arraylist.hh:368\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\br_\br_\ba_\by_\bL_\bi_\bs_\bt\n+A dynamically growing random access list.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn arraylist.hh:62\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\br_\br_\ba_\by_\bL_\bi_\bs_\bt_\b:_\b:_\bc_\bo_\bn_\bs_\bt_\b__\bi_\bt_\be_\br_\ba_\bt_\bo_\br\n+ConstArrayListIterator< MemberType, N, A > const_iterator\n+A constant random access iterator.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn arraylist.hh:110\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\bP_\bI_\bT_\br_\ba_\bi_\bt_\bs\n+A traits class describing the mapping of types onto MPI_Datatypes.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mpitraits.hh:41\n+_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bv_\ba_\bl_\bi_\bd_\bS_\bt_\ba_\bt_\be_\bE_\bx_\bc_\be_\bp_\bt_\bi_\bo_\bn\n+Default exception if a function was called while the object is not in a valid\n+state for that function...\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn exceptions.hh:281\n+_\bD_\bu_\bn_\be_\b:_\b:_\bR_\ba_\bn_\bd_\bo_\bm_\bA_\bc_\bc_\be_\bs_\bs_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bF_\ba_\bc_\ba_\bd_\be_\b<_\b _\bA_\br_\br_\ba_\by_\bL_\bi_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b<_\b _\bT_\b,_\b _\bN_\b,_\b _\bA_\b _\b>_\b,_\b _\bA_\b:_\b:_\bv_\ba_\bl_\bu_\be_\b__\bt_\by_\bp_\be_\b,\n+_\bA_\b:_\b:_\bv_\ba_\bl_\bu_\be_\b__\bt_\by_\bp_\be_\b _\b&_\b,_\b _\bA_\b:_\b:_\bd_\bi_\bf_\bf_\be_\br_\be_\bn_\bc_\be_\b__\bt_\by_\bp_\be_\b _\b>_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b*\n+Reference operator*() const\n+Dereferencing operator.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn iteratorfacades.hh:501\n+_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bd_\be_\bx_\bP_\ba_\bi_\br\n+A pair consisting of a global and local index.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn indexset.hh:85\n+_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bv_\ba_\bl_\bi_\bd_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt_\bS_\bt_\ba_\bt_\be\n+Exception indicating that the index set is not in the expected state.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn indexset.hh:205\n+_\bD_\bu_\bn_\be_\b:_\b:_\bG_\bl_\bo_\bb_\ba_\bl_\bL_\bo_\bo_\bk_\bu_\bp_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt\n+Decorates an index set with the possibility to find a global index that is\n+mapped to a specific local...\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn indexset.hh:507\n+_\bD_\bu_\bn_\be_\b:_\b:_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt\n+Manager class for the mapping between local indices and globally unique\n+indices.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn indexset.hh:218\n+_\bD_\bu_\bn_\be_\b:_\b:_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt_\b:_\b:_\bi_\bt_\be_\br_\ba_\bt_\bo_\br\n+The iterator over the pairs.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn indexset.hh:257\n+_\bD_\bu_\bn_\be_\b:_\b:_\bL_\bo_\bc_\ba_\bl_\bI_\bn_\bd_\be_\bx_\bC_\bo_\bm_\bp_\ba_\br_\ba_\bt_\bo_\br\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn indexset.hh:615\n+_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt_\bS_\bo_\br_\bt_\bF_\bu_\bn_\bc_\bt_\bo_\br\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn indexset.hh:624\n ===============================================================================\n Generated by\u00a0_\b[_\bd_\bo_\bx_\by_\bg_\be_\bn_\b] 1.9.8\n"}]}, {"source1": "./usr/share/doc/libdune-common-doc/doxygen/a00053.html", "source2": "./usr/share/doc/libdune-common-doc/doxygen/a00053.html", "unified_diff": "@@ -1,15 +1,15 @@\n \n \n \n \n \n \n \n-dune-common: selection.hh File Reference\n+dune-common: indicessyncer.hh File Reference\n \n \n \n \n \n \n \n@@ -71,47 +71,80 @@\n \n
    \n
    \n \n+ \n
    \n
    \n \n-

    Provides classes for selecting indices based on attribute flags. \n+

    Class for adding missing indices of a distributed index set in a local communication. \n More...

    \n-
    #include <cstdint>
    \n-#include <dune/common/iteratorfacades.hh>
    \n-#include <dune/common/parallel/indexset.hh>
    \n+
    #include <algorithm>
    \n+#include <cassert>
    \n+#include <cmath>
    \n+#include <functional>
    \n+#include <limits>
    \n+#include <map>
    \n+#include <tuple>
    \n+#include <mpi.h>
    \n+#include <dune/common/stdstreams.hh>
    \n+#include <dune/common/sllist.hh>
    \n+#include <dune/common/parallel/indexset.hh>
    \n+#include <dune/common/parallel/remoteindices.hh>
    \n
    \n

    Go to the source code of this file.

    \n \n \n-\n-\n-\n-\n-\n-\n-\n-\n+\n+\n \n

    \n Classes

    class  Dune::SelectionIterator< TS, TG, TL, N >
     A const iterator over an uncached selection. More...
     
    class  Dune::UncachedSelection< TS, TG, TL, N >
     An uncached selection of indices. More...
     
    class  Dune::Selection< TS, TG, TL, N >
     A cached selection of indices. More...
    class  Dune::IndicesSyncer< T >
     Class for recomputing missing indices of a distributed index set. More...
     
    \n \n \n \n \n+

    \n Namespaces

    namespace  Dune
     Dune namespace.
     
    \n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n

    \n+Functions

    template<typename TG , typename TA >
    bool Dune::operator< (const IndexPair< TG, ParallelLocalIndex< TA > > &i1, const std::pair< TG, TA > &i2)
     
    template<typename TG , typename TA >
    bool Dune::operator< (const std::pair< TG, TA > &i1, const IndexPair< TG, ParallelLocalIndex< TA > > &i2)
     
    template<typename TG , typename TA >
    bool Dune::operator== (const IndexPair< TG, ParallelLocalIndex< TA > > &i1, const std::pair< TG, TA > &i2)
     
    template<typename TG , typename TA >
    bool Dune::operator!= (const IndexPair< TG, ParallelLocalIndex< TA > > &i1, const std::pair< TG, TA > &i2)
     
    template<typename TG , typename TA >
    bool Dune::operator== (const std::pair< TG, TA > &i2, const IndexPair< TG, ParallelLocalIndex< TA > > &i1)
     
    template<typename TG , typename TA >
    bool Dune::operator!= (const std::pair< TG, TA > &i2, const IndexPair< TG, ParallelLocalIndex< TA > > &i1)
     
    template<typename T , typename A , typename A1 >
    void Dune::storeGlobalIndicesOfRemoteIndices (std::map< int, SLList< std::pair< typename T::GlobalIndex, typename T::LocalIndex::Attribute >, A > > &globalMap, const RemoteIndices< T, A1 > &remoteIndices)
     Stores the corresponding global indices of the remote index information.
     
    template<typename T , typename A , typename A1 >
    void Dune::repairLocalIndexPointers (std::map< int, SLList< std::pair< typename T::GlobalIndex, typename T::LocalIndex::Attribute >, A > > &globalMap, RemoteIndices< T, A1 > &remoteIndices, const T &indexSet)
     Repair the pointers to the local indices in the remote indices.
     
    \n

    Detailed Description

    \n-

    Provides classes for selecting indices based on attribute flags.

    \n+

    Class for adding missing indices of a distributed index set in a local communication.

    \n
    Author
    Markus Blatt
    \n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,35 +1,78 @@\n dune-common\u00a02.10\n Loading...\n Searching...\n No Matches\n * _\bd_\bu_\bn_\be\n * _\bc_\bo_\bm_\bm_\bo_\bn\n * _\bp_\ba_\br_\ba_\bl_\bl_\be_\bl\n-_\bC_\bl_\ba_\bs_\bs_\be_\bs | _\bN_\ba_\bm_\be_\bs_\bp_\ba_\bc_\be_\bs\n-selection.hh File Reference\n+_\bC_\bl_\ba_\bs_\bs_\be_\bs | _\bN_\ba_\bm_\be_\bs_\bp_\ba_\bc_\be_\bs | _\bF_\bu_\bn_\bc_\bt_\bi_\bo_\bn_\bs\n+indicessyncer.hh File Reference\n _\bC_\bo_\bm_\bm_\bo_\bn \u00bb _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\b _\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn \u00bb _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\b _\bC_\bo_\bm_\bp_\bu_\bt_\bi_\bn_\bg_\b _\bb_\ba_\bs_\be_\bd_\b _\bo_\bn_\b _\bI_\bn_\bd_\be_\bx_\bs_\be_\bt_\bs\n-Provides classes for selecting indices based on attribute flags. _\bM_\bo_\br_\be_\b._\b._\b.\n-#include \n-#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bi_\bt_\be_\br_\ba_\bt_\bo_\br_\bf_\ba_\bc_\ba_\bd_\be_\bs_\b._\bh_\bh>\n+Class for adding missing indices of a distributed index set in a local\n+communication. _\bM_\bo_\br_\be_\b._\b._\b.\n+#include \n+#include \n+#include \n+#include \n+#include \n+#include \n+#include \n+#include \n+#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bs_\bt_\bd_\bs_\bt_\br_\be_\ba_\bm_\bs_\b._\bh_\bh>\n+#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bs_\bl_\bl_\bi_\bs_\bt_\b._\bh_\bh>\n #include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bp_\ba_\br_\ba_\bl_\bl_\be_\bl_\b/_\bi_\bn_\bd_\be_\bx_\bs_\be_\bt_\b._\bh_\bh>\n+#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bp_\ba_\br_\ba_\bl_\bl_\be_\bl_\b/_\br_\be_\bm_\bo_\bt_\be_\bi_\bn_\bd_\bi_\bc_\be_\bs_\b._\bh_\bh>\n _\bG_\bo_\b _\bt_\bo_\b _\bt_\bh_\be_\b _\bs_\bo_\bu_\br_\bc_\be_\b _\bc_\bo_\bd_\be_\b _\bo_\bf_\b _\bt_\bh_\bi_\bs_\b _\bf_\bi_\bl_\be_\b.\n C\bCl\bla\bas\bss\bse\bes\bs\n-class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bS_\be_\bl_\be_\bc_\bt_\bi_\bo_\bn_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b<_\b _\bT_\bS_\b,_\b _\bT_\bG_\b,_\b _\bT_\bL_\b,_\b _\bN_\b _\b>\n-\u00a0 A const iterator over an uncached selection. _\bM_\bo_\br_\be_\b._\b._\b.\n-\u00a0\n-class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bU_\bn_\bc_\ba_\bc_\bh_\be_\bd_\bS_\be_\bl_\be_\bc_\bt_\bi_\bo_\bn_\b<_\b _\bT_\bS_\b,_\b _\bT_\bG_\b,_\b _\bT_\bL_\b,_\b _\bN_\b _\b>\n-\u00a0 An uncached selection of indices. _\bM_\bo_\br_\be_\b._\b._\b.\n-\u00a0\n-class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bS_\be_\bl_\be_\bc_\bt_\bi_\bo_\bn_\b<_\b _\bT_\bS_\b,_\b _\bT_\bG_\b,_\b _\bT_\bL_\b,_\b _\bN_\b _\b>\n-\u00a0 A cached selection of indices. _\bM_\bo_\br_\be_\b._\b._\b.\n+class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bd_\bi_\bc_\be_\bs_\bS_\by_\bn_\bc_\be_\br_\b<_\b _\bT_\b _\b>\n+\u00a0 Class for recomputing missing indices of a distributed index set.\n+ _\bM_\bo_\br_\be_\b._\b._\b.\n \u00a0\n N\bNa\bam\bme\bes\bsp\bpa\bac\bce\bes\bs\n namespace \u00a0 _\bD_\bu_\bn_\be\n \u00a0 _\bD_\bu_\bn_\be namespace.\n \u00a0\n+F\bFu\bun\bnc\bct\bti\bio\bon\bns\bs\n+template\n+bool\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b< (const _\bI_\bn_\bd_\be_\bx_\bP_\ba_\bi_\br< TG, _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bL_\bo_\bc_\ba_\bl_\bI_\bn_\bd_\be_\bx< TA > > &i1,\n+ const std::pair< TG, TA > &i2)\n+\u00a0\n+template\n+bool\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b< (const std::pair< TG, TA > &i1, const _\bI_\bn_\bd_\be_\bx_\bP_\ba_\bi_\br< TG,\n+ _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bL_\bo_\bc_\ba_\bl_\bI_\bn_\bd_\be_\bx< TA > > &i2)\n+\u00a0\n+template\n+bool\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b=_\b= (const _\bI_\bn_\bd_\be_\bx_\bP_\ba_\bi_\br< TG, _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bL_\bo_\bc_\ba_\bl_\bI_\bn_\bd_\be_\bx< TA > > &i1,\n+ const std::pair< TG, TA > &i2)\n+\u00a0\n+template\n+bool\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b!_\b= (const _\bI_\bn_\bd_\be_\bx_\bP_\ba_\bi_\br< TG, _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bL_\bo_\bc_\ba_\bl_\bI_\bn_\bd_\be_\bx< TA > > &i1,\n+ const std::pair< TG, TA > &i2)\n+\u00a0\n+template\n+bool\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b=_\b= (const std::pair< TG, TA > &i2, const _\bI_\bn_\bd_\be_\bx_\bP_\ba_\bi_\br< TG,\n+ _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bL_\bo_\bc_\ba_\bl_\bI_\bn_\bd_\be_\bx< TA > > &i1)\n+\u00a0\n+template\n+bool\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b!_\b= (const std::pair< TG, TA > &i2, const _\bI_\bn_\bd_\be_\bx_\bP_\ba_\bi_\br< TG,\n+ _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bL_\bo_\bc_\ba_\bl_\bI_\bn_\bd_\be_\bx< TA > > &i1)\n+\u00a0\n+template\n+void\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bs_\bt_\bo_\br_\be_\bG_\bl_\bo_\bb_\ba_\bl_\bI_\bn_\bd_\bi_\bc_\be_\bs_\bO_\bf_\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\bi_\bc_\be_\bs (std::map< int, _\bS_\bL_\bL_\bi_\bs_\bt< std::\n+ pair< typename T::GlobalIndex, typename T::LocalIndex::Attribute >, A > >\n+ &globalMap, const _\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\bi_\bc_\be_\bs< T, A1 > &remoteIndices)\n+\u00a0 Stores the corresponding global indices of the remote index information.\n+\u00a0\n+template\n+void\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\br_\be_\bp_\ba_\bi_\br_\bL_\bo_\bc_\ba_\bl_\bI_\bn_\bd_\be_\bx_\bP_\bo_\bi_\bn_\bt_\be_\br_\bs (std::map< int, _\bS_\bL_\bL_\bi_\bs_\bt< std::pair<\n+ typename T::GlobalIndex, typename T::LocalIndex::Attribute >, A > >\n+ &globalMap, _\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\bi_\bc_\be_\bs< T, A1 > &remoteIndices, const T &indexSet)\n+\u00a0 Repair the pointers to the local indices in the remote indices.\n+\u00a0\n *\b**\b**\b**\b**\b* D\bDe\bet\bta\bai\bil\ble\bed\bd D\bDe\bes\bsc\bcr\bri\bip\bpt\bti\bio\bon\bn *\b**\b**\b**\b**\b*\n-Provides classes for selecting indices based on attribute flags.\n+Class for adding missing indices of a distributed index set in a local\n+communication.\n Author\n Markus Blatt\n ===============================================================================\n Generated by\u00a0_\b[_\bd_\bo_\bx_\by_\bg_\be_\bn_\b] 1.9.8\n"}]}, {"source1": "./usr/share/doc/libdune-common-doc/doxygen/a00053_source.html", "source2": "./usr/share/doc/libdune-common-doc/doxygen/a00053_source.html", "unified_diff": "@@ -1,15 +1,15 @@\n \n \n \n \n \n \n \n-dune-common: selection.hh Source File\n+dune-common: indicessyncer.hh Source File\n \n \n \n \n \n \n \n@@ -74,320 +74,1052 @@\n \n \n
    \n
    \n-
    selection.hh
    \n+
    indicessyncer.hh
    \n
    \n
    \n Go to the documentation of this file.
    1// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
    \n
    2// vi: set et ts=4 sw=2 sts=2:
    \n
    3// SPDX-FileCopyrightInfo: Copyright \u00a9 DUNE Project contributors, see file LICENSE.md in module root
    \n
    4// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception
    \n-
    5#ifndef DUNE_COMMON_PARALLEL_SELECTION_HH
    \n-
    6#define DUNE_COMMON_PARALLEL_SELECTION_HH
    \n+
    5#ifndef DUNE_COMMON_PARALLEL_INDICESSYNCER_HH
    \n+
    6#define DUNE_COMMON_PARALLEL_INDICESSYNCER_HH
    \n
    7
    \n-
    8#include <cstdint>
    \n+
    8#if HAVE_MPI
    \n
    9
    \n-\n-\n-
    12
    \n-
    13namespace Dune
    \n-
    14{
    \n-
    29 template<typename TS, typename TG, typename TL, int N>
    \n-
    \n-\n-
    31 {
    \n-
    32 public:
    \n-
    41 typedef TS AttributeSet;
    \n-
    42
    \n-\n+
    10#include <algorithm>
    \n+
    11#include <cassert>
    \n+
    12#include <cmath>
    \n+
    13#include <functional>
    \n+
    14#include <limits>
    \n+
    15#include <map>
    \n+
    16#include <tuple>
    \n+
    17
    \n+
    18#include <mpi.h>
    \n+
    19
    \n+\n+
    21#include <dune/common/sllist.hh>
    \n+\n+\n+
    24
    \n+
    25namespace Dune
    \n+
    26{
    \n+
    43 template<typename T>
    \n+
    \n+\n+
    45 {
    \n+
    46 public:
    \n
    47
    \n-
    48 //typedef typename ParallelIndexSet::const_iterator ParallelIndexSetIterator;
    \n-
    49
    \n-
    50 typedef ConstArrayListIterator<IndexPair<TG,TL>, N, std::allocator<Dune::IndexPair<TG,TL> > > ParallelIndexSetIterator;
    \n-
    \n-\n-
    57 : iter_(iter), end_(end)
    \n-
    58 {
    \n-
    59 // Step to the first valid entry
    \n-
    60 while(iter_!=end_ && !AttributeSet::contains(iter_->local().attribute()))
    \n-
    61 ++iter_;
    \n-
    62 }
    \n-
    \n-
    63
    \n-
    \n-\n-
    65 {
    \n-
    66 assert(iter_!=end_);
    \n-
    67 for(++iter_; iter_!=end_; ++iter_)
    \n-
    68 if(AttributeSet::contains(iter_->local().attribute()))
    \n-
    69 break;
    \n-
    70 }
    \n-
    \n-
    71
    \n-
    72
    \n-
    \n-
    73 uint32_t operator*() const
    \n-
    74 {
    \n-
    75 return iter_->local().local();
    \n-
    76 }
    \n-
    \n-
    77
    \n-
    \n-\n-
    79 {
    \n-
    80 return iter_ == other.iter_;
    \n-
    81 }
    \n-
    \n-
    82
    \n-
    \n-\n-
    84 {
    \n-
    85 return iter_ != other.iter_;
    \n-
    86 }
    \n-
    \n+\n+
    50
    \n+\n+
    53
    \n+\n+
    56
    \n+
    58 typedef typename ParallelIndexSet::LocalIndex::Attribute Attribute;
    \n+
    59
    \n+\n+
    64
    \n+\n+
    75 RemoteIndices& remoteIndices);
    \n+
    76
    \n+
    86 void sync();
    \n
    87
    \n-
    88 private:
    \n-\n-
    90 const ParallelIndexSetIterator end_;
    \n-
    91 };
    \n-
    \n-
    92
    \n-
    93
    \n-
    97 template<typename TS, typename TG, typename TL, int N>
    \n-
    \n-\n-
    99 {
    \n-
    100 public:
    \n-
    109 typedef TS AttributeSet;
    \n+
    100 template<typename T1>
    \n+
    101 void sync(T1& numberer, bool useFixedOrder = false);
    \n+
    102
    \n+
    103 private:
    \n+
    104
    \n+
    106 ParallelIndexSet& indexSet_;
    \n+
    107
    \n+
    109 RemoteIndices& remoteIndices_;
    \n
    110
    \n-
    114 typedef TG GlobalIndex;
    \n-
    115
    \n-
    122 typedef TL LocalIndex;
    \n-
    123
    \n-\n-
    128
    \n-\n-
    133
    \n-\n-
    138
    \n-
    \n-\n-
    140 : indexSet_()
    \n-
    141 {}
    \n-
    \n-
    142
    \n-
    \n-\n-
    144 : indexSet_(&indexset)
    \n-
    145 {}
    \n-
    \n-
    150 void setIndexSet(const ParallelIndexSet& indexset);
    \n-
    151
    \n-
    155 //const ParallelIndexSet& indexSet() const;
    \n+
    112 char** sendBuffers_;
    \n+
    113
    \n+
    115 char* receiveBuffer_;
    \n+
    116
    \n+
    118 std::size_t* sendBufferSizes_;
    \n+
    119
    \n+
    121 int receiveBufferSize_; // int because of MPI
    \n+
    122
    \n+
    126 struct MessageInformation
    \n+
    127 {
    \n+
    \n+\n+
    129 : publish(), pairs()
    \n+
    130 {}
    \n+
    \n+\n+
    137 int pairs;
    \n+
    138 };
    \n+
    139
    \n+
    143 class DefaultNumberer
    \n+
    144 {
    \n+
    145 public:
    \n+
    151 std::size_t operator()([[maybe_unused]] const GlobalIndex& global)
    \n+
    152 {
    \n+
    153 return std::numeric_limits<size_t>::max();
    \n+
    154 }
    \n+
    155 };
    \n
    156
    \n-
    161 const_iterator begin() const;
    \n+
    158 MPI_Datatype datatype_;
    \n+
    159
    \n+
    161 int rank_;
    \n
    162
    \n-
    167 const_iterator end() const;
    \n+
    167 typedef SLList<std::pair<GlobalIndex,Attribute>, typename RemoteIndices::Allocator> GlobalIndexList;
    \n
    168
    \n-
    169
    \n-
    170 private:
    \n-
    171 const ParallelIndexSet* indexSet_;
    \n-
    172
    \n-
    173 };
    \n-
    \n-
    174
    \n-
    178 template<typename TS, typename TG, typename TL, int N>
    \n-
    \n-\n-
    180 {
    \n-
    181 public:
    \n-
    190 typedef TS AttributeSet;
    \n-
    191
    \n-
    195 typedef TG GlobalIndex;
    \n-
    196
    \n-
    203 typedef TL LocalIndex;
    \n-
    204
    \n-\n-
    209
    \n-
    213 typedef uint32_t* iterator;
    \n-
    214
    \n-
    218 typedef uint32_t* const_iterator;
    \n-
    219
    \n-
    \n-\n-
    221 : selected_()
    \n-
    222 {}
    \n-
    \n-
    223
    \n-
    \n-\n-
    225 : selected_(), size_(0), built_(false)
    \n-
    226 {
    \n-
    227 setIndexSet(indexset);
    \n-
    228 }
    \n-
    \n-
    229
    \n-
    230 ~Selection();
    \n-
    231
    \n-
    236 void setIndexSet(const ParallelIndexSet& indexset);
    \n-
    237
    \n-
    241 void free();
    \n-
    242
    \n-
    246 //IndexSet indexSet() const;
    \n-
    247
    \n-
    252 const_iterator begin() const;
    \n-
    253
    \n-
    258 const_iterator end() const;
    \n-
    259
    \n-
    260
    \n-
    261 private:
    \n-
    262 uint32_t* selected_;
    \n-
    263 size_t size_;
    \n-
    264 bool built_;
    \n-
    265
    \n-
    266 };
    \n-
    \n+
    170 typedef typename GlobalIndexList::ModifyIterator GlobalIndexModifier;
    \n+
    171
    \n+\n+
    176 GlobalIndexIterator;
    \n+
    177
    \n+
    179 typedef std::map<int, GlobalIndexList> GlobalIndicesMap;
    \n+
    180
    \n+
    189 GlobalIndicesMap globalMap_;
    \n+
    190
    \n+\n+
    195
    \n+
    199 typedef typename BoolList::iterator BoolIterator;
    \n+
    200
    \n+
    202 typedef typename BoolList::ModifyIterator BoolListModifier;
    \n+
    203
    \n+
    205 typedef std::map<int,BoolList> BoolMap;
    \n+
    206
    \n+
    211 BoolMap oldMap_;
    \n+
    212
    \n+
    214 std::map<int,MessageInformation> infoSend_;
    \n+
    215
    \n+
    217 typedef typename RemoteIndices::RemoteIndexList RemoteIndexList;
    \n+
    218
    \n+
    220 typedef typename RemoteIndexList::ModifyIterator RemoteIndexModifier;
    \n+
    221
    \n+\n+
    224
    \n+
    226 typedef typename RemoteIndexList::iterator RemoteIndexIterator;
    \n+
    227
    \n+
    229 typedef typename RemoteIndexList::const_iterator ConstRemoteIndexIterator;
    \n+
    230
    \n+
    232 typedef std::tuple<RemoteIndexModifier,GlobalIndexModifier,BoolListModifier,
    \n+
    233 const ConstRemoteIndexIterator> IteratorTuple;
    \n+
    234
    \n+
    242 class Iterators
    \n+
    243 {
    \n+
    244 friend class IndicesSyncer<T>;
    \n+
    245 public:
    \n+
    255 Iterators(RemoteIndexList& remoteIndices, GlobalIndexList& globalIndices,
    \n+
    256 BoolList& booleans);
    \n+
    257
    \n+
    261 Iterators();
    \n+
    262
    \n+\n
    267
    \n-
    268 template<typename TS, typename TG, typename TL, int N>
    \n-
    \n-\n-
    270 {
    \n-
    271 if(built_)
    \n-
    272 free();
    \n-
    273
    \n-
    274 // Count the number of entries the selection has to hold
    \n-\n-
    276 const const_iterator end = indexset.end();
    \n-
    277 int entries = 0;
    \n-
    278
    \n-
    279 for(const_iterator index = indexset.begin(); index != end; ++index)
    \n-
    280 if(AttributeSet::contains(index->local().attribute()))
    \n-
    281 ++entries;
    \n-
    282
    \n-
    283 selected_ = new uint32_t[entries];
    \n-
    284 built_ = true;
    \n-
    285
    \n-
    286 entries = 0;
    \n-
    287 for(const_iterator index = indexset.begin(); index != end; ++index)
    \n-
    288 if(AttributeSet::contains(index->local().attribute()))
    \n-
    289 selected_[entries++]= index->local().local();
    \n-
    290
    \n-
    291 size_=entries;
    \n-
    292 built_=true;
    \n-
    293 }
    \n-
    \n-
    294
    \n-
    295 template<typename TS, typename TG, typename TL, int N>
    \n-
    \n-\n-
    297 {
    \n-
    298 return selected_;
    \n-
    299 }
    \n-
    \n-
    300
    \n-
    301 template<typename TS, typename TG, typename TL, int N>
    \n-
    \n-\n-
    303 {
    \n-
    304 return selected_+size_;
    \n-
    305 }
    \n-
    \n-
    306
    \n-
    307 template<typename TS, typename TG, typename TL, int N>
    \n-
    \n-\n-
    309 {
    \n-
    310 delete[] selected_;
    \n-
    311 size_=0;
    \n-
    312 built_=false;
    \n-
    313 }
    \n-
    \n-
    314
    \n-
    315 template<typename TS, typename TG, typename TL, int N>
    \n-
    \n-\n-
    317 {
    \n-
    318 if(built_)
    \n-
    319 free();
    \n-
    320 }
    \n-
    \n-
    321
    \n-
    322 template<typename TS, typename TG, typename TL, int N>
    \n-
    \n-\n-
    324 {
    \n-
    325 return SelectionIterator<TS,TG,TL,N>(indexSet_->begin(),
    \n-
    326 indexSet_->end());
    \n-
    327 }
    \n-
    \n-
    328
    \n-
    329 template<typename TS, typename TG, typename TL, int N>
    \n-
    \n-\n-
    331 {
    \n-
    332 return SelectionIterator<TS,TG,TL,N>(indexSet_->end(),
    \n-
    333 indexSet_->end());
    \n-
    334 }
    \n-
    \n-
    335 template<typename TS, typename TG, typename TL, int N>
    \n-
    \n-\n-
    337 {
    \n-
    338 indexSet_ = &indexset;
    \n-
    339 }
    \n-
    \n-
    340
    \n-
    344}
    \n-
    345#endif // DUNE_COMMON_PARALLEL_SELECTION_HH
    \n-
    Provides a map between global and local indices.
    \n-
    This file implements iterator facade classes for writing stl conformant iterators.
    \n-
    const_iterator end() const
    Get an iterator over the selected indices.
    Definition selection.hh:330
    \n-
    void setIndexSet(const ParallelIndexSet &indexset)
    Set the index set of the selection.
    Definition selection.hh:269
    \n-
    void setIndexSet(const ParallelIndexSet &indexset)
    Set the index set of the selection.
    Definition selection.hh:336
    \n-
    iterator begin()
    Get an iterator over the indices positioned at the first index.
    \n-
    iterator end()
    Get an iterator over the indices positioned after the last index.
    \n-
    const_iterator end() const
    Get an iterator over the selected indices.
    Definition selection.hh:302
    \n-
    const_iterator begin() const
    Get the index set we are a selection for.
    Definition selection.hh:296
    \n-
    void free()
    Free allocated memory.
    Definition selection.hh:308
    \n-
    const_iterator begin() const
    Get the index set we are a selection for.
    Definition selection.hh:323
    \n-
    ~Selection()
    Definition selection.hh:316
    \n+
    273 void insert(const RemoteIndex& index,
    \n+
    274 const std::pair<GlobalIndex,Attribute>& global);
    \n+
    275
    \n+
    280 RemoteIndex& remoteIndex() const;
    \n+
    281
    \n+
    286 std::pair<GlobalIndex,Attribute>& globalIndexPair() const;
    \n+
    287
    \n+\n+
    289
    \n+
    295 bool isOld() const;
    \n+
    296
    \n+
    306 void reset(RemoteIndexList& remoteIndices, GlobalIndexList& globalIndices,
    \n+
    307 BoolList& booleans);
    \n+
    308
    \n+
    314 bool isNotAtEnd() const;
    \n+
    315
    \n+
    321 bool isAtEnd() const;
    \n+
    322
    \n+
    323 private:
    \n+
    333 IteratorTuple iterators_;
    \n+
    334 };
    \n+
    335
    \n+
    337 typedef std::map<int,Iterators> IteratorsMap;
    \n+
    338
    \n+
    350 IteratorsMap iteratorsMap_;
    \n+
    351
    \n+
    353 void calculateMessageSizes();
    \n+
    354
    \n+
    362 void packAndSend(int destination, char* buffer, std::size_t bufferSize, MPI_Request& req);
    \n+
    363
    \n+
    370 template<typename T1>
    \n+
    371 void recvAndUnpack(T1& numberer, int hardSource, bool useHardSource);
    \n+
    372
    \n+
    376 void registerMessageDatatype();
    \n+
    377
    \n+
    381 void insertIntoRemoteIndexList(int process,
    \n+
    382 const std::pair<GlobalIndex,Attribute>& global,
    \n+
    383 char attribute);
    \n+
    384
    \n+
    388 void resetIteratorsMap();
    \n+
    389
    \n+
    394 bool checkReset();
    \n+
    395
    \n+
    404 bool checkReset(const Iterators& iterators, RemoteIndexList& rlist, GlobalIndexList& gList,
    \n+
    405 BoolList& bList);
    \n+
    406 };
    \n+
    \n+
    407
    \n+
    408 template<typename TG, typename TA>
    \n+
    \n+\n+
    410 const std::pair<TG,TA>& i2)
    \n+
    411 {
    \n+
    412 return i1.global() < i2.first ||
    \n+
    413 (i1.global() == i2.first && i1.local().attribute()<i2.second);
    \n+
    414 }
    \n+
    \n+
    415
    \n+
    416 template<typename TG, typename TA>
    \n+
    \n+
    417 bool operator<(const std::pair<TG,TA>& i1,
    \n+
    418 const IndexPair<TG,ParallelLocalIndex<TA> >& i2)
    \n+
    419 {
    \n+
    420 return i1.first < i2.global() ||
    \n+
    421 (i1.first == i2.global() && i1.second<i2.local().attribute());
    \n+
    422 }
    \n+
    \n+
    423
    \n+
    424 template<typename TG, typename TA>
    \n+
    \n+\n+
    426 const std::pair<TG,TA>& i2)
    \n+
    427 {
    \n+
    428 return (i1.global() == i2.first && i1.local().attribute()==i2.second);
    \n+
    429 }
    \n+
    \n+
    430
    \n+
    431 template<typename TG, typename TA>
    \n+
    \n+\n+
    433 const std::pair<TG,TA>& i2)
    \n+
    434 {
    \n+
    435 return (i1.global() != i2.first || i1.local().attribute()!=i2.second);
    \n+
    436 }
    \n+
    \n+
    437
    \n+
    438 template<typename TG, typename TA>
    \n+
    \n+
    439 bool operator==(const std::pair<TG,TA>& i2,
    \n+
    440 const IndexPair<TG,ParallelLocalIndex<TA> >& i1)
    \n+
    441 {
    \n+
    442 return (i1.global() == i2.first && i1.local().attribute()==i2.second);
    \n+
    443 }
    \n+
    \n+
    444
    \n+
    445 template<typename TG, typename TA>
    \n+
    \n+
    446 bool operator!=(const std::pair<TG,TA>& i2,
    \n+
    447 const IndexPair<TG,ParallelLocalIndex<TA> >& i1)
    \n+
    448 {
    \n+
    449 return (i1.global() != i2.first || i1.local().attribute()!=i2.second);
    \n+
    450 }
    \n+
    \n+
    451
    \n+
    468 template<typename T, typename A, typename A1>
    \n+
    \n+
    469 void storeGlobalIndicesOfRemoteIndices(std::map<int,SLList<std::pair<typename T::GlobalIndex, typename T::LocalIndex::Attribute>,A> >& globalMap,
    \n+
    470 const RemoteIndices<T,A1>& remoteIndices)
    \n+
    471 {
    \n+
    472 for(auto remote = remoteIndices.begin(), end =remoteIndices.end(); remote != end; ++remote) {
    \n+
    473 typedef typename RemoteIndices<T,A1>::RemoteIndexList RemoteIndexList;
    \n+\n+
    475 GlobalIndexList& global = globalMap[remote->first];
    \n+
    476 RemoteIndexList& rList = *(remote->second.first);
    \n+
    477
    \n+
    478 for(auto index = rList.begin(), riEnd = rList.end();
    \n+
    479 index != riEnd; ++index) {
    \n+
    480 global.push_back(std::make_pair(index->localIndexPair().global(),
    \n+
    481 index->localIndexPair().local().attribute()));
    \n+
    482 }
    \n+
    483 }
    \n+
    484 }
    \n+
    \n+
    485
    \n+
    494 template<typename T, typename A, typename A1>
    \n+
    \n+
    495 inline void repairLocalIndexPointers(std::map<int,
    \n+
    496 SLList<std::pair<typename T::GlobalIndex,
    \n+
    497 typename T::LocalIndex::Attribute>,A> >& globalMap,
    \n+
    498 RemoteIndices<T,A1>& remoteIndices,
    \n+
    499 const T& indexSet)
    \n+
    500 {
    \n+
    501 assert(globalMap.size()==static_cast<std::size_t>(remoteIndices.neighbours()));
    \n+
    502 // Repair pointers to index set in remote indices.
    \n+
    503 auto global = globalMap.begin();
    \n+
    504 auto end = remoteIndices.remoteIndices_.end();
    \n+
    505
    \n+
    506 for(auto remote = remoteIndices.remoteIndices_.begin(); remote != end; ++remote, ++global) {
    \n+
    507 assert(remote->first==global->first);
    \n+
    508 assert(remote->second.first->size() == global->second.size());
    \n+
    509
    \n+
    510 auto riEnd = remote->second.first->end();
    \n+
    511 auto rIndex = remote->second.first->begin();
    \n+
    512 auto gIndex = global->second.begin();
    \n+
    513 auto index = indexSet.begin();
    \n+
    514
    \n+
    515 assert(rIndex==riEnd || gIndex != global->second.end());
    \n+
    516 while(rIndex != riEnd) {
    \n+
    517 // Search for the index in the set.
    \n+
    518 assert(gIndex != global->second.end());
    \n+
    519
    \n+
    520 while(!(index->global() == gIndex->first
    \n+
    521 && index->local().attribute() == gIndex->second)) {
    \n+
    522 ++index;
    \n+
    523 // this is only needed for ALU, where there may exist
    \n+
    524 // more entries with the same global index in the remote index set
    \n+
    525 // than in the index set
    \n+
    526 if (index->global() > gIndex->first) {
    \n+
    527 index=indexSet.begin();
    \n+
    528 }
    \n+
    529 }
    \n+
    530
    \n+
    531 assert(index != indexSet.end() && *index == *gIndex);
    \n+
    532
    \n+
    533 rIndex->localIndex_ = &(*index);
    \n+
    534 ++index;
    \n+
    535 ++rIndex;
    \n+
    536 ++gIndex;
    \n+
    537 }
    \n+
    538 }
    \n+
    539 remoteIndices.sourceSeqNo_ = remoteIndices.source_->seqNo();
    \n+
    540 remoteIndices.destSeqNo_ = remoteIndices.target_->seqNo();
    \n+
    541 }
    \n+
    \n+
    542
    \n+
    543 template<typename T>
    \n+
    \n+\n+
    545 RemoteIndices& remoteIndices)
    \n+
    546 : indexSet_(indexSet), remoteIndices_(remoteIndices)
    \n+
    547 {
    \n+
    548 // index sets must match.
    \n+
    549 assert(remoteIndices.source_ == remoteIndices.target_);
    \n+
    550 assert(remoteIndices.source_ == &indexSet);
    \n+
    551 MPI_Comm_rank(remoteIndices_.communicator(), &rank_);
    \n+
    552 }
    \n+
    \n+
    553
    \n+
    554 template<typename T>
    \n+
    \n+\n+
    556 GlobalIndexList& globalIndices,
    \n+
    557 BoolList& booleans)
    \n+
    558 : iterators_(remoteIndices.beginModify(), globalIndices.beginModify(),
    \n+
    559 booleans.beginModify(), remoteIndices.end())
    \n+
    560 { }
    \n+
    \n+
    561
    \n+
    562 template<typename T>
    \n+
    \n+\n+
    564 : iterators_()
    \n+
    565 {}
    \n+
    \n+
    566
    \n+
    567 template<typename T>
    \n+
    \n+\n+
    569 {
    \n+
    570 ++(std::get<0>(iterators_));
    \n+
    571 ++(std::get<1>(iterators_));
    \n+
    572 ++(std::get<2>(iterators_));
    \n+
    573 return *this;
    \n+
    574 }
    \n+
    \n+
    575
    \n+
    576 template<typename T>
    \n+
    \n+\n+
    578 const std::pair<GlobalIndex,Attribute>& global)
    \n+
    579 {
    \n+
    580 std::get<0>(iterators_).insert(index);
    \n+
    581 std::get<1>(iterators_).insert(global);
    \n+
    582 std::get<2>(iterators_).insert(false);
    \n+
    583 }
    \n+
    \n+
    584
    \n+
    585 template<typename T>
    \n+
    586 inline typename IndicesSyncer<T>::RemoteIndex&
    \n+
    \n+\n+
    588 {
    \n+
    589 return *(std::get<0>(iterators_));
    \n+
    590 }
    \n+
    \n+
    591
    \n+
    592 template<typename T>
    \n+
    593 inline std::pair<typename IndicesSyncer<T>::GlobalIndex,typename IndicesSyncer<T>::Attribute>&
    \n+
    \n+\n+
    595 {
    \n+
    596 return *(std::get<1>(iterators_));
    \n+
    597 }
    \n+
    \n+
    598
    \n+
    599 template<typename T>
    \n+
    \n+\n+
    601 {
    \n+
    602 return *(std::get<2>(iterators_));
    \n+
    603 }
    \n+
    \n+
    604
    \n+
    605 template<typename T>
    \n+
    \n+\n+
    607 GlobalIndexList& globalIndices,
    \n+
    608 BoolList& booleans)
    \n+
    609 {
    \n+
    610 std::get<0>(iterators_) = remoteIndices.beginModify();
    \n+
    611 std::get<1>(iterators_) = globalIndices.beginModify();
    \n+
    612 std::get<2>(iterators_) = booleans.beginModify();
    \n+
    613 }
    \n+
    \n+
    614
    \n+
    615 template<typename T>
    \n+
    \n+\n+
    617 {
    \n+
    618 return std::get<0>(iterators_) != std::get<3>(iterators_);
    \n+
    619 }
    \n+
    \n+
    620
    \n+
    621 template<typename T>
    \n+
    \n+\n+
    623 {
    \n+
    624 return std::get<0>(iterators_) == std::get<3>(iterators_);
    \n+
    625 }
    \n+
    \n+
    626
    \n+
    627 template<typename T>
    \n+\n+
    629 {
    \n+
    630 MPI_Datatype type[2] = {MPI_INT, MPI_INT};
    \n+
    631 int blocklength[2] = {1,1};
    \n+
    632 MPI_Aint displacement[2];
    \n+
    633 MPI_Aint base;
    \n+
    634
    \n+
    635 // Compute displacement
    \n+
    636 MessageInformation message;
    \n+
    637
    \n+
    638 MPI_Get_address( &(message.publish), displacement);
    \n+
    639 MPI_Get_address( &(message.pairs), displacement+1);
    \n+
    640
    \n+
    641 // Make the displacement relative
    \n+
    642 MPI_Get_address(&message, &base);
    \n+
    643 displacement[0] -= base;
    \n+
    644 displacement[1] -= base;
    \n+
    645
    \n+
    646 MPI_Type_create_struct( 2, blocklength, displacement, type, &datatype_);
    \n+
    647 MPI_Type_commit(&datatype_);
    \n+
    648 }
    \n+
    649
    \n+
    650 template<typename T>
    \n+
    651 void IndicesSyncer<T>::calculateMessageSizes()
    \n+
    652 {
    \n+
    653 auto iEnd = indexSet_.end();
    \n+
    654 auto collIter = remoteIndices_.template iterator<true>();
    \n+
    655
    \n+
    656 for(auto index = indexSet_.begin(); index != iEnd; ++index) {
    \n+
    657 collIter.advance(index->global(), index->local().attribute());
    \n+
    658 if(collIter.empty())
    \n+
    659 break;
    \n+
    660 int knownRemote=0;
    \n+
    661 auto end = collIter.end();
    \n+
    662
    \n+
    663 // Count the remote indices we know.
    \n+
    664 for(auto valid = collIter.begin(); valid != end; ++valid) {
    \n+
    665 ++knownRemote;
    \n+
    666 }
    \n+
    667
    \n+
    668 if(knownRemote>0) {
    \n+
    669 Dune::dverb<<rank_<<": publishing "<<knownRemote<<" for index "<<index->global()<< " for processes ";
    \n+
    670
    \n+
    671 // Update MessageInformation
    \n+
    672 for(auto valid = collIter.begin(); valid != end; ++valid) {
    \n+
    673 ++(infoSend_[valid.process()].publish);
    \n+
    674 (infoSend_[valid.process()].pairs) += knownRemote;
    \n+
    675 Dune::dverb<<valid.process()<<" ";
    \n+
    676 Dune::dverb<<"(publish="<<infoSend_[valid.process()].publish<<", pairs="<<infoSend_[valid.process()].pairs
    \n+
    677 <<") ";
    \n+
    678 }
    \n+
    679 Dune::dverb<<std::endl;
    \n+
    680 }
    \n+
    681 }
    \n+
    682
    \n+
    683 const auto end = infoSend_.end();
    \n+
    684
    \n+
    685 // Now determine the buffersizes needed for each neighbour using MPI_Pack_size
    \n+
    686 MessageInformation dummy;
    \n+
    687
    \n+
    688 auto messageIter= infoSend_.begin();
    \n+
    689 const auto rend = remoteIndices_.end();
    \n+
    690 int neighbour=0;
    \n+
    691
    \n+
    692 for(auto remote = remoteIndices_.begin(); remote != rend; ++remote, ++neighbour) {
    \n+
    693 MessageInformation* message;
    \n+
    694 MessageInformation recv;
    \n+
    695
    \n+
    696 if(messageIter != end && messageIter->first==remote->first) {
    \n+
    697 // We want to send message information to that process
    \n+
    698 message = const_cast<MessageInformation*>(&(messageIter->second));
    \n+
    699 ++messageIter;
    \n+
    700 }else
    \n+
    701 // We do not want to send information but the other process might.
    \n+
    702 message = &dummy;
    \n+
    703
    \n+
    704 sendBufferSizes_[neighbour]=0;
    \n+
    705 int tsize;
    \n+
    706 // The number of indices published
    \n+
    707 MPI_Pack_size(1, MPI_INT,remoteIndices_.communicator(), &tsize);
    \n+
    708 sendBufferSizes_[neighbour] += tsize;
    \n+
    709
    \n+
    710 for(int i=0; i < message->publish; ++i) {
    \n+
    711 // The global index
    \n+
    712 MPI_Pack_size(1, MPITraits<GlobalIndex>::getType(), remoteIndices_.communicator(), &tsize);
    \n+
    713 sendBufferSizes_[neighbour] += tsize;
    \n+
    714 // The attribute in the local index
    \n+
    715 MPI_Pack_size(1, MPI_CHAR, remoteIndices_.communicator(), &tsize);
    \n+
    716 sendBufferSizes_[neighbour] += tsize;
    \n+
    717 // The number of corresponding remote indices
    \n+
    718 MPI_Pack_size(1, MPI_INT, remoteIndices_.communicator(), &tsize);
    \n+
    719 sendBufferSizes_[neighbour] += tsize;
    \n+
    720 }
    \n+
    721 for(int i=0; i < message->pairs; ++i) {
    \n+
    722 // The process of the remote index
    \n+
    723 MPI_Pack_size(1, MPI_INT, remoteIndices_.communicator(), &tsize);
    \n+
    724 sendBufferSizes_[neighbour] += tsize;
    \n+
    725 // The attribute of the remote index
    \n+
    726 MPI_Pack_size(1, MPI_CHAR, remoteIndices_.communicator(), &tsize);
    \n+
    727 sendBufferSizes_[neighbour] += tsize;
    \n+
    728 }
    \n+
    729
    \n+
    730 Dune::dverb<<rank_<<": Buffer (neighbour="<<remote->first<<") size is "<< sendBufferSizes_[neighbour]<<" for publish="<<message->publish<<" pairs="<<message->pairs<<std::endl;
    \n+
    731 }
    \n+
    732
    \n+
    733 }
    \n+
    734
    \n+
    735 template<typename T>
    \n+
    \n+\n+
    737 {
    \n+
    738 DefaultNumberer numberer;
    \n+
    739 sync(numberer);
    \n+
    740 }
    \n+
    \n+
    741
    \n+
    742 template<typename T>
    \n+
    743 template<typename T1>
    \n+
    \n+
    744 void IndicesSyncer<T>::sync(T1& numberer, bool useFixedOrder)
    \n+
    745 {
    \n+
    746 // The pointers to the local indices in the remote indices
    \n+
    747 // will become invalid due to the resorting of the index set.
    \n+
    748 // Therefore store the corresponding global indices.
    \n+
    749 // Mark all indices as not added
    \n+
    750 const auto end = remoteIndices_.end();
    \n+
    751
    \n+
    752 // Number of neighbours might change during the syncing.
    \n+
    753 // save the old neighbours
    \n+
    754 std::size_t noOldNeighbours = remoteIndices_.neighbours();
    \n+
    755 int* oldNeighbours = new int[noOldNeighbours];
    \n+
    756 sendBufferSizes_ = new std::size_t[noOldNeighbours];
    \n+
    757 std::size_t neighbourI = 0;
    \n+
    758
    \n+
    759 for(auto remote = remoteIndices_.begin(); remote != end; ++remote, ++neighbourI) {
    \n+
    760 oldNeighbours[neighbourI] = remote->first;
    \n+
    761
    \n+
    762 // Make sure we only have one remote index list.
    \n+
    763 assert(remote->second.first==remote->second.second);
    \n+
    764
    \n+
    765 RemoteIndexList& rList = *(remote->second.first);
    \n+
    766
    \n+
    767 // Store the corresponding global indices.
    \n+
    768 GlobalIndexList& global = globalMap_[remote->first];
    \n+
    769 BoolList& added = oldMap_[remote->first];
    \n+
    770 auto riEnd = rList.end();
    \n+
    771
    \n+
    772 for(auto index = rList.begin();
    \n+
    773 index != riEnd; ++index) {
    \n+
    774 global.push_back(std::make_pair(index->localIndexPair().global(),
    \n+
    775 index->localIndexPair().local().attribute()));
    \n+
    776 added.push_back(true);
    \n+
    777 }
    \n+
    778
    \n+
    779 Iterators iterators(rList, global, added);
    \n+
    780 iteratorsMap_.insert(std::make_pair(remote->first, iterators));
    \n+
    781 assert(checkReset(iteratorsMap_[remote->first], rList,global,added));
    \n+
    782 }
    \n+
    783
    \n+
    784 // Exchange indices with each neighbour
    \n+
    785 calculateMessageSizes();
    \n+
    786
    \n+
    787 // Allocate the buffers
    \n+
    788 receiveBufferSize_=1;
    \n+
    789 sendBuffers_ = new char*[noOldNeighbours];
    \n+
    790
    \n+
    791 for(std::size_t i=0; i<noOldNeighbours; ++i) {
    \n+
    792 sendBuffers_[i] = new char[sendBufferSizes_[i]];
    \n+
    793 receiveBufferSize_ = std::max(receiveBufferSize_, static_cast<int>(sendBufferSizes_[i]));
    \n+
    794 }
    \n+
    795
    \n+
    796 receiveBuffer_=new char[receiveBufferSize_];
    \n+
    797
    \n+
    798 indexSet_.beginResize();
    \n+
    799
    \n+
    800 Dune::dverb<<rank_<<": Neighbours: ";
    \n+
    801
    \n+
    802 for(std::size_t i = 0; i<noOldNeighbours; ++i)
    \n+
    803 Dune::dverb<<oldNeighbours[i]<<" ";
    \n+
    804
    \n+
    805 Dune::dverb<<std::endl;
    \n+
    806
    \n+
    807 MPI_Request* requests = new MPI_Request[noOldNeighbours];
    \n+
    808 MPI_Status* statuses = new MPI_Status[noOldNeighbours];
    \n+
    809
    \n+
    810 // Pack Message data and start the sends
    \n+
    811 for(std::size_t i = 0; i<noOldNeighbours; ++i)
    \n+
    812 packAndSend(oldNeighbours[i], sendBuffers_[i], sendBufferSizes_[i], requests[i]);
    \n+
    813
    \n+
    814 // Probe for incoming messages, receive and unpack them
    \n+
    815 for(std::size_t i = 0; i<noOldNeighbours; ++i)
    \n+
    816 recvAndUnpack(numberer, oldNeighbours[i], useFixedOrder);
    \n+
    817 // }else{
    \n+
    818 // recvAndUnpack(oldNeighbours[i], numberer);
    \n+
    819 // packAndSend(oldNeighbours[i]);
    \n+
    820 // }
    \n+
    821 // }
    \n+
    822
    \n+
    823 delete[] receiveBuffer_;
    \n+
    824
    \n+
    825 // Wait for the completion of the sends
    \n+
    826 // Wait for completion of sends
    \n+
    827 if(MPI_SUCCESS!=MPI_Waitall(noOldNeighbours, requests, statuses)) {
    \n+
    828 std::cerr<<": MPI_Error occurred while sending message"<<std::endl;
    \n+
    829 for(std::size_t i=0; i< noOldNeighbours; i++)
    \n+
    830 if(MPI_SUCCESS!=statuses[i].MPI_ERROR)
    \n+
    831 std::cerr<<"Destination "<<statuses[i].MPI_SOURCE<<" error code: "<<statuses[i].MPI_ERROR<<std::endl;
    \n+
    832 }
    \n+
    833
    \n+
    834 delete[] statuses;
    \n+
    835 delete[] requests;
    \n+
    836
    \n+
    837 for(std::size_t i=0; i<noOldNeighbours; ++i)
    \n+
    838 delete[] sendBuffers_[i];
    \n+
    839
    \n+
    840 delete[] sendBuffers_;
    \n+
    841 delete[] sendBufferSizes_;
    \n+
    842
    \n+
    843 // No need for the iterator tuples any more
    \n+
    844 iteratorsMap_.clear();
    \n+
    845
    \n+
    846 indexSet_.endResize();
    \n+
    847
    \n+
    848 delete[] oldNeighbours;
    \n+
    849
    \n+
    850 repairLocalIndexPointers(globalMap_, remoteIndices_, indexSet_);
    \n+
    851
    \n+
    852 oldMap_.clear();
    \n+
    853 globalMap_.clear();
    \n+
    854
    \n+
    855 // update the sequence number
    \n+
    856 remoteIndices_.sourceSeqNo_ = remoteIndices_.destSeqNo_ = indexSet_.seqNo();
    \n+
    857 }
    \n+
    \n+
    858
    \n+
    859 template<typename T>
    \n+
    860 void IndicesSyncer<T>::packAndSend(int destination, char* buffer, std::size_t bufferSize, MPI_Request& request)
    \n+
    861 {
    \n+
    862 auto iEnd = indexSet_.end();
    \n+
    863 int bpos = 0;
    \n+
    864 int published = 0;
    \n+
    865 int pairs = 0;
    \n+
    866
    \n+
    867 assert(checkReset());
    \n+
    868
    \n+
    869 // Pack the number of indices we publish
    \n+
    870 MPI_Pack(&(infoSend_[destination].publish), 1, MPI_INT, buffer, bufferSize, &bpos,
    \n+
    871 remoteIndices_.communicator());
    \n+
    872
    \n+
    873 for(auto index = indexSet_.begin(); index != iEnd; ++index) {
    \n+
    874 // Search for corresponding remote indices in all iterator tuples
    \n+
    875 auto iteratorsEnd = iteratorsMap_.end();
    \n+
    876
    \n+
    877 // advance all iterators to a position with global index >= index->global()
    \n+
    878 for(auto iterators = iteratorsMap_.begin(); iteratorsEnd != iterators; ++iterators) {
    \n+
    879 while(iterators->second.isNotAtEnd() &&
    \n+
    880 iterators->second.globalIndexPair().first < index->global())
    \n+
    881 ++(iterators->second);
    \n+
    882 assert(!iterators->second.isNotAtEnd() || iterators->second.globalIndexPair().first >= index->global());
    \n+
    883 }
    \n+
    884
    \n+
    885 // Add all remote indices positioned at global which were already present before calling sync
    \n+
    886 // to the message.
    \n+
    887 // Count how many remote indices we will send
    \n+
    888 int indices = 0;
    \n+
    889 bool knownRemote = false; // Is the remote process supposed to know this index?
    \n+
    890
    \n+
    891 for(auto iterators = iteratorsMap_.begin(); iteratorsEnd != iterators; ++iterators)
    \n+
    892 {
    \n+
    893 std::pair<GlobalIndex,Attribute> p;
    \n+
    894 if (iterators->second.isNotAtEnd())
    \n+
    895 {
    \n+
    896 p = iterators->second.globalIndexPair();
    \n+
    897 }
    \n+
    898
    \n+
    899 if(iterators->second.isNotAtEnd() && iterators->second.isOld()
    \n+
    900 && iterators->second.globalIndexPair().first == index->global()) {
    \n+
    901 indices++;
    \n+
    902 if(destination == iterators->first)
    \n+
    903 knownRemote = true;
    \n+
    904 }
    \n+
    905 }
    \n+
    906
    \n+
    907 if(!knownRemote)
    \n+
    908 // We do not need to send any indices
    \n+
    909 continue;
    \n+
    910
    \n+
    911 Dune::dverb<<rank_<<": sending "<<indices<<" for index "<<index->global()<<" to "<<destination<<std::endl;
    \n+
    912
    \n+
    913
    \n+
    914 // Pack the global index, the attribute and the number
    \n+
    915 MPI_Pack(const_cast<GlobalIndex*>(&(index->global())), 1, MPITraits<GlobalIndex>::getType(), buffer, bufferSize, &bpos,
    \n+
    916 remoteIndices_.communicator());
    \n+
    917
    \n+
    918 char attr = index->local().attribute();
    \n+
    919 MPI_Pack(&attr, 1, MPI_CHAR, buffer, bufferSize, &bpos,
    \n+
    920 remoteIndices_.communicator());
    \n+
    921
    \n+
    922 // Pack the number of remote indices we send.
    \n+
    923 MPI_Pack(&indices, 1, MPI_INT, buffer, bufferSize, &bpos,
    \n+
    924 remoteIndices_.communicator());
    \n+
    925
    \n+
    926 // Pack the information about the remote indices
    \n+
    927 for(auto iterators = iteratorsMap_.begin(); iteratorsEnd != iterators; ++iterators)
    \n+
    928 if(iterators->second.isNotAtEnd() && iterators->second.isOld()
    \n+
    929 && iterators->second.globalIndexPair().first == index->global()) {
    \n+
    930 int process = iterators->first;
    \n+
    931
    \n+
    932 ++pairs;
    \n+
    933 assert(pairs <= infoSend_[destination].pairs);
    \n+
    934 MPI_Pack(&process, 1, MPI_INT, buffer, bufferSize, &bpos,
    \n+
    935 remoteIndices_.communicator());
    \n+
    936 char attr2 = iterators->second.remoteIndex().attribute();
    \n+
    937
    \n+
    938 MPI_Pack(&attr2, 1, MPI_CHAR, buffer, bufferSize, &bpos,
    \n+
    939 remoteIndices_.communicator());
    \n+
    940 --indices;
    \n+
    941 }
    \n+
    942 assert(indices==0);
    \n+
    943 ++published;
    \n+
    944 Dune::dvverb<<" (publish="<<published<<", pairs="<<pairs<<")"<<std::endl;
    \n+
    945 assert(published <= infoSend_[destination].publish);
    \n+
    946 }
    \n+
    947
    \n+
    948 // Make sure we send all expected entries
    \n+
    949 assert(published == infoSend_[destination].publish);
    \n+
    950 assert(pairs == infoSend_[destination].pairs);
    \n+
    951 resetIteratorsMap();
    \n+
    952
    \n+
    953 Dune::dverb << rank_<<": Sending message of "<<bpos<<" bytes to "<<destination<<std::endl;
    \n+
    954
    \n+
    955 MPI_Issend(buffer, bpos, MPI_PACKED, destination, 345, remoteIndices_.communicator(),&request);
    \n+
    956 }
    \n+
    957
    \n+
    958 template<typename T>
    \n+
    959 inline void IndicesSyncer<T>::insertIntoRemoteIndexList(int process,
    \n+
    960 const std::pair<GlobalIndex,Attribute>& globalPair,
    \n+
    961 char attribute)
    \n+
    962 {
    \n+
    963 Dune::dverb<<"Inserting from "<<process<<" "<<globalPair.first<<", "<<
    \n+
    964 globalPair.second<<" "<<attribute<<std::endl;
    \n+
    965
    \n+
    966 resetIteratorsMap();
    \n+
    967
    \n+
    968 // There might be cases where there no remote indices for that process yet
    \n+
    969 typename IteratorsMap::iterator found = iteratorsMap_.find(process);
    \n+
    970
    \n+
    971 if( found == iteratorsMap_.end() ) {
    \n+
    972 Dune::dverb<<"Discovered new neighbour "<<process<<std::endl;
    \n+
    973 RemoteIndexList* rlist = new RemoteIndexList();
    \n+
    974 remoteIndices_.remoteIndices_.insert(std::make_pair(process,std::make_pair(rlist,rlist)));
    \n+
    975 Iterators iterators = Iterators(*rlist, globalMap_[process], oldMap_[process]);
    \n+
    976 found = iteratorsMap_.insert(std::make_pair(process, iterators)).first;
    \n+
    977 }
    \n+
    978
    \n+
    979 Iterators& iterators = found->second;
    \n+
    980
    \n+
    981 // Search for the remote index
    \n+
    982 while(iterators.isNotAtEnd() && iterators.globalIndexPair() < globalPair) {
    \n+
    983 // Increment all iterators
    \n+
    984 ++iterators;
    \n+
    985
    \n+
    986 }
    \n+
    987
    \n+
    988 if(iterators.isAtEnd() || iterators.globalIndexPair() != globalPair) {
    \n+
    989 // The entry is not yet known
    \n+
    990 // Insert in the list and do not change the first iterator.
    \n+
    991 iterators.insert(RemoteIndex(Attribute(attribute)),globalPair);
    \n+
    992 return;
    \n+
    993 }
    \n+
    994
    \n+
    995 // Global indices match
    \n+
    996 bool indexIsThere=false;
    \n+
    997 for(Iterators tmpIterators = iterators;
    \n+
    998 !tmpIterators.isAtEnd() && tmpIterators.globalIndexPair() == globalPair;
    \n+
    999 ++tmpIterators)
    \n+
    1000 //entry already exists with the same attribute
    \n+
    1001 if(tmpIterators.globalIndexPair().second == attribute) {
    \n+
    1002 indexIsThere=true;
    \n+
    1003 break;
    \n+
    1004 }
    \n+
    1005
    \n+
    1006 if(!indexIsThere)
    \n+
    1007 // The entry is not yet known
    \n+
    1008 // Insert in the list and do not change the first iterator.
    \n+
    1009 iterators.insert(RemoteIndex(Attribute(attribute)),globalPair);
    \n+
    1010 }
    \n+
    1011
    \n+
    1012 template<typename T>
    \n+
    1013 template<typename T1>
    \n+
    1014 void IndicesSyncer<T>::recvAndUnpack(T1& numberer, int hardSource, bool useHardSource)
    \n+
    1015 {
    \n+
    1016 const ParallelIndexSet& constIndexSet = indexSet_;
    \n+
    1017 auto iEnd = constIndexSet.end();
    \n+
    1018 auto index = constIndexSet.begin();
    \n+
    1019 int bpos = 0;
    \n+
    1020 int publish;
    \n+
    1021
    \n+
    1022 assert(checkReset());
    \n+
    1023
    \n+
    1024 MPI_Status status;
    \n+
    1025
    \n+
    1026 // We have to determine the message size and source before the receive
    \n+
    1027
    \n+
    1028 MPI_Probe(useHardSource ? hardSource : MPI_ANY_SOURCE, 345, remoteIndices_.communicator(), &status);
    \n+
    1029
    \n+
    1030 int source=status.MPI_SOURCE;
    \n+
    1031 int count;
    \n+
    1032 MPI_Get_count(&status, MPI_PACKED, &count);
    \n+
    1033
    \n+
    1034 Dune::dvverb<<rank_<<": Receiving message from "<< source<<" with "<<count<<" bytes"<<std::endl;
    \n+
    1035
    \n+
    1036 if(count>receiveBufferSize_) {
    \n+
    1037 receiveBufferSize_=count;
    \n+
    1038 delete[] receiveBuffer_;
    \n+
    1039 receiveBuffer_ = new char[receiveBufferSize_];
    \n+
    1040 }
    \n+
    1041
    \n+
    1042 MPI_Recv(receiveBuffer_, count, MPI_PACKED, source, 345, remoteIndices_.communicator(), &status);
    \n+
    1043
    \n+
    1044 // How many global entries were published?
    \n+
    1045 MPI_Unpack(receiveBuffer_, count, &bpos, &publish, 1, MPI_INT, remoteIndices_.communicator());
    \n+
    1046
    \n+
    1047 // Now unpack the remote indices and add them.
    \n+
    1048 while(publish>0) {
    \n+
    1049
    \n+
    1050 // Unpack information about the local index on the source process
    \n+
    1051 GlobalIndex global; // global index of the current entry
    \n+
    1052 char sourceAttribute; // Attribute on the source process
    \n+
    1053 int pairs;
    \n+
    1054
    \n+
    1055 MPI_Unpack(receiveBuffer_, count, &bpos, &global, 1, MPITraits<GlobalIndex>::getType(),
    \n+
    1056 remoteIndices_.communicator());
    \n+
    1057 MPI_Unpack(receiveBuffer_, count, &bpos, &sourceAttribute, 1, MPI_CHAR,
    \n+
    1058 remoteIndices_.communicator());
    \n+
    1059 MPI_Unpack(receiveBuffer_, count, &bpos, &pairs, 1, MPI_INT,
    \n+
    1060 remoteIndices_.communicator());
    \n+
    1061
    \n+
    1062 // Insert the entry on the remote process to our
    \n+
    1063 // remote index list
    \n+
    1064 SLList<std::pair<int,Attribute> > sourceAttributeList;
    \n+
    1065 sourceAttributeList.push_back(std::make_pair(source,Attribute(sourceAttribute)));
    \n+
    1066#ifndef NDEBUG
    \n+
    1067 bool foundSelf = false;
    \n+
    1068#endif
    \n+
    1069 Attribute myAttribute=Attribute();
    \n+
    1070
    \n+
    1071 // Unpack the remote indices
    \n+
    1072 for(; pairs>0; --pairs) {
    \n+
    1073 // Unpack the process id that knows the index
    \n+
    1074 int process;
    \n+
    1075 char attribute;
    \n+
    1076 MPI_Unpack(receiveBuffer_, count, &bpos, &process, 1, MPI_INT,
    \n+
    1077 remoteIndices_.communicator());
    \n+
    1078 // Unpack the attribute
    \n+
    1079 MPI_Unpack(receiveBuffer_, count, &bpos, &attribute, 1, MPI_CHAR,
    \n+
    1080 remoteIndices_.communicator());
    \n+
    1081
    \n+
    1082 if(process==rank_) {
    \n+
    1083#ifndef NDEBUG
    \n+
    1084 foundSelf=true;
    \n+
    1085#endif
    \n+
    1086 myAttribute=Attribute(attribute);
    \n+
    1087 // Now we know the local attribute of the global index
    \n+
    1088 //Only add the index if it is unknown.
    \n+
    1089 // Do we know that global index already?
    \n+
    1090 auto pos = std::lower_bound(index, iEnd, IndexPair(global));
    \n+
    1091
    \n+
    1092 if(pos == iEnd || pos->global() != global) {
    \n+
    1093 // no entry with this global index
    \n+
    1094 indexSet_.add(global,
    \n+
    1095 ParallelLocalIndex<Attribute>(numberer(global),
    \n+
    1096 myAttribute, true));
    \n+
    1097 Dune::dvverb << "Adding "<<global<<" "<<myAttribute<<std::endl;
    \n+
    1098 continue;
    \n+
    1099 }
    \n+
    1100
    \n+
    1101 // because of above the global indices match. Add only if the attribute is different
    \n+
    1102 bool indexIsThere = false;
    \n+
    1103 index=pos;
    \n+
    1104
    \n+
    1105 for(; pos->global()==global; ++pos)
    \n+
    1106 if(pos->local().attribute() == myAttribute) {
    \n+
    1107 Dune::dvverb<<"found "<<global<<" "<<myAttribute<<std::endl;
    \n+
    1108 indexIsThere = true;
    \n+
    1109 break;
    \n+
    1110 }
    \n+
    1111
    \n+
    1112 if(!indexIsThere) {
    \n+
    1113 indexSet_.add(global,
    \n+
    1114 ParallelLocalIndex<Attribute>(numberer(global),
    \n+
    1115 myAttribute, true));
    \n+
    1116 Dune::dvverb << "Adding "<<global<<" "<<myAttribute<<std::endl;
    \n+
    1117 }
    \n+
    1118
    \n+
    1119 }else{
    \n+
    1120 sourceAttributeList.push_back(std::make_pair(process,Attribute(attribute)));
    \n+
    1121 }
    \n+
    1122 }
    \n+
    1123 assert(foundSelf);
    \n+
    1124 // Insert remote indices
    \n+
    1125 typedef typename SLList<std::pair<int,Attribute> >::const_iterator Iter;
    \n+
    1126 for(Iter i=sourceAttributeList.begin(), end=sourceAttributeList.end();
    \n+
    1127 i!=end; ++i)
    \n+
    1128 insertIntoRemoteIndexList(i->first, std::make_pair(global, myAttribute),
    \n+
    1129 i->second);
    \n+
    1130 --publish;
    \n+
    1131 }
    \n+
    1132
    \n+
    1133 resetIteratorsMap();
    \n+
    1134 }
    \n+
    1135
    \n+
    1136 template<typename T>
    \n+
    1137 void IndicesSyncer<T>::resetIteratorsMap(){
    \n+
    1138
    \n+
    1139 // Reset iterators in all tuples.
    \n+
    1140 const auto remoteEnd = remoteIndices_.remoteIndices_.end();
    \n+
    1141 auto iterators = iteratorsMap_.begin();
    \n+
    1142 auto global = globalMap_.begin();
    \n+
    1143 auto added = oldMap_.begin();
    \n+
    1144
    \n+
    1145 for(auto remote = remoteIndices_.remoteIndices_.begin();
    \n+
    1146 remote != remoteEnd; ++remote, ++global, ++added, ++iterators) {
    \n+
    1147 iterators->second.reset(*(remote->second.first), global->second, added->second);
    \n+
    1148 }
    \n+
    1149 }
    \n+
    1150
    \n+
    1151 template<typename T>
    \n+
    1152 bool IndicesSyncer<T>::checkReset(const Iterators& iterators, RemoteIndexList& rList, GlobalIndexList& gList,
    \n+
    1153 BoolList& bList){
    \n+
    1154
    \n+
    1155 if(std::get<0>(iterators.iterators_) != rList.begin())
    \n+
    1156 return false;
    \n+
    1157 if(std::get<1>(iterators.iterators_) != gList.begin())
    \n+
    1158 return false;
    \n+
    1159 if(std::get<2>(iterators.iterators_) != bList.begin())
    \n+
    1160 return false;
    \n+
    1161 return true;
    \n+
    1162 }
    \n+
    1163
    \n+
    1164
    \n+
    1165 template<typename T>
    \n+
    1166 bool IndicesSyncer<T>::checkReset(){
    \n+
    1167
    \n+
    1168 // Reset iterators in all tuples.
    \n+
    1169 const auto remoteEnd = remoteIndices_.remoteIndices_.end();
    \n+
    1170 auto iterators = iteratorsMap_.begin();
    \n+
    1171 auto global = globalMap_.begin();
    \n+
    1172 auto added = oldMap_.begin();
    \n+
    1173 bool ret = true;
    \n+
    1174
    \n+
    1175 for(auto remote = remoteIndices_.remoteIndices_.begin();
    \n+
    1176 remote != remoteEnd; ++remote, ++global, ++added, ++iterators) {
    \n+
    1177 if(!checkReset(iterators->second, *(remote->second.first), global->second,
    \n+
    1178 added->second))
    \n+
    1179 ret=false;
    \n+
    1180 }
    \n+
    1181 return ret;
    \n+
    1182 }
    \n+
    1183}
    \n+
    1184
    \n+
    1185#endif // HAVE_MPI
    \n+
    1186#endif // DUNE_COMMON_PARALLEL_INDICESSYNCER_HH
    \n+
    Provides a map between global and local indices.
    \n+
    Classes describing a distributed indexset.
    \n+
    Standard Dune debug streams.
    \n+
    Implements a singly linked list together with the necessary iterators.
    \n+
    void push_back(const MemberType &item)
    Add a new entry to the end of the list.
    Definition sllist.hh:643
    \n+
    SLListIterator< T, A > iterator
    The mutable iterator of the list.
    Definition sllist.hh:69
    \n+
    iterator end()
    Get an iterator pointing to the end of the list.
    Definition sllist.hh:774
    \n+
    ModifyIterator beginModify()
    Get an iterator capable of deleting and inserting elements.
    Definition sllist.hh:787
    \n+
    SLListConstIterator< RemoteIndex, Allocator > const_iterator
    The constant iterator of the list.
    Definition sllist.hh:74
    \n+
    SLListModifyIterator< T, A > ModifyIterator
    The type of the iterator capable of deletion and insertion.
    Definition sllist.hh:103
    \n+
    iterator begin()
    Get an iterator pointing to the first element in the list.
    Definition sllist.hh:762
    \n+
    EnableIfInterOperable< T1, T2, bool >::type operator<(const RandomAccessIteratorFacade< T1, V1, R1, D > &lhs, const RandomAccessIteratorFacade< T2, V2, R2, D > &rhs)
    Comparison operator.
    Definition iteratorfacades.hh:638
    \n+
    EnableIfInterOperable< T1, T2, bool >::type operator==(const ForwardIteratorFacade< T1, V1, R1, D > &lhs, const ForwardIteratorFacade< T2, V2, R2, D > &rhs)
    Checks for equality.
    Definition iteratorfacades.hh:238
    \n+
    EnableIfInterOperable< T1, T2, bool >::type operator!=(const ForwardIteratorFacade< T1, V1, R1, D > &lhs, const ForwardIteratorFacade< T2, V2, R2, D > &rhs)
    Checks for inequality.
    Definition iteratorfacades.hh:260
    \n+
    Iterators()
    Default constructor.
    Definition indicessyncer.hh:563
    \n+
    Dune::RemoteIndices< ParallelIndexSet > RemoteIndices
    Type of the remote indices.
    Definition indicessyncer.hh:63
    \n+
    bool isOld() const
    Was this entry already in the remote index list before the sync process?
    Definition indicessyncer.hh:600
    \n+
    int publish
    The number of indices we publish for the other process.
    Definition indicessyncer.hh:132
    \n+
    void repairLocalIndexPointers(std::map< int, SLList< std::pair< typename T::GlobalIndex, typename T::LocalIndex::Attribute >, A > > &globalMap, RemoteIndices< T, A1 > &remoteIndices, const T &indexSet)
    Repair the pointers to the local indices in the remote indices.
    Definition indicessyncer.hh:495
    \n+
    bool isAtEnd() const
    Are we at the end of the list?
    Definition indicessyncer.hh:622
    \n+
    MPI_Comm communicator() const
    Get the mpi communicator used.
    Definition remoteindices.hh:1695
    \n+
    ParallelIndexSet::GlobalIndex GlobalIndex
    Type of the global index used in the index set.
    Definition indicessyncer.hh:55
    \n+
    int pairs
    The number of pairs (attribute and process number) we publish to the neighbour process.
    Definition indicessyncer.hh:137
    \n+
    const_iterator end() const
    Get an iterator over all remote index lists.
    Definition remoteindices.hh:1528
    \n+
    Attribute & attribute() const
    \n+
    Iterators & operator++()
    Increment all iterators.
    Definition indicessyncer.hh:568
    \n+
    ParallelIndexSet::LocalIndex::Attribute Attribute
    Type of the attribute used in the index set.
    Definition indicessyncer.hh:58
    \n+
    std::pair< GlobalIndex, Attribute > & globalIndexPair() const
    Get the global index of the remote index at current position.
    Definition indicessyncer.hh:594
    \n+
    IndicesSyncer(ParallelIndexSet &indexSet, RemoteIndices &remoteIndices)
    Constructor.
    Definition indicessyncer.hh:544
    \n+
    void reset(RemoteIndexList &remoteIndices, GlobalIndexList &globalIndices, BoolList &booleans)
    Reset all the underlying iterators.
    Definition indicessyncer.hh:606
    \n+
    std::size_t operator()(const GlobalIndex &global)
    Provide the local index, always std::numeric_limits<size_t>::max()
    Definition indicessyncer.hh:151
    \n+
    T ParallelIndexSet
    The type of the index set.
    Definition indicessyncer.hh:49
    \n+
    bool isNotAtEnd() const
    Are we not at the end of the list?
    Definition indicessyncer.hh:616
    \n+
    int neighbours() const
    Get the number of processors we share indices with.
    Definition remoteindices.hh:1445
    \n+
    TG GlobalIndex
    the type of the global index. This type has to provide at least a operator< for sorting.
    Definition indexset.hh:226
    \n+
    void storeGlobalIndicesOfRemoteIndices(std::map< int, SLList< std::pair< typename T::GlobalIndex, typename T::LocalIndex::Attribute >, A > > &globalMap, const RemoteIndices< T, A1 > &remoteIndices)
    Stores the corresponding global indices of the remote index information.
    Definition indicessyncer.hh:469
    \n+
    void sync()
    Sync the index set.
    Definition indicessyncer.hh:736
    \n+
    int seqNo() const
    Get the internal sequence number.
    \n+
    ParallelIndexSet::IndexPair IndexPair
    The type of the index pair.
    Definition indicessyncer.hh:52
    \n+
    const_iterator begin() const
    Get an iterator over all remote index lists.
    Definition remoteindices.hh:1521
    \n+
    RemoteIndex & remoteIndex() const
    Get the remote index at current position.
    Definition indicessyncer.hh:587
    \n+
    MessageInformation()
    Definition indicessyncer.hh:128
    \n+
    void insert(const RemoteIndex &index, const std::pair< GlobalIndex, Attribute > &global)
    Insert a new remote index to the underlying remote index list.
    Definition indicessyncer.hh:577
    \n+
    DVVerbType dvverb(std::cout)
    stream for very verbose output.
    Definition stdstreams.hh:96
    \n+
    DVerbType dverb(std::cout)
    Singleton of verbose debug stream.
    Definition stdstreams.hh:117
    \n
    Dune namespace.
    Definition alignedallocator.hh:13
    \n-
    A constant random access iterator for the Dune::ArrayList class.
    Definition arraylist.hh:368
    \n-
    Manager class for the mapping between local indices and globally unique indices.
    Definition indexset.hh:218
    \n-
    A const iterator over an uncached selection.
    Definition selection.hh:31
    \n-
    ConstArrayListIterator< IndexPair< TG, TL >, N, std::allocator< Dune::IndexPair< TG, TL > > > ParallelIndexSetIterator
    Definition selection.hh:50
    \n-
    void operator++()
    Definition selection.hh:64
    \n-
    uint32_t operator*() const
    Definition selection.hh:73
    \n-
    TS AttributeSet
    The type of the Set of attributes.
    Definition selection.hh:41
    \n-
    Dune::ParallelIndexSet< TG, TL, N > ParallelIndexSet
    The type of the underlying index set.
    Definition selection.hh:46
    \n-
    SelectionIterator(const ParallelIndexSetIterator &iter, const ParallelIndexSetIterator &end)
    Constructor.
    Definition selection.hh:56
    \n-
    bool operator!=(const SelectionIterator< TS, TG, TL, N > &other) const
    Definition selection.hh:83
    \n-
    bool operator==(const SelectionIterator< TS, TG, TL, N > &other) const
    Definition selection.hh:78
    \n-
    An uncached selection of indices.
    Definition selection.hh:99
    \n-
    UncachedSelection()
    Definition selection.hh:139
    \n-
    SelectionIterator< TS, TG, TL, N > iterator
    The type of the iterator of the selected indices.
    Definition selection.hh:132
    \n-
    TS AttributeSet
    The type of the Set of attributes.
    Definition selection.hh:109
    \n-
    iterator const_iterator
    The type of the iterator of the selected indices.
    Definition selection.hh:137
    \n-
    TG GlobalIndex
    The type of the global index of the underlying index set.
    Definition selection.hh:114
    \n-
    UncachedSelection(const ParallelIndexSet &indexset)
    Definition selection.hh:143
    \n-
    Dune::ParallelIndexSet< GlobalIndex, LocalIndex, N > ParallelIndexSet
    The type of the underlying index set.
    Definition selection.hh:127
    \n-
    TL LocalIndex
    The type of the local index of the underlying index set.
    Definition selection.hh:122
    \n-
    A cached selection of indices.
    Definition selection.hh:180
    \n-
    TG GlobalIndex
    The type of the global index of the underlying index set.
    Definition selection.hh:195
    \n-
    Selection(const ParallelIndexSet &indexset)
    Definition selection.hh:224
    \n-
    Selection()
    Definition selection.hh:220
    \n-
    TL LocalIndex
    The type of the local index of the underlying index set.
    Definition selection.hh:203
    \n-
    TS AttributeSet
    The type of the set of attributes.
    Definition selection.hh:190
    \n-
    uint32_t * iterator
    The type of the iterator of the selected indices.
    Definition selection.hh:213
    \n-
    uint32_t * const_iterator
    The type of the iterator of the selected indices.
    Definition selection.hh:218
    \n-
    Dune::ParallelIndexSet< GlobalIndex, LocalIndex, N > ParallelIndexSet
    The type of the underlying index set.
    Definition selection.hh:208
    \n+
    static MPI_Datatype getType()
    Definition mpitraits.hh:48
    \n+
    A pair consisting of a global and local index.
    Definition indexset.hh:85
    \n+
    Class for recomputing missing indices of a distributed index set.
    Definition indicessyncer.hh:45
    \n+
    An index present on the local process with an additional attribute flag.
    Definition plocalindex.hh:52
    \n+
    The indices present on remote processes.
    Definition remoteindices.hh:190
    \n+
    typename std::allocator_traits< A >::template rebind_alloc< RemoteIndex > Allocator
    The type of the allocator for the remote index list.
    Definition remoteindices.hh:238
    \n+
    Information about an index residing on another processor.
    Definition remoteindices.hh:74
    \n+
    A mutable iterator for the SLList.
    Definition sllist.hh:271
    \n+
    A single linked list.
    Definition sllist.hh:44
    \n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,388 +1,1211 @@\n dune-common\u00a02.10\n Loading...\n Searching...\n No Matches\n * _\bd_\bu_\bn_\be\n * _\bc_\bo_\bm_\bm_\bo_\bn\n * _\bp_\ba_\br_\ba_\bl_\bl_\be_\bl\n-selection.hh\n+indicessyncer.hh\n _\bG_\bo_\b _\bt_\bo_\b _\bt_\bh_\be_\b _\bd_\bo_\bc_\bu_\bm_\be_\bn_\bt_\ba_\bt_\bi_\bo_\bn_\b _\bo_\bf_\b _\bt_\bh_\bi_\bs_\b _\bf_\bi_\bl_\be_\b.\n 1// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-\n 2// vi: set et ts=4 sw=2 sts=2:\n 3// SPDX-FileCopyrightInfo: Copyright \u00c2\u00a9 DUNE Project contributors, see file\n LICENSE.md in module root\n 4// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception\n-5#ifndef DUNE_COMMON_PARALLEL_SELECTION_HH\n-6#define DUNE_COMMON_PARALLEL_SELECTION_HH\n+5#ifndef DUNE_COMMON_PARALLEL_INDICESSYNCER_HH\n+6#define DUNE_COMMON_PARALLEL_INDICESSYNCER_HH\n 7\n-8#include \n+8#if HAVE_MPI\n 9\n-10#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bi_\bt_\be_\br_\ba_\bt_\bo_\br_\bf_\ba_\bc_\ba_\bd_\be_\bs_\b._\bh_\bh>\n-11#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bp_\ba_\br_\ba_\bl_\bl_\be_\bl_\b/_\bi_\bn_\bd_\be_\bx_\bs_\be_\bt_\b._\bh_\bh>\n-12\n-13namespace _\bD_\bu_\bn_\be\n-14{\n-29 template\n-_\b3_\b0 class _\bS_\be_\bl_\be_\bc_\bt_\bi_\bo_\bn_\bI_\bt_\be_\br_\ba_\bt_\bo_\br\n-31 {\n-32 public:\n-_\b4_\b1 typedef TS _\bA_\bt_\bt_\br_\bi_\bb_\bu_\bt_\be_\bS_\be_\bt;\n-42\n-_\b4_\b6 typedef _\bD_\bu_\bn_\be_\b:_\b:_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt_\b<_\bT_\bG_\b,_\bT_\bL_\b,_\bN_\b> _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt;\n+10#include \n+11#include \n+12#include \n+13#include \n+14#include \n+15#include \n+16#include \n+17\n+18#include \n+19\n+20#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bs_\bt_\bd_\bs_\bt_\br_\be_\ba_\bm_\bs_\b._\bh_\bh>\n+21#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bs_\bl_\bl_\bi_\bs_\bt_\b._\bh_\bh>\n+22#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bp_\ba_\br_\ba_\bl_\bl_\be_\bl_\b/_\bi_\bn_\bd_\be_\bx_\bs_\be_\bt_\b._\bh_\bh>\n+23#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bp_\ba_\br_\ba_\bl_\bl_\be_\bl_\b/_\br_\be_\bm_\bo_\bt_\be_\bi_\bn_\bd_\bi_\bc_\be_\bs_\b._\bh_\bh>\n+24\n+25namespace _\bD_\bu_\bn_\be\n+26{\n+43 template\n+_\b4_\b4 class _\bI_\bn_\bd_\bi_\bc_\be_\bs_\bS_\by_\bn_\bc_\be_\br\n+45 {\n+46 public:\n 47\n-48 //typedef typename ParallelIndexSet::const_iterator\n-ParallelIndexSetIterator;\n-49\n-_\b5_\b0 typedef _\bC_\bo_\bn_\bs_\bt_\bA_\br_\br_\ba_\by_\bL_\bi_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b<_\bI_\bn_\bd_\be_\bx_\bP_\ba_\bi_\br_\b<_\bT_\bG_\b,_\bT_\bL_\b>, N, std::allocator > > _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br;\n-_\b5_\b6 _\bS_\be_\bl_\be_\bc_\bt_\bi_\bo_\bn_\bI_\bt_\be_\br_\ba_\bt_\bo_\br(const _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br& iter, const\n-_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br& end)\n-57 : iter_(iter), end_(end)\n-58 {\n-59 // Step to the first valid entry\n-60 while(iter_!=end_ && !AttributeSet::contains(iter_->local().attribute()))\n-61 ++iter_;\n-62 }\n-63\n-_\b6_\b4 void _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b+_\b+()\n-65 {\n-66 assert(iter_!=end_);\n-67 for(++iter_; iter_!=end_; ++iter_)\n-68 if(AttributeSet::contains(iter_->local().attribute()))\n-69 break;\n-70 }\n-71\n-72\n-_\b7_\b3 uint32_t _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b*() const\n-74 {\n-75 return iter_->local().local();\n-76 }\n-77\n-_\b7_\b8 bool _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b=_\b=(const _\bS_\be_\bl_\be_\bc_\bt_\bi_\bo_\bn_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b<_\bT_\bS_\b,_\bT_\bG_\b,_\bT_\bL_\b,_\bN_\b>& other) const\n-79 {\n-80 return iter_ == other.iter_;\n-81 }\n-82\n-_\b8_\b3 bool _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b!_\b=(const _\bS_\be_\bl_\be_\bc_\bt_\bi_\bo_\bn_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b<_\bT_\bS_\b,_\bT_\bG_\b,_\bT_\bL_\b,_\bN_\b>& other) const\n-84 {\n-85 return iter_ != other.iter_;\n-86 }\n+_\b4_\b9 typedef T _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt;\n+50\n+_\b5_\b2 typedef typename _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt_\b:_\b:_\bI_\bn_\bd_\be_\bx_\bP_\ba_\bi_\br _\bI_\bn_\bd_\be_\bx_\bP_\ba_\bi_\br;\n+53\n+_\b5_\b5 typedef typename _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt_\b:_\b:_\bG_\bl_\bo_\bb_\ba_\bl_\bI_\bn_\bd_\be_\bx _\bG_\bl_\bo_\bb_\ba_\bl_\bI_\bn_\bd_\be_\bx;\n+56\n+_\b5_\b8 typedef typename ParallelIndexSet::LocalIndex::Attribute _\bA_\bt_\bt_\br_\bi_\bb_\bu_\bt_\be;\n+59\n+_\b6_\b3 typedef _\bD_\bu_\bn_\be_\b:_\b:_\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\bi_\bc_\be_\bs_\b<_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt_\b> _\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\bi_\bc_\be_\bs;\n+64\n+74 _\bI_\bn_\bd_\bi_\bc_\be_\bs_\bS_\by_\bn_\bc_\be_\br(_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt& indexSet,\n+75 _\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\bi_\bc_\be_\bs& remoteIndices);\n+76\n+86 void _\bs_\by_\bn_\bc();\n 87\n-88 private:\n-89 _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br iter_;\n-90 const _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br end_;\n-91 };\n-92\n-93\n-97 template\n-_\b9_\b8 class _\bU_\bn_\bc_\ba_\bc_\bh_\be_\bd_\bS_\be_\bl_\be_\bc_\bt_\bi_\bo_\bn\n-99 {\n-100 public:\n-_\b1_\b0_\b9 typedef TS _\bA_\bt_\bt_\br_\bi_\bb_\bu_\bt_\be_\bS_\be_\bt;\n+100 template\n+101 void _\bs_\by_\bn_\bc(T1& numberer, bool useFixedOrder = false);\n+102\n+103 private:\n+104\n+106 _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt& indexSet_;\n+107\n+109 _\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\bi_\bc_\be_\bs& remoteIndices_;\n 110\n-_\b1_\b1_\b4 typedef TG _\bG_\bl_\bo_\bb_\ba_\bl_\bI_\bn_\bd_\be_\bx;\n-115\n-_\b1_\b2_\b2 typedef TL _\bL_\bo_\bc_\ba_\bl_\bI_\bn_\bd_\be_\bx;\n-123\n-_\b1_\b2_\b7 typedef _\bD_\bu_\bn_\be_\b:_\b:_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt_\b<_\bG_\bl_\bo_\bb_\ba_\bl_\bI_\bn_\bd_\be_\bx_\b,_\bL_\bo_\bc_\ba_\bl_\bI_\bn_\bd_\be_\bx_\b,_\bN_\b> _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt;\n-128\n-_\b1_\b3_\b2 typedef _\bS_\be_\bl_\be_\bc_\bt_\bi_\bo_\bn_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b<_\bT_\bS_\b,_\bT_\bG_\b,_\bT_\bL_\b,_\bN_\b> _\bi_\bt_\be_\br_\ba_\bt_\bo_\br;\n-133\n-_\b1_\b3_\b7 typedef _\bi_\bt_\be_\br_\ba_\bt_\bo_\br _\bc_\bo_\bn_\bs_\bt_\b__\bi_\bt_\be_\br_\ba_\bt_\bo_\br;\n-138\n-_\b1_\b3_\b9 _\bU_\bn_\bc_\ba_\bc_\bh_\be_\bd_\bS_\be_\bl_\be_\bc_\bt_\bi_\bo_\bn()\n-140 : indexSet_()\n-141 {}\n-142\n-_\b1_\b4_\b3 _\bU_\bn_\bc_\ba_\bc_\bh_\be_\bd_\bS_\be_\bl_\be_\bc_\bt_\bi_\bo_\bn(const _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt& indexset)\n-144 : indexSet_(&indexset)\n-145 {}\n-150 void _\bs_\be_\bt_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt(const _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt& indexset);\n-151\n-155 //const ParallelIndexSet& indexSet() const;\n+112 char** sendBuffers_;\n+113\n+115 char* receiveBuffer_;\n+116\n+118 std::size_t* sendBufferSizes_;\n+119\n+121 int receiveBufferSize_; // int because of MPI\n+122\n+126 struct MessageInformation\n+127 {\n+_\b1_\b2_\b8 _\bM_\be_\bs_\bs_\ba_\bg_\be_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn()\n+129 : _\bp_\bu_\bb_\bl_\bi_\bs_\bh(), _\bp_\ba_\bi_\br_\bs()\n+130 {}\n+_\b1_\b3_\b2 int _\bp_\bu_\bb_\bl_\bi_\bs_\bh;\n+_\b1_\b3_\b7 int _\bp_\ba_\bi_\br_\bs;\n+138 };\n+139\n+143 class DefaultNumberer\n+144 {\n+145 public:\n+_\b1_\b5_\b1 std::size_t _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b(_\b)([[maybe_unused]] const _\bG_\bl_\bo_\bb_\ba_\bl_\bI_\bn_\bd_\be_\bx& global)\n+152 {\n+153 return std::numeric_limits::max();\n+154 }\n+155 };\n 156\n-161 _\bc_\bo_\bn_\bs_\bt_\b__\bi_\bt_\be_\br_\ba_\bt_\bo_\br _\bb_\be_\bg_\bi_\bn() const;\n+158 MPI_Datatype datatype_;\n+159\n+161 int rank_;\n 162\n-167 _\bc_\bo_\bn_\bs_\bt_\b__\bi_\bt_\be_\br_\ba_\bt_\bo_\br _\be_\bn_\bd() const;\n+167 typedef _\bS_\bL_\bL_\bi_\bs_\bt_\b<_\bs_\bt_\bd_\b:_\b:_\bp_\ba_\bi_\br_\b<_\bG_\bl_\bo_\bb_\ba_\bl_\bI_\bn_\bd_\be_\bx_\b,_\bA_\bt_\bt_\br_\bi_\bb_\bu_\bt_\be_\b>, typename _\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\bi_\bc_\be_\bs_\b:_\b:\n+_\bA_\bl_\bl_\bo_\bc_\ba_\bt_\bo_\br> GlobalIndexList;\n 168\n-169\n-170 private:\n-171 const _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt* indexSet_;\n-172\n-173 };\n-174\n-178 template\n-_\b1_\b7_\b9 class _\bS_\be_\bl_\be_\bc_\bt_\bi_\bo_\bn\n-180 {\n-181 public:\n-_\b1_\b9_\b0 typedef TS _\bA_\bt_\bt_\br_\bi_\bb_\bu_\bt_\be_\bS_\be_\bt;\n-191\n-_\b1_\b9_\b5 typedef TG _\bG_\bl_\bo_\bb_\ba_\bl_\bI_\bn_\bd_\be_\bx;\n-196\n-_\b2_\b0_\b3 typedef TL _\bL_\bo_\bc_\ba_\bl_\bI_\bn_\bd_\be_\bx;\n-204\n-_\b2_\b0_\b8 typedef _\bD_\bu_\bn_\be_\b:_\b:_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt_\b<_\bG_\bl_\bo_\bb_\ba_\bl_\bI_\bn_\bd_\be_\bx_\b,_\bL_\bo_\bc_\ba_\bl_\bI_\bn_\bd_\be_\bx_\b,_\bN_\b> _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt;\n-209\n-_\b2_\b1_\b3 typedef uint32_t* _\bi_\bt_\be_\br_\ba_\bt_\bo_\br;\n-214\n-_\b2_\b1_\b8 typedef uint32_t* _\bc_\bo_\bn_\bs_\bt_\b__\bi_\bt_\be_\br_\ba_\bt_\bo_\br;\n-219\n-_\b2_\b2_\b0 _\bS_\be_\bl_\be_\bc_\bt_\bi_\bo_\bn()\n-221 : selected_()\n-222 {}\n-223\n-_\b2_\b2_\b4 _\bS_\be_\bl_\be_\bc_\bt_\bi_\bo_\bn(const _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt& indexset)\n-225 : selected_(), size_(0), built_(false)\n-226 {\n-227 _\bs_\be_\bt_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt(indexset);\n-228 }\n-229\n-230 _\b~_\bS_\be_\bl_\be_\bc_\bt_\bi_\bo_\bn();\n-231\n-236 void _\bs_\be_\bt_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt(const _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt& indexset);\n-237\n-241 void _\bf_\br_\be_\be();\n-242\n-246 //IndexSet indexSet() const;\n-247\n-252 _\bc_\bo_\bn_\bs_\bt_\b__\bi_\bt_\be_\br_\ba_\bt_\bo_\br _\bb_\be_\bg_\bi_\bn() const;\n-253\n-258 _\bc_\bo_\bn_\bs_\bt_\b__\bi_\bt_\be_\br_\ba_\bt_\bo_\br _\be_\bn_\bd() const;\n-259\n-260\n-261 private:\n-262 uint32_t* selected_;\n-263 size_t size_;\n-264 bool built_;\n-265\n-266 };\n+170 typedef typename _\bG_\bl_\bo_\bb_\ba_\bl_\bI_\bn_\bd_\be_\bx_\bL_\bi_\bs_\bt_\b:_\b:_\bM_\bo_\bd_\bi_\bf_\by_\bI_\bt_\be_\br_\ba_\bt_\bo_\br GlobalIndexModifier;\n+171\n+175 typedef typename _\bS_\bL_\bL_\bi_\bs_\bt_\b<_\bG_\bl_\bo_\bb_\ba_\bl_\bI_\bn_\bd_\be_\bx_\b,_\b _\bt_\by_\bp_\be_\bn_\ba_\bm_\be_\b _\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\bi_\bc_\be_\bs_\b:_\b:_\bA_\bl_\bl_\bo_\bc_\ba_\bt_\bo_\br_\b>_\b:_\b:\n+_\bi_\bt_\be_\br_\ba_\bt_\bo_\br\n+176 GlobalIndexIterator;\n+177\n+179 typedef std::map GlobalIndicesMap;\n+180\n+189 GlobalIndicesMap globalMap_;\n+190\n+194 typedef _\bS_\bL_\bL_\bi_\bs_\bt_\b<_\bb_\bo_\bo_\bl_\b,_\b _\bt_\by_\bp_\be_\bn_\ba_\bm_\be_\b _\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\bi_\bc_\be_\bs_\b:_\b:_\bA_\bl_\bl_\bo_\bc_\ba_\bt_\bo_\br_\b> BoolList;\n+195\n+199 typedef typename _\bB_\bo_\bo_\bl_\bL_\bi_\bs_\bt_\b:_\b:_\bi_\bt_\be_\br_\ba_\bt_\bo_\br BoolIterator;\n+200\n+202 typedef typename _\bB_\bo_\bo_\bl_\bL_\bi_\bs_\bt_\b:_\b:_\bM_\bo_\bd_\bi_\bf_\by_\bI_\bt_\be_\br_\ba_\bt_\bo_\br BoolListModifier;\n+203\n+205 typedef std::map BoolMap;\n+206\n+211 BoolMap oldMap_;\n+212\n+214 std::map infoSend_;\n+215\n+217 typedef typename _\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\bi_\bc_\be_\bs_\b:_\b:_\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\be_\bx_\bL_\bi_\bs_\bt RemoteIndexList;\n+218\n+220 typedef typename _\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\be_\bx_\bL_\bi_\bs_\bt_\b:_\b:_\bM_\bo_\bd_\bi_\bf_\by_\bI_\bt_\be_\br_\ba_\bt_\bo_\br RemoteIndexModifier;\n+221\n+223 typedef _\bD_\bu_\bn_\be_\b:_\b:_\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\be_\bx_\b<_\bG_\bl_\bo_\bb_\ba_\bl_\bI_\bn_\bd_\be_\bx_\b,_\bA_\bt_\bt_\br_\bi_\bb_\bu_\bt_\be_\b> _\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\be_\bx;\n+224\n+226 typedef typename _\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\be_\bx_\bL_\bi_\bs_\bt_\b:_\b:_\bi_\bt_\be_\br_\ba_\bt_\bo_\br RemoteIndexIterator;\n+227\n+229 typedef typename _\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\be_\bx_\bL_\bi_\bs_\bt_\b:_\b:_\bc_\bo_\bn_\bs_\bt_\b__\bi_\bt_\be_\br_\ba_\bt_\bo_\br ConstRemoteIndexIterator;\n+230\n+232 typedef std::\n+tuple IteratorTuple;\n+234\n+242 class Iterators\n+243 {\n+244 friend class _\bI_\bn_\bd_\bi_\bc_\be_\bs_\bS_\by_\bn_\bc_\be_\br;\n+245 public:\n+255 _\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bs(RemoteIndexList& remoteIndices, GlobalIndexList& globalIndices,\n+256 BoolList& booleans);\n+257\n+261 _\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bs();\n+262\n+266 _\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bs& _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b+_\b+();\n 267\n-268 template\n-_\b2_\b6_\b9 inline void _\bS_\be_\bl_\be_\bc_\bt_\bi_\bo_\bn_\b<_\bT_\bS_\b,_\bT_\bG_\b,_\bT_\bL_\b,_\bN_\b>_\b:_\b:_\bs_\be_\bt_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt(const _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt&\n-indexset)\n-270 {\n-271 if(built_)\n-272 free();\n-273\n-274 // Count the number of entries the selection has to hold\n-275 typedef typename _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt_\b:_\b:_\bc_\bo_\bn_\bs_\bt_\b__\bi_\bt_\be_\br_\ba_\bt_\bo_\br _\bc_\bo_\bn_\bs_\bt_\b__\bi_\bt_\be_\br_\ba_\bt_\bo_\br;\n-276 const _\bc_\bo_\bn_\bs_\bt_\b__\bi_\bt_\be_\br_\ba_\bt_\bo_\br end = indexset._\be_\bn_\bd();\n-277 int entries = 0;\n-278\n-279 for(_\bc_\bo_\bn_\bs_\bt_\b__\bi_\bt_\be_\br_\ba_\bt_\bo_\br index = indexset._\bb_\be_\bg_\bi_\bn(); index != end; ++index)\n-280 if(AttributeSet::contains(index->local().attribute()))\n-281 ++entries;\n-282\n-283 selected_ = new uint32_t[entries];\n-284 built_ = true;\n-285\n-286 entries = 0;\n-287 for(_\bc_\bo_\bn_\bs_\bt_\b__\bi_\bt_\be_\br_\ba_\bt_\bo_\br index = indexset._\bb_\be_\bg_\bi_\bn(); index != end; ++index)\n-288 if(AttributeSet::contains(index->local().attribute()))\n-289 selected_[entries++]= index->local().local();\n-290\n-291 size_=entries;\n-292 built_=true;\n-293 }\n-294\n-295 template\n-_\b2_\b9_\b6 uint32_t* _\bS_\be_\bl_\be_\bc_\bt_\bi_\bo_\bn_\b<_\bT_\bS_\b,_\bT_\bG_\b,_\bT_\bL_\b,_\bN_\b>_\b:_\b:_\bb_\be_\bg_\bi_\bn() const\n-297 {\n-298 return selected_;\n-299 }\n-300\n-301 template\n-_\b3_\b0_\b2 uint32_t* _\bS_\be_\bl_\be_\bc_\bt_\bi_\bo_\bn_\b<_\bT_\bS_\b,_\bT_\bG_\b,_\bT_\bL_\b,_\bN_\b>_\b:_\b:_\be_\bn_\bd() const\n-303 {\n-304 return selected_+size_;\n-305 }\n-306\n-307 template\n-_\b3_\b0_\b8 inline void _\bS_\be_\bl_\be_\bc_\bt_\bi_\bo_\bn_\b<_\bT_\bS_\b,_\bT_\bG_\b,_\bT_\bL_\b,_\bN_\b>_\b:_\b:_\bf_\br_\be_\be()\n-309 {\n-310 delete[] selected_;\n-311 size_=0;\n-312 built_=false;\n-313 }\n-314\n-315 template\n-_\b3_\b1_\b6 inline _\bS_\be_\bl_\be_\bc_\bt_\bi_\bo_\bn_\b<_\bT_\bS_\b,_\bT_\bG_\b,_\bT_\bL_\b,_\bN_\b>_\b:_\b:_\b~_\bS_\be_\bl_\be_\bc_\bt_\bi_\bo_\bn()\n-317 {\n-318 if(built_)\n-319 free();\n-320 }\n-321\n-322 template\n-_\b3_\b2_\b3 _\bS_\be_\bl_\be_\bc_\bt_\bi_\bo_\bn_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b<_\bT_\bS_\b,_\bT_\bG_\b,_\bT_\bL_\b,_\bN_\b> _\bU_\bn_\bc_\ba_\bc_\bh_\be_\bd_\bS_\be_\bl_\be_\bc_\bt_\bi_\bo_\bn_\b<_\bT_\bS_\b,_\bT_\bG_\b,_\bT_\bL_\b,_\bN_\b>_\b:_\b:_\bb_\be_\bg_\bi_\bn() const\n-324 {\n-325 return _\bS_\be_\bl_\be_\bc_\bt_\bi_\bo_\bn_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b<_\bT_\bS_\b,_\bT_\bG_\b,_\bT_\bL_\b,_\bN_\b>(indexSet_->begin(),\n-326 indexSet_->end());\n-327 }\n-328\n-329 template\n-_\b3_\b3_\b0 _\bS_\be_\bl_\be_\bc_\bt_\bi_\bo_\bn_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b<_\bT_\bS_\b,_\bT_\bG_\b,_\bT_\bL_\b,_\bN_\b> _\bU_\bn_\bc_\ba_\bc_\bh_\be_\bd_\bS_\be_\bl_\be_\bc_\bt_\bi_\bo_\bn_\b<_\bT_\bS_\b,_\bT_\bG_\b,_\bT_\bL_\b,_\bN_\b>_\b:_\b:_\be_\bn_\bd() const\n-331 {\n-332 return _\bS_\be_\bl_\be_\bc_\bt_\bi_\bo_\bn_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b<_\bT_\bS_\b,_\bT_\bG_\b,_\bT_\bL_\b,_\bN_\b>(indexSet_->end(),\n-333 indexSet_->end());\n-334 }\n-335 template\n-_\b3_\b3_\b6 void _\bU_\bn_\bc_\ba_\bc_\bh_\be_\bd_\bS_\be_\bl_\be_\bc_\bt_\bi_\bo_\bn_\b<_\bT_\bS_\b,_\bT_\bG_\b,_\bT_\bL_\b,_\bN_\b>_\b:_\b:_\bs_\be_\bt_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt(const _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt&\n-indexset)\n-337 {\n-338 indexSet_ = &indexset;\n-339 }\n-340\n-344}\n-345#endif // DUNE_COMMON_PARALLEL_SELECTION_HH\n+273 void _\bi_\bn_\bs_\be_\br_\bt(const _\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\be_\bx& index,\n+274 const std::pair& global);\n+275\n+280 _\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\be_\bx& _\br_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\be_\bx() const;\n+281\n+286 std::pair& _\bg_\bl_\bo_\bb_\ba_\bl_\bI_\bn_\bd_\be_\bx_\bP_\ba_\bi_\br() const;\n+287\n+_\b2_\b8_\b8 _\bA_\bt_\bt_\br_\bi_\bb_\bu_\bt_\be& _\ba_\bt_\bt_\br_\bi_\bb_\bu_\bt_\be() const;\n+289\n+295 bool _\bi_\bs_\bO_\bl_\bd() const;\n+296\n+306 void _\br_\be_\bs_\be_\bt(_\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\be_\bx_\bL_\bi_\bs_\bt& remoteIndices, _\bG_\bl_\bo_\bb_\ba_\bl_\bI_\bn_\bd_\be_\bx_\bL_\bi_\bs_\bt& globalIndices,\n+307 _\bB_\bo_\bo_\bl_\bL_\bi_\bs_\bt& booleans);\n+308\n+314 bool _\bi_\bs_\bN_\bo_\bt_\bA_\bt_\bE_\bn_\bd() const;\n+315\n+321 bool _\bi_\bs_\bA_\bt_\bE_\bn_\bd() const;\n+322\n+323 private:\n+333 IteratorTuple iterators_;\n+334 };\n+335\n+337 typedef std::map IteratorsMap;\n+338\n+350 IteratorsMap iteratorsMap_;\n+351\n+353 void calculateMessageSizes();\n+354\n+362 void packAndSend(int destination, char* buffer, std::size_t bufferSize,\n+MPI_Request& req);\n+363\n+370 template\n+371 void recvAndUnpack(T1& numberer, int hardSource, bool useHardSource);\n+372\n+376 void registerMessageDatatype();\n+377\n+381 void insertIntoRemoteIndexList(int process,\n+382 const std::pair& global,\n+383 char attribute);\n+384\n+388 void resetIteratorsMap();\n+389\n+394 bool checkReset();\n+395\n+404 bool checkReset(const Iterators& iterators, _\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\be_\bx_\bL_\bi_\bs_\bt& rlist,\n+_\bG_\bl_\bo_\bb_\ba_\bl_\bI_\bn_\bd_\be_\bx_\bL_\bi_\bs_\bt& gList,\n+405 _\bB_\bo_\bo_\bl_\bL_\bi_\bs_\bt& bList);\n+406 };\n+407\n+408 template\n+_\b4_\b0_\b9 bool _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b<(const _\bI_\bn_\bd_\be_\bx_\bP_\ba_\bi_\br >& i1,\n+410 const std::pair& i2)\n+411 {\n+412 return i1.global() < i2.first ||\n+413 (i1.global() == i2.first && i1.local().attribute()\n+_\b4_\b1_\b7 bool _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b<(const std::pair& i1,\n+418 const _\bI_\bn_\bd_\be_\bx_\bP_\ba_\bi_\br >& i2)\n+419 {\n+420 return i1.first < i2.global() ||\n+421 (i1.first == i2.global() && i1.second\n+_\b4_\b2_\b5 bool _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b=_\b=(const _\bI_\bn_\bd_\be_\bx_\bP_\ba_\bi_\br >& i1,\n+426 const std::pair& i2)\n+427 {\n+428 return (i1.global() == i2.first && i1.local().attribute()==i2.second);\n+429 }\n+430\n+431 template\n+_\b4_\b3_\b2 bool _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b!_\b=(const _\bI_\bn_\bd_\be_\bx_\bP_\ba_\bi_\br >& i1,\n+433 const std::pair& i2)\n+434 {\n+435 return (i1.global() != i2.first || i1.local().attribute()!=i2.second);\n+436 }\n+437\n+438 template\n+_\b4_\b3_\b9 bool _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b=_\b=(const std::pair& i2,\n+440 const _\bI_\bn_\bd_\be_\bx_\bP_\ba_\bi_\br >& i1)\n+441 {\n+442 return (i1.global() == i2.first && i1.local().attribute()==i2.second);\n+443 }\n+444\n+445 template\n+_\b4_\b4_\b6 bool _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b!_\b=(const std::pair& i2,\n+447 const _\bI_\bn_\bd_\be_\bx_\bP_\ba_\bi_\br >& i1)\n+448 {\n+449 return (i1.global() != i2.first || i1.local().attribute()!=i2.second);\n+450 }\n+451\n+468 template\n+_\b4_\b6_\b9 void _\bs_\bt_\bo_\br_\be_\bG_\bl_\bo_\bb_\ba_\bl_\bI_\bn_\bd_\bi_\bc_\be_\bs_\bO_\bf_\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\bi_\bc_\be_\bs(std::map,A> >&\n+globalMap,\n+470 const _\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\bi_\bc_\be_\bs_\b<_\bT_\b,_\bA_\b1_\b>& remoteIndices)\n+471 {\n+472 for(auto remote = remoteIndices._\bb_\be_\bg_\bi_\bn(), end =remoteIndices._\be_\bn_\bd(); remote\n+!= end; ++remote) {\n+473 typedef typename _\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\bi_\bc_\be_\bs_\b<_\bT_\b,_\bA_\b1_\b>_\b:_\b:_\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\be_\bx_\bL_\bi_\bs_\bt RemoteIndexList;\n+474 typedef _\bS_\bL_\bL_\bi_\bs_\bt_\b<_\bs_\bt_\bd_\b:_\b:_\bp_\ba_\bi_\br_\b<_\bt_\by_\bp_\be_\bn_\ba_\bm_\be_\b _\bT_\b:_\b:_\bG_\bl_\bo_\bb_\ba_\bl_\bI_\bn_\bd_\be_\bx_\b,_\b _\bt_\by_\bp_\be_\bn_\ba_\bm_\be_\b _\bT_\b:_\b:_\bL_\bo_\bc_\ba_\bl_\bI_\bn_\bd_\be_\bx_\b:_\b:\n+_\bA_\bt_\bt_\br_\bi_\bb_\bu_\bt_\be_\b>,A> GlobalIndexList;\n+475 GlobalIndexList& global = globalMap[remote->first];\n+476 RemoteIndexList& rList = *(remote->second.first);\n+477\n+478 for(auto index = rList.begin(), riEnd = rList.end();\n+479 index != riEnd; ++index) {\n+480 global._\bp_\bu_\bs_\bh_\b__\bb_\ba_\bc_\bk(std::make_pair(index->localIndexPair().global(),\n+481 index->localIndexPair().local().attribute()));\n+482 }\n+483 }\n+484 }\n+485\n+494 template\n+_\b4_\b9_\b5 inline void _\br_\be_\bp_\ba_\bi_\br_\bL_\bo_\bc_\ba_\bl_\bI_\bn_\bd_\be_\bx_\bP_\bo_\bi_\bn_\bt_\be_\br_\bs(std::map,A> >& globalMap,\n+498 _\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\bi_\bc_\be_\bs_\b<_\bT_\b,_\bA_\b1_\b>& remoteIndices,\n+499 const T& indexSet)\n+500 {\n+501 assert(globalMap.size()==static_cast(remoteIndices._\bn_\be_\bi_\bg_\bh_\bb_\bo_\bu_\br_\bs\n+()));\n+502 // Repair pointers to index set in remote indices.\n+503 auto global = globalMap.begin();\n+504 auto end = remoteIndices.remoteIndices_.end();\n+505\n+506 for(auto remote = remoteIndices.remoteIndices_.begin(); remote != end;\n+++remote, ++global) {\n+507 assert(remote->first==global->first);\n+508 assert(remote->second.first->size() == global->second.size());\n+509\n+510 auto riEnd = remote->second.first->end();\n+511 auto rIndex = remote->second.first->begin();\n+512 auto gIndex = global->second.begin();\n+513 auto index = indexSet.begin();\n+514\n+515 assert(rIndex==riEnd || gIndex != global->second.end());\n+516 while(rIndex != riEnd) {\n+517 // Search for the index in the set.\n+518 assert(gIndex != global->second.end());\n+519\n+520 while(!(index->global() == gIndex->first\n+521 && index->local().attribute() == gIndex->second)) {\n+522 ++index;\n+523 // this is only needed for ALU, where there may exist\n+524 // more entries with the same global index in the remote index set\n+525 // than in the index set\n+526 if (index->global() > gIndex->first) {\n+527 index=indexSet.begin();\n+528 }\n+529 }\n+530\n+531 assert(index != indexSet.end() && *index == *gIndex);\n+532\n+533 rIndex->localIndex_ = &(*index);\n+534 ++index;\n+535 ++rIndex;\n+536 ++gIndex;\n+537 }\n+538 }\n+539 remoteIndices.sourceSeqNo_ = remoteIndices.source_->_\bs_\be_\bq_\bN_\bo();\n+540 remoteIndices.destSeqNo_ = remoteIndices.target_->_\bs_\be_\bq_\bN_\bo();\n+541 }\n+542\n+543 template\n+_\b5_\b4_\b4 _\bI_\bn_\bd_\bi_\bc_\be_\bs_\bS_\by_\bn_\bc_\be_\br_\b<_\bT_\b>_\b:_\b:_\bI_\bn_\bd_\bi_\bc_\be_\bs_\bS_\by_\bn_\bc_\be_\br(_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt& indexSet,\n+545 _\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\bi_\bc_\be_\bs& remoteIndices)\n+546 : indexSet_(indexSet), remoteIndices_(remoteIndices)\n+547 {\n+548 // index sets must match.\n+549 assert(remoteIndices.source_ == remoteIndices.target_);\n+550 assert(remoteIndices.source_ == &indexSet);\n+551 MPI_Comm_rank(remoteIndices_._\bc_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bo_\br(), &rank_);\n+552 }\n+553\n+554 template\n+_\b5_\b5_\b5 _\bI_\bn_\bd_\bi_\bc_\be_\bs_\bS_\by_\bn_\bc_\be_\br_\b<_\bT_\b>_\b:_\b:_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bs_\b:_\b:_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bs(_\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\be_\bx_\bL_\bi_\bs_\bt& remoteIndices,\n+556 _\bG_\bl_\bo_\bb_\ba_\bl_\bI_\bn_\bd_\be_\bx_\bL_\bi_\bs_\bt& globalIndices,\n+557 _\bB_\bo_\bo_\bl_\bL_\bi_\bs_\bt& booleans)\n+558 : iterators_(remoteIndices.beginModify(), globalIndices.beginModify(),\n+559 booleans.beginModify(), remoteIndices.end())\n+560 { }\n+561\n+562 template\n+_\b5_\b6_\b3 _\bI_\bn_\bd_\bi_\bc_\be_\bs_\bS_\by_\bn_\bc_\be_\br_\b<_\bT_\b>_\b:_\b:_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bs_\b:_\b:_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bs()\n+564 : iterators_()\n+565 {}\n+566\n+567 template\n+_\b5_\b6_\b8 inline typename _\bI_\bn_\bd_\bi_\bc_\be_\bs_\bS_\by_\bn_\bc_\be_\br_\b<_\bT_\b>_\b:_\b:_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bs& _\bI_\bn_\bd_\bi_\bc_\be_\bs_\bS_\by_\bn_\bc_\be_\br_\b<_\bT_\b>_\b:_\b:_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bs_\b:_\b:\n+_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b+_\b+()\n+569 {\n+570 ++(std::get<0>(iterators_));\n+571 ++(std::get<1>(iterators_));\n+572 ++(std::get<2>(iterators_));\n+573 return *this;\n+574 }\n+575\n+576 template\n+_\b5_\b7_\b7 inline void _\bI_\bn_\bd_\bi_\bc_\be_\bs_\bS_\by_\bn_\bc_\be_\br_\b<_\bT_\b>_\b:_\b:_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bs_\b:_\b:_\bi_\bn_\bs_\be_\br_\bt(const _\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\be_\bx & index,\n+578 const std::pair& global)\n+579 {\n+580 std::get<0>(iterators_).insert(index);\n+581 std::get<1>(iterators_).insert(global);\n+582 std::get<2>(iterators_).insert(false);\n+583 }\n+584\n+585 template\n+586 inline typename _\bI_\bn_\bd_\bi_\bc_\be_\bs_\bS_\by_\bn_\bc_\be_\br_\b<_\bT_\b>_\b:_\b:_\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\be_\bx&\n+_\b5_\b8_\b7 _\bI_\bn_\bd_\bi_\bc_\be_\bs_\bS_\by_\bn_\bc_\be_\br_\b<_\bT_\b>_\b:_\b:_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bs_\b:_\b:_\br_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\be_\bx() const\n+588 {\n+589 return *(std::get<0>(iterators_));\n+590 }\n+591\n+592 template\n+593 inline std::pair::GlobalIndex,typename\n+_\bI_\bn_\bd_\bi_\bc_\be_\bs_\bS_\by_\bn_\bc_\be_\br_\b<_\bT_\b>_\b:_\b:_\bA_\bt_\bt_\br_\bi_\bb_\bu_\bt_\be>&\n+_\b5_\b9_\b4 _\bI_\bn_\bd_\bi_\bc_\be_\bs_\bS_\by_\bn_\bc_\be_\br_\b<_\bT_\b>_\b:_\b:_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bs_\b:_\b:_\bg_\bl_\bo_\bb_\ba_\bl_\bI_\bn_\bd_\be_\bx_\bP_\ba_\bi_\br() const\n+595 {\n+596 return *(std::get<1>(iterators_));\n+597 }\n+598\n+599 template\n+_\b6_\b0_\b0 inline bool _\bI_\bn_\bd_\bi_\bc_\be_\bs_\bS_\by_\bn_\bc_\be_\br_\b<_\bT_\b>_\b:_\b:_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bs_\b:_\b:_\bi_\bs_\bO_\bl_\bd() const\n+601 {\n+602 return *(std::get<2>(iterators_));\n+603 }\n+604\n+605 template\n+_\b6_\b0_\b6 inline void _\bI_\bn_\bd_\bi_\bc_\be_\bs_\bS_\by_\bn_\bc_\be_\br_\b<_\bT_\b>_\b:_\b:_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bs_\b:_\b:_\br_\be_\bs_\be_\bt(_\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\be_\bx_\bL_\bi_\bs_\bt&\n+remoteIndices,\n+607 _\bG_\bl_\bo_\bb_\ba_\bl_\bI_\bn_\bd_\be_\bx_\bL_\bi_\bs_\bt& globalIndices,\n+608 _\bB_\bo_\bo_\bl_\bL_\bi_\bs_\bt& booleans)\n+609 {\n+610 std::get<0>(iterators_) = remoteIndices._\bb_\be_\bg_\bi_\bn_\bM_\bo_\bd_\bi_\bf_\by();\n+611 std::get<1>(iterators_) = globalIndices._\bb_\be_\bg_\bi_\bn_\bM_\bo_\bd_\bi_\bf_\by();\n+612 std::get<2>(iterators_) = booleans._\bb_\be_\bg_\bi_\bn_\bM_\bo_\bd_\bi_\bf_\by();\n+613 }\n+614\n+615 template\n+_\b6_\b1_\b6 inline bool _\bI_\bn_\bd_\bi_\bc_\be_\bs_\bS_\by_\bn_\bc_\be_\br_\b<_\bT_\b>_\b:_\b:_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bs_\b:_\b:_\bi_\bs_\bN_\bo_\bt_\bA_\bt_\bE_\bn_\bd() const\n+617 {\n+618 return std::get<0>(iterators_) != std::get<3>(iterators_);\n+619 }\n+620\n+621 template\n+_\b6_\b2_\b2 inline bool _\bI_\bn_\bd_\bi_\bc_\be_\bs_\bS_\by_\bn_\bc_\be_\br_\b<_\bT_\b>_\b:_\b:_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bs_\b:_\b:_\bi_\bs_\bA_\bt_\bE_\bn_\bd() const\n+623 {\n+624 return std::get<0>(iterators_) == std::get<3>(iterators_);\n+625 }\n+626\n+627 template\n+628 void _\bI_\bn_\bd_\bi_\bc_\be_\bs_\bS_\by_\bn_\bc_\be_\br_\b<_\bT_\b>_\b:_\b:_\br_\be_\bg_\bi_\bs_\bt_\be_\br_\bM_\be_\bs_\bs_\ba_\bg_\be_\bD_\ba_\bt_\ba_\bt_\by_\bp_\be()\n+629 {\n+630 MPI_Datatype type[2] = {MPI_INT, MPI_INT};\n+631 int blocklength[2] = {1,1};\n+632 MPI_Aint displacement[2];\n+633 MPI_Aint base;\n+634\n+635 // Compute displacement\n+636 MessageInformation message;\n+637\n+638 MPI_Get_address( &(message.publish), displacement);\n+639 MPI_Get_address( &(message.pairs), displacement+1);\n+640\n+641 // Make the displacement relative\n+642 MPI_Get_address(&message, &base);\n+643 displacement[0] -= base;\n+644 displacement[1] -= base;\n+645\n+646 MPI_Type_create_struct( 2, blocklength, displacement, type, &datatype_);\n+647 MPI_Type_commit(&datatype_);\n+648 }\n+649\n+650 template\n+651 void IndicesSyncer::calculateMessageSizes()\n+652 {\n+653 auto iEnd = indexSet_.end();\n+654 auto collIter = remoteIndices_.template iterator();\n+655\n+656 for(auto index = indexSet_.begin(); index != iEnd; ++index) {\n+657 collIter.advance(index->global(), index->local().attribute());\n+658 if(collIter.empty())\n+659 break;\n+660 int knownRemote=0;\n+661 auto end = collIter.end();\n+662\n+663 // Count the remote indices we know.\n+664 for(auto valid = collIter.begin(); valid != end; ++valid) {\n+665 ++knownRemote;\n+666 }\n+667\n+668 if(knownRemote>0) {\n+669 _\bD_\bu_\bn_\be_\b:_\b:_\bd_\bv_\be_\br_\bb<global()<< \" for processes \";\n+670\n+671 // Update MessageInformation\n+672 for(auto valid = collIter.begin(); valid != end; ++valid) {\n+673 ++(infoSend_[valid.process()].publish);\n+674 (infoSend_[valid.process()].pairs) += knownRemote;\n+675 _\bD_\bu_\bn_\be_\b:_\b:_\bd_\bv_\be_\br_\bb<first==remote->first) {\n+697 // We want to send message information to that process\n+698 message = const_cast(&(messageIter->second));\n+699 ++messageIter;\n+700 }else\n+701 // We do not want to send information but the other process might.\n+702 message = &dummy;\n+703\n+704 sendBufferSizes_[neighbour]=0;\n+705 int tsize;\n+706 // The number of indices published\n+707 MPI_Pack_size(1, MPI_INT,remoteIndices_._\bc_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bo_\br(), &tsize);\n+708 sendBufferSizes_[neighbour] += tsize;\n+709\n+710 for(int i=0; i < message->publish; ++i) {\n+711 // The global index\n+712 MPI_Pack_size(1, _\bM_\bP_\bI_\bT_\br_\ba_\bi_\bt_\bs_\b<_\bG_\bl_\bo_\bb_\ba_\bl_\bI_\bn_\bd_\be_\bx_\b>_\b:_\b:_\bg_\be_\bt_\bT_\by_\bp_\be(),\n+remoteIndices_._\bc_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bo_\br(), &tsize);\n+713 sendBufferSizes_[neighbour] += tsize;\n+714 // The attribute in the local index\n+715 MPI_Pack_size(1, MPI_CHAR, remoteIndices_._\bc_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bo_\br(), &tsize);\n+716 sendBufferSizes_[neighbour] += tsize;\n+717 // The number of corresponding remote indices\n+718 MPI_Pack_size(1, MPI_INT, remoteIndices_._\bc_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bo_\br(), &tsize);\n+719 sendBufferSizes_[neighbour] += tsize;\n+720 }\n+721 for(int i=0; i < message->pairs; ++i) {\n+722 // The process of the remote index\n+723 MPI_Pack_size(1, MPI_INT, remoteIndices_._\bc_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bo_\br(), &tsize);\n+724 sendBufferSizes_[neighbour] += tsize;\n+725 // The attribute of the remote index\n+726 MPI_Pack_size(1, MPI_CHAR, remoteIndices_._\bc_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bo_\br(), &tsize);\n+727 sendBufferSizes_[neighbour] += tsize;\n+728 }\n+729\n+730 _\bD_\bu_\bn_\be_\b:_\b:_\bd_\bv_\be_\br_\bb<first<<\") size is \"<<\n+sendBufferSizes_[neighbour]<<\" for publish=\"<publish<<\"\n+pairs=\"<pairs<\n+_\b7_\b3_\b6 inline void _\bI_\bn_\bd_\bi_\bc_\be_\bs_\bS_\by_\bn_\bc_\be_\br_\b<_\bT_\b>_\b:_\b:_\bs_\by_\bn_\bc()\n+737 {\n+738 DefaultNumberer numberer;\n+739 _\bs_\by_\bn_\bc(numberer);\n+740 }\n+741\n+742 template\n+743 template\n+_\b7_\b4_\b4 void _\bI_\bn_\bd_\bi_\bc_\be_\bs_\bS_\by_\bn_\bc_\be_\br_\b<_\bT_\b>_\b:_\b:_\bs_\by_\bn_\bc(T1& numberer, bool useFixedOrder)\n+745 {\n+746 // The pointers to the local indices in the remote indices\n+747 // will become invalid due to the resorting of the index set.\n+748 // Therefore store the corresponding global indices.\n+749 // Mark all indices as not added\n+750 const auto end = remoteIndices_._\be_\bn_\bd();\n+751\n+752 // Number of neighbours might change during the syncing.\n+753 // save the old neighbours\n+754 std::size_t noOldNeighbours = remoteIndices_._\bn_\be_\bi_\bg_\bh_\bb_\bo_\bu_\br_\bs();\n+755 int* oldNeighbours = new int[noOldNeighbours];\n+756 sendBufferSizes_ = new std::size_t[noOldNeighbours];\n+757 std::size_t neighbourI = 0;\n+758\n+759 for(auto remote = remoteIndices_._\bb_\be_\bg_\bi_\bn(); remote != end; ++remote,\n+++neighbourI) {\n+760 oldNeighbours[neighbourI] = remote->first;\n+761\n+762 // Make sure we only have one remote index list.\n+763 assert(remote->second.first==remote->second.second);\n+764\n+765 _\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\be_\bx_\bL_\bi_\bs_\bt& rList = *(remote->second.first);\n+766\n+767 // Store the corresponding global indices.\n+768 _\bG_\bl_\bo_\bb_\ba_\bl_\bI_\bn_\bd_\be_\bx_\bL_\bi_\bs_\bt& global = globalMap_[remote->first];\n+769 _\bB_\bo_\bo_\bl_\bL_\bi_\bs_\bt& added = oldMap_[remote->first];\n+770 auto riEnd = rList._\be_\bn_\bd();\n+771\n+772 for(auto index = rList._\bb_\be_\bg_\bi_\bn();\n+773 index != riEnd; ++index) {\n+774 global._\bp_\bu_\bs_\bh_\b__\bb_\ba_\bc_\bk(std::make_pair(index->localIndexPair().global(),\n+775 index->localIndexPair().local().attribute()));\n+776 added._\bp_\bu_\bs_\bh_\b__\bb_\ba_\bc_\bk(true);\n+777 }\n+778\n+779 Iterators iterators(rList, global, added);\n+780 iteratorsMap_.insert(std::make_pair(remote->first, iterators));\n+781 assert(checkReset(iteratorsMap_[remote->first], rList,global,added));\n+782 }\n+783\n+784 // Exchange indices with each neighbour\n+785 calculateMessageSizes();\n+786\n+787 // Allocate the buffers\n+788 receiveBufferSize_=1;\n+789 sendBuffers_ = new char*[noOldNeighbours];\n+790\n+791 for(std::size_t i=0; i\n+(sendBufferSizes_[i]));\n+794 }\n+795\n+796 receiveBuffer_=new char[receiveBufferSize_];\n+797\n+798 indexSet_.beginResize();\n+799\n+800 _\bD_\bu_\bn_\be_\b:_\b:_\bd_\bv_\be_\br_\bb<\n+860 void _\bI_\bn_\bd_\bi_\bc_\be_\bs_\bS_\by_\bn_\bc_\be_\br_\b<_\bT_\b>_\b:_\b:_\bp_\ba_\bc_\bk_\bA_\bn_\bd_\bS_\be_\bn_\bd(int destination, char* buffer, std::\n+size_t bufferSize, MPI_Request& request)\n+861 {\n+862 auto iEnd = indexSet_.end();\n+863 int bpos = 0;\n+864 int published = 0;\n+865 int pairs = 0;\n+866\n+867 assert(checkReset());\n+868\n+869 // Pack the number of indices we publish\n+870 MPI_Pack(&(infoSend_[destination].publish), 1, MPI_INT, buffer, bufferSize,\n+&bpos,\n+871 remoteIndices_._\bc_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bo_\br());\n+872\n+873 for(auto index = indexSet_.begin(); index != iEnd; ++index) {\n+874 // Search for corresponding remote indices in all iterator tuples\n+875 auto iteratorsEnd = iteratorsMap_.end();\n+876\n+877 // advance all iterators to a position with global index >= index->global()\n+878 for(auto iterators = iteratorsMap_.begin(); iteratorsEnd != iterators;\n+++iterators) {\n+879 while(iterators->second.isNotAtEnd() &&\n+880 iterators->second.globalIndexPair().first < index->global())\n+881 ++(iterators->second);\n+882 assert(!iterators->second.isNotAtEnd() || iterators->second.globalIndexPair\n+().first >= index->global());\n+883 }\n+884\n+885 // Add all remote indices positioned at global which were already present\n+before calling sync\n+886 // to the message.\n+887 // Count how many remote indices we will send\n+888 int indices = 0;\n+889 bool knownRemote = false; // Is the remote process supposed to know this\n+index?\n+890\n+891 for(auto iterators = iteratorsMap_.begin(); iteratorsEnd != iterators;\n+++iterators)\n+892 {\n+893 std::pair p;\n+894 if (iterators->second.isNotAtEnd())\n+895 {\n+896 p = iterators->second.globalIndexPair();\n+897 }\n+898\n+899 if(iterators->second.isNotAtEnd() && iterators->second.isOld()\n+900 && iterators->second.globalIndexPair().first == index->global()) {\n+901 indices++;\n+902 if(destination == iterators->first)\n+903 knownRemote = true;\n+904 }\n+905 }\n+906\n+907 if(!knownRemote)\n+908 // We do not need to send any indices\n+909 continue;\n+910\n+911 _\bD_\bu_\bn_\be_\b:_\b:_\bd_\bv_\be_\br_\bb<global\n+()<<\" to \"<(&(index->global())), 1,\n+_\bM_\bP_\bI_\bT_\br_\ba_\bi_\bt_\bs_\b<_\bG_\bl_\bo_\bb_\ba_\bl_\bI_\bn_\bd_\be_\bx_\b>_\b:_\b:_\bg_\be_\bt_\bT_\by_\bp_\be(), buffer, bufferSize, &bpos,\n+916 remoteIndices_._\bc_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bo_\br());\n+917\n+918 char attr = index->local().attribute();\n+919 MPI_Pack(&attr, 1, MPI_CHAR, buffer, bufferSize, &bpos,\n+920 remoteIndices_._\bc_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bo_\br());\n+921\n+922 // Pack the number of remote indices we send.\n+923 MPI_Pack(&indices, 1, MPI_INT, buffer, bufferSize, &bpos,\n+924 remoteIndices_._\bc_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bo_\br());\n+925\n+926 // Pack the information about the remote indices\n+927 for(auto iterators = iteratorsMap_.begin(); iteratorsEnd != iterators;\n+++iterators)\n+928 if(iterators->second.isNotAtEnd() && iterators->second.isOld()\n+929 && iterators->second.globalIndexPair().first == index->global()) {\n+930 int process = iterators->first;\n+931\n+932 ++pairs;\n+933 assert(pairs <= infoSend_[destination].pairs);\n+934 MPI_Pack(&process, 1, MPI_INT, buffer, bufferSize, &bpos,\n+935 remoteIndices_._\bc_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bo_\br());\n+936 char attr2 = iterators->second.remoteIndex().attribute();\n+937\n+938 MPI_Pack(&attr2, 1, MPI_CHAR, buffer, bufferSize, &bpos,\n+939 remoteIndices_._\bc_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bo_\br());\n+940 --indices;\n+941 }\n+942 assert(indices==0);\n+943 ++published;\n+944 _\bD_\bu_\bn_\be_\b:_\b:_\bd_\bv_\bv_\be_\br_\bb<<\" (publish=\"<\n+959 inline void IndicesSyncer::insertIntoRemoteIndexList(int process,\n+960 const std::pair& globalPair,\n+961 char attribute)\n+962 {\n+963 _\bD_\bu_\bn_\be_\b:_\b:_\bd_\bv_\be_\br_\bb<<\"Inserting from \"<second;\n+980\n+981 // Search for the remote index\n+982 while(iterators.isNotAtEnd() && iterators.globalIndexPair() < globalPair) {\n+983 // Increment all iterators\n+984 ++iterators;\n+985\n+986 }\n+987\n+988 if(iterators.isAtEnd() || iterators.globalIndexPair() != globalPair) {\n+989 // The entry is not yet known\n+990 // Insert in the list and do not change the first iterator.\n+991 iterators.insert(RemoteIndex(_\bA_\bt_\bt_\br_\bi_\bb_\bu_\bt_\be(attribute)),globalPair);\n+992 return;\n+993 }\n+994\n+995 // Global indices match\n+996 bool indexIsThere=false;\n+997 for(Iterators tmpIterators = iterators;\n+998 !tmpIterators.isAtEnd() && tmpIterators.globalIndexPair() == globalPair;\n+999 ++tmpIterators)\n+1000 //entry already exists with the same attribute\n+1001 if(tmpIterators.globalIndexPair().second == attribute) {\n+1002 indexIsThere=true;\n+1003 break;\n+1004 }\n+1005\n+1006 if(!indexIsThere)\n+1007 // The entry is not yet known\n+1008 // Insert in the list and do not change the first iterator.\n+1009 iterators.insert(RemoteIndex(_\bA_\bt_\bt_\br_\bi_\bb_\bu_\bt_\be(attribute)),globalPair);\n+1010 }\n+1011\n+1012 template\n+1013 template\n+1014 void IndicesSyncer::recvAndUnpack(T1& numberer, int hardSource, bool\n+useHardSource)\n+1015 {\n+1016 const _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt& constIndexSet = indexSet_;\n+1017 auto iEnd = constIndexSet.end();\n+1018 auto index = constIndexSet.begin();\n+1019 int bpos = 0;\n+1020 int publish;\n+1021\n+1022 assert(checkReset());\n+1023\n+1024 MPI_Status status;\n+1025\n+1026 // We have to determine the message size and source before the receive\n+1027\n+1028 MPI_Probe(useHardSource ? hardSource : MPI_ANY_SOURCE, 345,\n+remoteIndices_.communicator(), &status);\n+1029\n+1030 int source=status.MPI_SOURCE;\n+1031 int count;\n+1032 MPI_Get_count(&status, MPI_PACKED, &count);\n+1033\n+1034 _\bD_\bu_\bn_\be_\b:_\b:_\bd_\bv_\bv_\be_\br_\bb<receiveBufferSize_) {\n+1037 receiveBufferSize_=count;\n+1038 delete[] receiveBuffer_;\n+1039 receiveBuffer_ = new char[receiveBufferSize_];\n+1040 }\n+1041\n+1042 MPI_Recv(receiveBuffer_, count, MPI_PACKED, source, 345,\n+remoteIndices_._\bc_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bo_\br(), &status);\n+1043\n+1044 // How many global entries were published?\n+1045 MPI_Unpack(receiveBuffer_, count, &bpos, &publish, 1, MPI_INT,\n+remoteIndices_._\bc_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bo_\br());\n+1046\n+1047 // Now unpack the remote indices and add them.\n+1048 while(publish>0) {\n+1049\n+1050 // Unpack information about the local index on the source process\n+1051 _\bG_\bl_\bo_\bb_\ba_\bl_\bI_\bn_\bd_\be_\bx global; // global index of the current entry\n+1052 char sourceAttribute; // Attribute on the source process\n+1053 int pairs;\n+1054\n+1055 MPI_Unpack(receiveBuffer_, count, &bpos, &global, 1,\n+_\bM_\bP_\bI_\bT_\br_\ba_\bi_\bt_\bs_\b<_\bG_\bl_\bo_\bb_\ba_\bl_\bI_\bn_\bd_\be_\bx_\b>_\b:_\b:_\bg_\be_\bt_\bT_\by_\bp_\be(),\n+1056 remoteIndices_._\bc_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bo_\br());\n+1057 MPI_Unpack(receiveBuffer_, count, &bpos, &sourceAttribute, 1, MPI_CHAR,\n+1058 remoteIndices_._\bc_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bo_\br());\n+1059 MPI_Unpack(receiveBuffer_, count, &bpos, &pairs, 1, MPI_INT,\n+1060 remoteIndices_._\bc_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bo_\br());\n+1061\n+1062 // Insert the entry on the remote process to our\n+1063 // remote index list\n+1064 SLList > sourceAttributeList;\n+1065 sourceAttributeList.push_back(std::make_pair(source,_\bA_\bt_\bt_\br_\bi_\bb_\bu_\bt_\be\n+(sourceAttribute)));\n+1066#ifndef NDEBUG\n+1067 bool foundSelf = false;\n+1068#endif\n+1069 _\bA_\bt_\bt_\br_\bi_\bb_\bu_\bt_\be myAttribute=_\bA_\bt_\bt_\br_\bi_\bb_\bu_\bt_\be();\n+1070\n+1071 // Unpack the remote indices\n+1072 for(; pairs>0; --pairs) {\n+1073 // Unpack the process id that knows the index\n+1074 int process;\n+1075 char attribute;\n+1076 MPI_Unpack(receiveBuffer_, count, &bpos, &process, 1, MPI_INT,\n+1077 remoteIndices_._\bc_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bo_\br());\n+1078 // Unpack the attribute\n+1079 MPI_Unpack(receiveBuffer_, count, &bpos, &attribute, 1, MPI_CHAR,\n+1080 remoteIndices_._\bc_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bo_\br());\n+1081\n+1082 if(process==rank_) {\n+1083#ifndef NDEBUG\n+1084 foundSelf=true;\n+1085#endif\n+1086 myAttribute=_\bA_\bt_\bt_\br_\bi_\bb_\bu_\bt_\be(attribute);\n+1087 // Now we know the local attribute of the global index\n+1088 //Only add the index if it is unknown.\n+1089 // Do we know that global index already?\n+1090 auto pos = std::lower_bound(index, iEnd, _\bI_\bn_\bd_\be_\bx_\bP_\ba_\bi_\br(global));\n+1091\n+1092 if(pos == iEnd || pos->global() != global) {\n+1093 // no entry with this global index\n+1094 indexSet_.add(global,\n+1095 ParallelLocalIndex(numberer(global),\n+1096 myAttribute, true));\n+1097 _\bD_\bu_\bn_\be_\b:_\b:_\bd_\bv_\bv_\be_\br_\bb << \"Adding \"<global()==global; ++pos)\n+1106 if(pos->local().attribute() == myAttribute) {\n+1107 _\bD_\bu_\bn_\be_\b:_\b:_\bd_\bv_\bv_\be_\br_\bb<<\"found \"<(numberer(global),\n+1115 myAttribute, true));\n+1116 _\bD_\bu_\bn_\be_\b:_\b:_\bd_\bv_\bv_\be_\br_\bb << \"Adding \"< >::const_iterator Iter;\n+1126 for(Iter i=sourceAttributeList.begin(), end=sourceAttributeList.end();\n+1127 i!=end; ++i)\n+1128 insertIntoRemoteIndexList(i->first, std::make_pair(global, myAttribute),\n+1129 i->second);\n+1130 --publish;\n+1131 }\n+1132\n+1133 resetIteratorsMap();\n+1134 }\n+1135\n+1136 template\n+1137 void IndicesSyncer::resetIteratorsMap(){\n+1138\n+1139 // Reset iterators in all tuples.\n+1140 const auto remoteEnd = remoteIndices_.remoteIndices_.end();\n+1141 auto iterators = iteratorsMap_.begin();\n+1142 auto global = globalMap_.begin();\n+1143 auto added = oldMap_.begin();\n+1144\n+1145 for(auto remote = remoteIndices_.remoteIndices_.begin();\n+1146 remote != remoteEnd; ++remote, ++global, ++added, ++iterators) {\n+1147 iterators->second.reset(*(remote->second.first), global->second, added-\n+>second);\n+1148 }\n+1149 }\n+1150\n+1151 template\n+1152 bool IndicesSyncer::checkReset(const Iterators& iterators,\n+RemoteIndexList& rList, GlobalIndexList& gList,\n+1153 BoolList& bList){\n+1154\n+1155 if(std::get<0>(iterators.iterators_) != rList.begin())\n+1156 return false;\n+1157 if(std::get<1>(iterators.iterators_) != gList.begin())\n+1158 return false;\n+1159 if(std::get<2>(iterators.iterators_) != bList.begin())\n+1160 return false;\n+1161 return true;\n+1162 }\n+1163\n+1164\n+1165 template\n+1166 bool IndicesSyncer::checkReset(){\n+1167\n+1168 // Reset iterators in all tuples.\n+1169 const auto remoteEnd = remoteIndices_.remoteIndices_.end();\n+1170 auto iterators = iteratorsMap_.begin();\n+1171 auto global = globalMap_.begin();\n+1172 auto added = oldMap_.begin();\n+1173 bool ret = true;\n+1174\n+1175 for(auto remote = remoteIndices_.remoteIndices_.begin();\n+1176 remote != remoteEnd; ++remote, ++global, ++added, ++iterators) {\n+1177 if(!checkReset(iterators->second, *(remote->second.first), global->second,\n+1178 added->second))\n+1179 ret=false;\n+1180 }\n+1181 return ret;\n+1182 }\n+1183}\n+1184\n+1185#endif // HAVE_MPI\n+1186#endif // DUNE_COMMON_PARALLEL_INDICESSYNCER_HH\n _\bi_\bn_\bd_\be_\bx_\bs_\be_\bt_\b._\bh_\bh\n Provides a map between global and local indices.\n-_\bi_\bt_\be_\br_\ba_\bt_\bo_\br_\bf_\ba_\bc_\ba_\bd_\be_\bs_\b._\bh_\bh\n-This file implements iterator facade classes for writing stl conformant\n-iterators.\n-_\bD_\bu_\bn_\be_\b:_\b:_\bU_\bn_\bc_\ba_\bc_\bh_\be_\bd_\bS_\be_\bl_\be_\bc_\bt_\bi_\bo_\bn_\b:_\b:_\be_\bn_\bd\n-const_iterator end() const\n-Get an iterator over the selected indices.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn selection.hh:330\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\be_\bl_\be_\bc_\bt_\bi_\bo_\bn_\b:_\b:_\bs_\be_\bt_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt\n-void setIndexSet(const ParallelIndexSet &indexset)\n-Set the index set of the selection.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn selection.hh:269\n-_\bD_\bu_\bn_\be_\b:_\b:_\bU_\bn_\bc_\ba_\bc_\bh_\be_\bd_\bS_\be_\bl_\be_\bc_\bt_\bi_\bo_\bn_\b:_\b:_\bs_\be_\bt_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt\n-void setIndexSet(const ParallelIndexSet &indexset)\n-Set the index set of the selection.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn selection.hh:336\n-_\bD_\bu_\bn_\be_\b:_\b:_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt_\b:_\b:_\bb_\be_\bg_\bi_\bn\n-iterator begin()\n-Get an iterator over the indices positioned at the first index.\n-_\bD_\bu_\bn_\be_\b:_\b:_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt_\b:_\b:_\be_\bn_\bd\n+_\br_\be_\bm_\bo_\bt_\be_\bi_\bn_\bd_\bi_\bc_\be_\bs_\b._\bh_\bh\n+Classes describing a distributed indexset.\n+_\bs_\bt_\bd_\bs_\bt_\br_\be_\ba_\bm_\bs_\b._\bh_\bh\n+Standard Dune debug streams.\n+_\bs_\bl_\bl_\bi_\bs_\bt_\b._\bh_\bh\n+Implements a singly linked list together with the necessary iterators.\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bL_\bL_\bi_\bs_\bt_\b:_\b:_\bp_\bu_\bs_\bh_\b__\bb_\ba_\bc_\bk\n+void push_back(const MemberType &item)\n+Add a new entry to the end of the list.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn sllist.hh:643\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bL_\bL_\bi_\bs_\bt_\b:_\b:_\bi_\bt_\be_\br_\ba_\bt_\bo_\br\n+SLListIterator< T, A > iterator\n+The mutable iterator of the list.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn sllist.hh:69\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bL_\bL_\bi_\bs_\bt_\b:_\b:_\be_\bn_\bd\n iterator end()\n-Get an iterator over the indices positioned after the last index.\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\be_\bl_\be_\bc_\bt_\bi_\bo_\bn_\b:_\b:_\be_\bn_\bd\n+Get an iterator pointing to the end of the list.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn sllist.hh:774\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bL_\bL_\bi_\bs_\bt_\b:_\b:_\bb_\be_\bg_\bi_\bn_\bM_\bo_\bd_\bi_\bf_\by\n+ModifyIterator beginModify()\n+Get an iterator capable of deleting and inserting elements.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn sllist.hh:787\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bL_\bL_\bi_\bs_\bt_\b<_\b _\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\be_\bx_\b,_\b _\bA_\bl_\bl_\bo_\bc_\ba_\bt_\bo_\br_\b _\b>_\b:_\b:_\bc_\bo_\bn_\bs_\bt_\b__\bi_\bt_\be_\br_\ba_\bt_\bo_\br\n+SLListConstIterator< RemoteIndex, Allocator > const_iterator\n+The constant iterator of the list.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn sllist.hh:74\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bL_\bL_\bi_\bs_\bt_\b:_\b:_\bM_\bo_\bd_\bi_\bf_\by_\bI_\bt_\be_\br_\ba_\bt_\bo_\br\n+SLListModifyIterator< T, A > ModifyIterator\n+The type of the iterator capable of deletion and insertion.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn sllist.hh:103\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bL_\bL_\bi_\bs_\bt_\b:_\b:_\bb_\be_\bg_\bi_\bn\n+iterator begin()\n+Get an iterator pointing to the first element in the list.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn sllist.hh:762\n+_\bD_\bu_\bn_\be_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b<\n+EnableIfInterOperable< T1, T2, bool >::type operator<(const\n+RandomAccessIteratorFacade< T1, V1, R1, D > &lhs, const\n+RandomAccessIteratorFacade< T2, V2, R2, D > &rhs)\n+Comparison operator.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn iteratorfacades.hh:638\n+_\bD_\bu_\bn_\be_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b=_\b=\n+EnableIfInterOperable< T1, T2, bool >::type operator==(const\n+ForwardIteratorFacade< T1, V1, R1, D > &lhs, const ForwardIteratorFacade< T2,\n+V2, R2, D > &rhs)\n+Checks for equality.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn iteratorfacades.hh:238\n+_\bD_\bu_\bn_\be_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b!_\b=\n+EnableIfInterOperable< T1, T2, bool >::type operator!=(const\n+ForwardIteratorFacade< T1, V1, R1, D > &lhs, const ForwardIteratorFacade< T2,\n+V2, R2, D > &rhs)\n+Checks for inequality.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn iteratorfacades.hh:260\n+_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bd_\bi_\bc_\be_\bs_\bS_\by_\bn_\bc_\be_\br_\b:_\b:_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bs_\b:_\b:_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bs\n+Iterators()\n+Default constructor.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn indicessyncer.hh:563\n+_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bd_\bi_\bc_\be_\bs_\bS_\by_\bn_\bc_\be_\br_\b:_\b:_\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\bi_\bc_\be_\bs\n+Dune::RemoteIndices< ParallelIndexSet > RemoteIndices\n+Type of the remote indices.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn indicessyncer.hh:63\n+_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bd_\bi_\bc_\be_\bs_\bS_\by_\bn_\bc_\be_\br_\b:_\b:_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bs_\b:_\b:_\bi_\bs_\bO_\bl_\bd\n+bool isOld() const\n+Was this entry already in the remote index list before the sync process?\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn indicessyncer.hh:600\n+_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bd_\bi_\bc_\be_\bs_\bS_\by_\bn_\bc_\be_\br_\b:_\b:_\bM_\be_\bs_\bs_\ba_\bg_\be_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\bp_\bu_\bb_\bl_\bi_\bs_\bh\n+int publish\n+The number of indices we publish for the other process.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn indicessyncer.hh:132\n+_\bD_\bu_\bn_\be_\b:_\b:_\br_\be_\bp_\ba_\bi_\br_\bL_\bo_\bc_\ba_\bl_\bI_\bn_\bd_\be_\bx_\bP_\bo_\bi_\bn_\bt_\be_\br_\bs\n+void repairLocalIndexPointers(std::map< int, SLList< std::pair< typename T::\n+GlobalIndex, typename T::LocalIndex::Attribute >, A > > &globalMap,\n+RemoteIndices< T, A1 > &remoteIndices, const T &indexSet)\n+Repair the pointers to the local indices in the remote indices.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn indicessyncer.hh:495\n+_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bd_\bi_\bc_\be_\bs_\bS_\by_\bn_\bc_\be_\br_\b:_\b:_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bs_\b:_\b:_\bi_\bs_\bA_\bt_\bE_\bn_\bd\n+bool isAtEnd() const\n+Are we at the end of the list?\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn indicessyncer.hh:622\n+_\bD_\bu_\bn_\be_\b:_\b:_\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\bi_\bc_\be_\bs_\b:_\b:_\bc_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bo_\br\n+MPI_Comm communicator() const\n+Get the mpi communicator used.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn remoteindices.hh:1695\n+_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bd_\bi_\bc_\be_\bs_\bS_\by_\bn_\bc_\be_\br_\b:_\b:_\bG_\bl_\bo_\bb_\ba_\bl_\bI_\bn_\bd_\be_\bx\n+ParallelIndexSet::GlobalIndex GlobalIndex\n+Type of the global index used in the index set.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn indicessyncer.hh:55\n+_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bd_\bi_\bc_\be_\bs_\bS_\by_\bn_\bc_\be_\br_\b:_\b:_\bM_\be_\bs_\bs_\ba_\bg_\be_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\bp_\ba_\bi_\br_\bs\n+int pairs\n+The number of pairs (attribute and process number) we publish to the neighbour\n+process.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn indicessyncer.hh:137\n+_\bD_\bu_\bn_\be_\b:_\b:_\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\bi_\bc_\be_\bs_\b:_\b:_\be_\bn_\bd\n const_iterator end() const\n-Get an iterator over the selected indices.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn selection.hh:302\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\be_\bl_\be_\bc_\bt_\bi_\bo_\bn_\b:_\b:_\bb_\be_\bg_\bi_\bn\n-const_iterator begin() const\n-Get the index set we are a selection for.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn selection.hh:296\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\be_\bl_\be_\bc_\bt_\bi_\bo_\bn_\b:_\b:_\bf_\br_\be_\be\n-void free()\n-Free allocated memory.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn selection.hh:308\n-_\bD_\bu_\bn_\be_\b:_\b:_\bU_\bn_\bc_\ba_\bc_\bh_\be_\bd_\bS_\be_\bl_\be_\bc_\bt_\bi_\bo_\bn_\b:_\b:_\bb_\be_\bg_\bi_\bn\n+Get an iterator over all remote index lists.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn remoteindices.hh:1528\n+_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bd_\bi_\bc_\be_\bs_\bS_\by_\bn_\bc_\be_\br_\b:_\b:_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bs_\b:_\b:_\ba_\bt_\bt_\br_\bi_\bb_\bu_\bt_\be\n+Attribute & attribute() const\n+_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bd_\bi_\bc_\be_\bs_\bS_\by_\bn_\bc_\be_\br_\b:_\b:_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bs_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b+_\b+\n+Iterators & operator++()\n+Increment all iterators.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn indicessyncer.hh:568\n+_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bd_\bi_\bc_\be_\bs_\bS_\by_\bn_\bc_\be_\br_\b:_\b:_\bA_\bt_\bt_\br_\bi_\bb_\bu_\bt_\be\n+ParallelIndexSet::LocalIndex::Attribute Attribute\n+Type of the attribute used in the index set.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn indicessyncer.hh:58\n+_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bd_\bi_\bc_\be_\bs_\bS_\by_\bn_\bc_\be_\br_\b:_\b:_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bs_\b:_\b:_\bg_\bl_\bo_\bb_\ba_\bl_\bI_\bn_\bd_\be_\bx_\bP_\ba_\bi_\br\n+std::pair< GlobalIndex, Attribute > & globalIndexPair() const\n+Get the global index of the remote index at current position.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn indicessyncer.hh:594\n+_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bd_\bi_\bc_\be_\bs_\bS_\by_\bn_\bc_\be_\br_\b:_\b:_\bI_\bn_\bd_\bi_\bc_\be_\bs_\bS_\by_\bn_\bc_\be_\br\n+IndicesSyncer(ParallelIndexSet &indexSet, RemoteIndices &remoteIndices)\n+Constructor.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn indicessyncer.hh:544\n+_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bd_\bi_\bc_\be_\bs_\bS_\by_\bn_\bc_\be_\br_\b:_\b:_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bs_\b:_\b:_\br_\be_\bs_\be_\bt\n+void reset(RemoteIndexList &remoteIndices, GlobalIndexList &globalIndices,\n+BoolList &booleans)\n+Reset all the underlying iterators.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn indicessyncer.hh:606\n+_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bd_\bi_\bc_\be_\bs_\bS_\by_\bn_\bc_\be_\br_\b:_\b:_\bD_\be_\bf_\ba_\bu_\bl_\bt_\bN_\bu_\bm_\bb_\be_\br_\be_\br_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b(_\b)\n+std::size_t operator()(const GlobalIndex &global)\n+Provide the local index, always std::numeric_limits::max()\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn indicessyncer.hh:151\n+_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bd_\bi_\bc_\be_\bs_\bS_\by_\bn_\bc_\be_\br_\b:_\b:_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt\n+T ParallelIndexSet\n+The type of the index set.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn indicessyncer.hh:49\n+_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bd_\bi_\bc_\be_\bs_\bS_\by_\bn_\bc_\be_\br_\b:_\b:_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bs_\b:_\b:_\bi_\bs_\bN_\bo_\bt_\bA_\bt_\bE_\bn_\bd\n+bool isNotAtEnd() const\n+Are we not at the end of the list?\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn indicessyncer.hh:616\n+_\bD_\bu_\bn_\be_\b:_\b:_\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\bi_\bc_\be_\bs_\b:_\b:_\bn_\be_\bi_\bg_\bh_\bb_\bo_\bu_\br_\bs\n+int neighbours() const\n+Get the number of processors we share indices with.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn remoteindices.hh:1445\n+_\bD_\bu_\bn_\be_\b:_\b:_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt_\b:_\b:_\bG_\bl_\bo_\bb_\ba_\bl_\bI_\bn_\bd_\be_\bx\n+TG GlobalIndex\n+the type of the global index. This type has to provide at least a operator< for\n+sorting.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn indexset.hh:226\n+_\bD_\bu_\bn_\be_\b:_\b:_\bs_\bt_\bo_\br_\be_\bG_\bl_\bo_\bb_\ba_\bl_\bI_\bn_\bd_\bi_\bc_\be_\bs_\bO_\bf_\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\bi_\bc_\be_\bs\n+void storeGlobalIndicesOfRemoteIndices(std::map< int, SLList< std::pair<\n+typename T::GlobalIndex, typename T::LocalIndex::Attribute >, A > > &globalMap,\n+const RemoteIndices< T, A1 > &remoteIndices)\n+Stores the corresponding global indices of the remote index information.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn indicessyncer.hh:469\n+_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bd_\bi_\bc_\be_\bs_\bS_\by_\bn_\bc_\be_\br_\b:_\b:_\bs_\by_\bn_\bc\n+void sync()\n+Sync the index set.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn indicessyncer.hh:736\n+_\bD_\bu_\bn_\be_\b:_\b:_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt_\b:_\b:_\bs_\be_\bq_\bN_\bo\n+int seqNo() const\n+Get the internal sequence number.\n+_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bd_\bi_\bc_\be_\bs_\bS_\by_\bn_\bc_\be_\br_\b:_\b:_\bI_\bn_\bd_\be_\bx_\bP_\ba_\bi_\br\n+ParallelIndexSet::IndexPair IndexPair\n+The type of the index pair.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn indicessyncer.hh:52\n+_\bD_\bu_\bn_\be_\b:_\b:_\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\bi_\bc_\be_\bs_\b:_\b:_\bb_\be_\bg_\bi_\bn\n const_iterator begin() const\n-Get the index set we are a selection for.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn selection.hh:323\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\be_\bl_\be_\bc_\bt_\bi_\bo_\bn_\b:_\b:_\b~_\bS_\be_\bl_\be_\bc_\bt_\bi_\bo_\bn\n-~Selection()\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn selection.hh:316\n+Get an iterator over all remote index lists.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn remoteindices.hh:1521\n+_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bd_\bi_\bc_\be_\bs_\bS_\by_\bn_\bc_\be_\br_\b:_\b:_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bs_\b:_\b:_\br_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\be_\bx\n+RemoteIndex & remoteIndex() const\n+Get the remote index at current position.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn indicessyncer.hh:587\n+_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bd_\bi_\bc_\be_\bs_\bS_\by_\bn_\bc_\be_\br_\b:_\b:_\bM_\be_\bs_\bs_\ba_\bg_\be_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\bM_\be_\bs_\bs_\ba_\bg_\be_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn\n+MessageInformation()\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn indicessyncer.hh:128\n+_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bd_\bi_\bc_\be_\bs_\bS_\by_\bn_\bc_\be_\br_\b:_\b:_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bs_\b:_\b:_\bi_\bn_\bs_\be_\br_\bt\n+void insert(const RemoteIndex &index, const std::pair< GlobalIndex, Attribute >\n+&global)\n+Insert a new remote index to the underlying remote index list.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn indicessyncer.hh:577\n+_\bD_\bu_\bn_\be_\b:_\b:_\bd_\bv_\bv_\be_\br_\bb\n+DVVerbType dvverb(std::cout)\n+stream for very verbose output.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn stdstreams.hh:96\n+_\bD_\bu_\bn_\be_\b:_\b:_\bd_\bv_\be_\br_\bb\n+DVerbType dverb(std::cout)\n+Singleton of verbose debug stream.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn stdstreams.hh:117\n _\bD_\bu_\bn_\be\n Dune namespace.\n D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn alignedallocator.hh:13\n-_\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bn_\bs_\bt_\bA_\br_\br_\ba_\by_\bL_\bi_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br\n-A constant random access iterator for the Dune::ArrayList class.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn arraylist.hh:368\n-_\bD_\bu_\bn_\be_\b:_\b:_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt\n-Manager class for the mapping between local indices and globally unique\n-indices.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn indexset.hh:218\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\be_\bl_\be_\bc_\bt_\bi_\bo_\bn_\bI_\bt_\be_\br_\ba_\bt_\bo_\br\n-A const iterator over an uncached selection.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn selection.hh:31\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\be_\bl_\be_\bc_\bt_\bi_\bo_\bn_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br\n-ConstArrayListIterator< IndexPair< TG, TL >, N, std::allocator< Dune::\n-IndexPair< TG, TL > > > ParallelIndexSetIterator\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn selection.hh:50\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\be_\bl_\be_\bc_\bt_\bi_\bo_\bn_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b+_\b+\n-void operator++()\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn selection.hh:64\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\be_\bl_\be_\bc_\bt_\bi_\bo_\bn_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b*\n-uint32_t operator*() const\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn selection.hh:73\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\be_\bl_\be_\bc_\bt_\bi_\bo_\bn_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\bA_\bt_\bt_\br_\bi_\bb_\bu_\bt_\be_\bS_\be_\bt\n-TS AttributeSet\n-The type of the Set of attributes.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn selection.hh:41\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\be_\bl_\be_\bc_\bt_\bi_\bo_\bn_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt\n-Dune::ParallelIndexSet< TG, TL, N > ParallelIndexSet\n-The type of the underlying index set.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn selection.hh:46\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\be_\bl_\be_\bc_\bt_\bi_\bo_\bn_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\bS_\be_\bl_\be_\bc_\bt_\bi_\bo_\bn_\bI_\bt_\be_\br_\ba_\bt_\bo_\br\n-SelectionIterator(const ParallelIndexSetIterator &iter, const\n-ParallelIndexSetIterator &end)\n-Constructor.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn selection.hh:56\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\be_\bl_\be_\bc_\bt_\bi_\bo_\bn_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b!_\b=\n-bool operator!=(const SelectionIterator< TS, TG, TL, N > &other) const\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn selection.hh:83\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\be_\bl_\be_\bc_\bt_\bi_\bo_\bn_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b=_\b=\n-bool operator==(const SelectionIterator< TS, TG, TL, N > &other) const\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn selection.hh:78\n-_\bD_\bu_\bn_\be_\b:_\b:_\bU_\bn_\bc_\ba_\bc_\bh_\be_\bd_\bS_\be_\bl_\be_\bc_\bt_\bi_\bo_\bn\n-An uncached selection of indices.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn selection.hh:99\n-_\bD_\bu_\bn_\be_\b:_\b:_\bU_\bn_\bc_\ba_\bc_\bh_\be_\bd_\bS_\be_\bl_\be_\bc_\bt_\bi_\bo_\bn_\b:_\b:_\bU_\bn_\bc_\ba_\bc_\bh_\be_\bd_\bS_\be_\bl_\be_\bc_\bt_\bi_\bo_\bn\n-UncachedSelection()\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn selection.hh:139\n-_\bD_\bu_\bn_\be_\b:_\b:_\bU_\bn_\bc_\ba_\bc_\bh_\be_\bd_\bS_\be_\bl_\be_\bc_\bt_\bi_\bo_\bn_\b:_\b:_\bi_\bt_\be_\br_\ba_\bt_\bo_\br\n-SelectionIterator< TS, TG, TL, N > iterator\n-The type of the iterator of the selected indices.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn selection.hh:132\n-_\bD_\bu_\bn_\be_\b:_\b:_\bU_\bn_\bc_\ba_\bc_\bh_\be_\bd_\bS_\be_\bl_\be_\bc_\bt_\bi_\bo_\bn_\b:_\b:_\bA_\bt_\bt_\br_\bi_\bb_\bu_\bt_\be_\bS_\be_\bt\n-TS AttributeSet\n-The type of the Set of attributes.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn selection.hh:109\n-_\bD_\bu_\bn_\be_\b:_\b:_\bU_\bn_\bc_\ba_\bc_\bh_\be_\bd_\bS_\be_\bl_\be_\bc_\bt_\bi_\bo_\bn_\b:_\b:_\bc_\bo_\bn_\bs_\bt_\b__\bi_\bt_\be_\br_\ba_\bt_\bo_\br\n-iterator const_iterator\n-The type of the iterator of the selected indices.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn selection.hh:137\n-_\bD_\bu_\bn_\be_\b:_\b:_\bU_\bn_\bc_\ba_\bc_\bh_\be_\bd_\bS_\be_\bl_\be_\bc_\bt_\bi_\bo_\bn_\b:_\b:_\bG_\bl_\bo_\bb_\ba_\bl_\bI_\bn_\bd_\be_\bx\n-TG GlobalIndex\n-The type of the global index of the underlying index set.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn selection.hh:114\n-_\bD_\bu_\bn_\be_\b:_\b:_\bU_\bn_\bc_\ba_\bc_\bh_\be_\bd_\bS_\be_\bl_\be_\bc_\bt_\bi_\bo_\bn_\b:_\b:_\bU_\bn_\bc_\ba_\bc_\bh_\be_\bd_\bS_\be_\bl_\be_\bc_\bt_\bi_\bo_\bn\n-UncachedSelection(const ParallelIndexSet &indexset)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn selection.hh:143\n-_\bD_\bu_\bn_\be_\b:_\b:_\bU_\bn_\bc_\ba_\bc_\bh_\be_\bd_\bS_\be_\bl_\be_\bc_\bt_\bi_\bo_\bn_\b:_\b:_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt\n-Dune::ParallelIndexSet< GlobalIndex, LocalIndex, N > ParallelIndexSet\n-The type of the underlying index set.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn selection.hh:127\n-_\bD_\bu_\bn_\be_\b:_\b:_\bU_\bn_\bc_\ba_\bc_\bh_\be_\bd_\bS_\be_\bl_\be_\bc_\bt_\bi_\bo_\bn_\b:_\b:_\bL_\bo_\bc_\ba_\bl_\bI_\bn_\bd_\be_\bx\n-TL LocalIndex\n-The type of the local index of the underlying index set.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn selection.hh:122\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\be_\bl_\be_\bc_\bt_\bi_\bo_\bn\n-A cached selection of indices.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn selection.hh:180\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\be_\bl_\be_\bc_\bt_\bi_\bo_\bn_\b:_\b:_\bG_\bl_\bo_\bb_\ba_\bl_\bI_\bn_\bd_\be_\bx\n-TG GlobalIndex\n-The type of the global index of the underlying index set.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn selection.hh:195\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\be_\bl_\be_\bc_\bt_\bi_\bo_\bn_\b:_\b:_\bS_\be_\bl_\be_\bc_\bt_\bi_\bo_\bn\n-Selection(const ParallelIndexSet &indexset)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn selection.hh:224\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\be_\bl_\be_\bc_\bt_\bi_\bo_\bn_\b:_\b:_\bS_\be_\bl_\be_\bc_\bt_\bi_\bo_\bn\n-Selection()\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn selection.hh:220\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\be_\bl_\be_\bc_\bt_\bi_\bo_\bn_\b:_\b:_\bL_\bo_\bc_\ba_\bl_\bI_\bn_\bd_\be_\bx\n-TL LocalIndex\n-The type of the local index of the underlying index set.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn selection.hh:203\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\be_\bl_\be_\bc_\bt_\bi_\bo_\bn_\b:_\b:_\bA_\bt_\bt_\br_\bi_\bb_\bu_\bt_\be_\bS_\be_\bt\n-TS AttributeSet\n-The type of the set of attributes.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn selection.hh:190\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\be_\bl_\be_\bc_\bt_\bi_\bo_\bn_\b:_\b:_\bi_\bt_\be_\br_\ba_\bt_\bo_\br\n-uint32_t * iterator\n-The type of the iterator of the selected indices.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn selection.hh:213\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\be_\bl_\be_\bc_\bt_\bi_\bo_\bn_\b:_\b:_\bc_\bo_\bn_\bs_\bt_\b__\bi_\bt_\be_\br_\ba_\bt_\bo_\br\n-uint32_t * const_iterator\n-The type of the iterator of the selected indices.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn selection.hh:218\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\be_\bl_\be_\bc_\bt_\bi_\bo_\bn_\b:_\b:_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt\n-Dune::ParallelIndexSet< GlobalIndex, LocalIndex, N > ParallelIndexSet\n-The type of the underlying index set.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn selection.hh:208\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\bP_\bI_\bT_\br_\ba_\bi_\bt_\bs_\b:_\b:_\bg_\be_\bt_\bT_\by_\bp_\be\n+static MPI_Datatype getType()\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mpitraits.hh:48\n+_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bd_\be_\bx_\bP_\ba_\bi_\br\n+A pair consisting of a global and local index.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn indexset.hh:85\n+_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bd_\bi_\bc_\be_\bs_\bS_\by_\bn_\bc_\be_\br\n+Class for recomputing missing indices of a distributed index set.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn indicessyncer.hh:45\n+_\bD_\bu_\bn_\be_\b:_\b:_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bL_\bo_\bc_\ba_\bl_\bI_\bn_\bd_\be_\bx\n+An index present on the local process with an additional attribute flag.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn plocalindex.hh:52\n+_\bD_\bu_\bn_\be_\b:_\b:_\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\bi_\bc_\be_\bs\n+The indices present on remote processes.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn remoteindices.hh:190\n+_\bD_\bu_\bn_\be_\b:_\b:_\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\bi_\bc_\be_\bs_\b:_\b:_\bA_\bl_\bl_\bo_\bc_\ba_\bt_\bo_\br\n+typename std::allocator_traits< A >::template rebind_alloc< RemoteIndex >\n+Allocator\n+The type of the allocator for the remote index list.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn remoteindices.hh:238\n+_\bD_\bu_\bn_\be_\b:_\b:_\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\be_\bx\n+Information about an index residing on another processor.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn remoteindices.hh:74\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bL_\bL_\bi_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br\n+A mutable iterator for the SLList.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn sllist.hh:271\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bL_\bL_\bi_\bs_\bt\n+A single linked list.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn sllist.hh:44\n ===============================================================================\n Generated by\u00a0_\b[_\bd_\bo_\bx_\by_\bg_\be_\bn_\b] 1.9.8\n"}]}, {"source1": "./usr/share/doc/libdune-common-doc/doxygen/a00056.html", "source2": "./usr/share/doc/libdune-common-doc/doxygen/a00056.html", "unified_diff": "@@ -1,15 +1,15 @@\n \n \n \n \n \n \n \n-dune-common: mpiguard.hh File Reference\n+dune-common: remoteindices.hh File Reference\n \n \n \n \n \n \n \n@@ -71,47 +71,84 @@\n \n
    \n
    \n
    \n \n-
    mpiguard.hh File Reference
    \n+Namespaces |\n+Functions
    \n+ \n \n
    \n \n-

    Implements a MPIGuard which detects an error on a remote process. \n+

    Classes describing a distributed indexset. \n More...

    \n-
    #include <mpi.h>
    \n-#include <dune/common/exceptions.hh>
    \n-#include <dune/common/parallel/communication.hh>
    \n-#include <dune/common/parallel/mpicommunication.hh>
    \n-#include <dune/common/parallel/mpihelper.hh>
    \n+
    #include <cassert>
    \n+#include <iostream>
    \n+#include <ostream>
    \n+#include <map>
    \n+#include <memory>
    \n+#include <set>
    \n+#include <tuple>
    \n+#include <utility>
    \n+#include <vector>
    \n+#include <mpi.h>
    \n+#include <dune/common/exceptions.hh>
    \n+#include <dune/common/sllist.hh>
    \n+#include <dune/common/stdstreams.hh>
    \n+#include <dune/common/parallel/indexset.hh>
    \n+#include <dune/common/parallel/mpitraits.hh>
    \n+#include <dune/common/parallel/plocalindex.hh>
    \n
    \n

    Go to the source code of this file.

    \n \n \n-\n-\n+\n \n-\n-\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n \n

    \n Classes

    class  Dune::MPIGuardError
     This exception is thrown if the MPIGuard detects an error on a remote process. More...
    class  Dune::MPITraits< IndexPair< TG, ParallelLocalIndex< TA > > >
     
    class  Dune::MPIGuard
     detects a thrown exception and communicates to all other processes More...
    class  Dune::RemoteIndex< T1, T2 >
     Information about an index residing on another processor. More...
     
    class  Dune::RemoteIndices< T, A >
     The indices present on remote processes. More...
     
    class  Dune::RemoteIndexListModifier< T, A, mode >
     Modifier for adding and/or deleting remote indices from the remote index list. More...
     
    class  Dune::RemoteIndexListModifier< T, A, mode >::InvalidPosition
     
    class  Dune::CollectiveIterator< T, A >
     A collective iterator for moving over the remote indices for all processes collectively. More...
     
    class  Dune::CollectiveIterator< T, A >::iterator
     Iterator over the valid underlying iterators. More...
     
    \n \n \n \n \n+

    \n Namespaces

    namespace  Dune
     Dune namespace.
     
    \n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n

    \n+Functions

    template<typename T1 , typename T2 >
    std::ostream & Dune::operator<< (std::ostream &os, const RemoteIndex< T1, T2 > &index)
     
    template<class T , class A >
    std::ostream & Dune::operator<< (std::ostream &os, const RemoteIndices< T, A > &indices)
     
    template<typename TG , typename TA >
    std::ostream & Dune::operator<< (std::ostream &os, const RemoteIndex< TG, TA > &index)
     
    \n

    Detailed Description

    \n-

    Implements a MPIGuard which detects an error on a remote process.

    \n-
    Author
    Christian Engwer
    \n+

    Classes describing a distributed indexset.

    \n+
    Author
    Markus Blatt
    \n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,36 +1,73 @@\n dune-common\u00a02.10\n Loading...\n Searching...\n No Matches\n * _\bd_\bu_\bn_\be\n * _\bc_\bo_\bm_\bm_\bo_\bn\n * _\bp_\ba_\br_\ba_\bl_\bl_\be_\bl\n-_\bC_\bl_\ba_\bs_\bs_\be_\bs | _\bN_\ba_\bm_\be_\bs_\bp_\ba_\bc_\be_\bs\n-mpiguard.hh File Reference\n-_\bC_\bo_\bm_\bm_\bo_\bn \u00bb _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\b _\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn\n-Implements a MPIGuard which detects an error on a remote process. _\bM_\bo_\br_\be_\b._\b._\b.\n+_\bC_\bl_\ba_\bs_\bs_\be_\bs | _\bN_\ba_\bm_\be_\bs_\bp_\ba_\bc_\be_\bs | _\bF_\bu_\bn_\bc_\bt_\bi_\bo_\bn_\bs\n+remoteindices.hh File Reference\n+_\bC_\bo_\bm_\bm_\bo_\bn \u00bb _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\b _\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn \u00bb _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\b _\bC_\bo_\bm_\bp_\bu_\bt_\bi_\bn_\bg_\b _\bb_\ba_\bs_\be_\bd_\b _\bo_\bn_\b _\bI_\bn_\bd_\be_\bx_\bs_\be_\bt_\bs\n+Classes describing a distributed indexset. _\bM_\bo_\br_\be_\b._\b._\b.\n+#include \n+#include \n+#include \n+#include \n+#include \n+#include \n+#include \n+#include \n+#include \n #include \n #include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\be_\bx_\bc_\be_\bp_\bt_\bi_\bo_\bn_\bs_\b._\bh_\bh>\n-#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bp_\ba_\br_\ba_\bl_\bl_\be_\bl_\b/_\bc_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b._\bh_\bh>\n-#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bp_\ba_\br_\ba_\bl_\bl_\be_\bl_\b/_\bm_\bp_\bi_\bc_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b._\bh_\bh>\n-#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bp_\ba_\br_\ba_\bl_\bl_\be_\bl_\b/_\bm_\bp_\bi_\bh_\be_\bl_\bp_\be_\br_\b._\bh_\bh>\n+#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bs_\bl_\bl_\bi_\bs_\bt_\b._\bh_\bh>\n+#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bs_\bt_\bd_\bs_\bt_\br_\be_\ba_\bm_\bs_\b._\bh_\bh>\n+#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bp_\ba_\br_\ba_\bl_\bl_\be_\bl_\b/_\bi_\bn_\bd_\be_\bx_\bs_\be_\bt_\b._\bh_\bh>\n+#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bp_\ba_\br_\ba_\bl_\bl_\be_\bl_\b/_\bm_\bp_\bi_\bt_\br_\ba_\bi_\bt_\bs_\b._\bh_\bh>\n+#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bp_\ba_\br_\ba_\bl_\bl_\be_\bl_\b/_\bp_\bl_\bo_\bc_\ba_\bl_\bi_\bn_\bd_\be_\bx_\b._\bh_\bh>\n _\bG_\bo_\b _\bt_\bo_\b _\bt_\bh_\be_\b _\bs_\bo_\bu_\br_\bc_\be_\b _\bc_\bo_\bd_\be_\b _\bo_\bf_\b _\bt_\bh_\bi_\bs_\b _\bf_\bi_\bl_\be_\b.\n C\bCl\bla\bas\bss\bse\bes\bs\n-class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bM_\bP_\bI_\bG_\bu_\ba_\br_\bd_\bE_\br_\br_\bo_\br\n-\u00a0 This exception is thrown if the _\bM_\bP_\bI_\bG_\bu_\ba_\br_\bd detects an error on a remote\n- process. _\bM_\bo_\br_\be_\b._\b._\b.\n-\u00a0\n-class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bM_\bP_\bI_\bG_\bu_\ba_\br_\bd\n-\u00a0 detects a thrown exception and communicates to all other processes\n- _\bM_\bo_\br_\be_\b._\b._\b.\n+class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bM_\bP_\bI_\bT_\br_\ba_\bi_\bt_\bs_\b<_\b _\bI_\bn_\bd_\be_\bx_\bP_\ba_\bi_\br_\b<_\b _\bT_\bG_\b,_\b _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bL_\bo_\bc_\ba_\bl_\bI_\bn_\bd_\be_\bx_\b<_\b _\bT_\bA_\b _\b>_\b _\b>_\b _\b>\n+\u00a0\n+class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\be_\bx_\b<_\b _\bT_\b1_\b,_\b _\bT_\b2_\b _\b>\n+\u00a0 Information about an index residing on another processor. _\bM_\bo_\br_\be_\b._\b._\b.\n+\u00a0\n+class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\bi_\bc_\be_\bs_\b<_\b _\bT_\b,_\b _\bA_\b _\b>\n+\u00a0 The indices present on remote processes. _\bM_\bo_\br_\be_\b._\b._\b.\n+\u00a0\n+class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\be_\bx_\bL_\bi_\bs_\bt_\bM_\bo_\bd_\bi_\bf_\bi_\be_\br_\b<_\b _\bT_\b,_\b _\bA_\b,_\b _\bm_\bo_\bd_\be_\b _\b>\n+\u00a0 Modifier for adding and/or deleting remote indices from the remote\n+ index list. _\bM_\bo_\br_\be_\b._\b._\b.\n+\u00a0\n+class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\be_\bx_\bL_\bi_\bs_\bt_\bM_\bo_\bd_\bi_\bf_\bi_\be_\br_\b<_\b _\bT_\b,_\b _\bA_\b,_\b _\bm_\bo_\bd_\be_\b _\b>_\b:_\b:_\bI_\bn_\bv_\ba_\bl_\bi_\bd_\bP_\bo_\bs_\bi_\bt_\bi_\bo_\bn\n+\u00a0\n+class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bl_\bl_\be_\bc_\bt_\bi_\bv_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b<_\b _\bT_\b,_\b _\bA_\b _\b>\n+\u00a0 A collective iterator for moving over the remote indices for all\n+ processes collectively. _\bM_\bo_\br_\be_\b._\b._\b.\n+\u00a0\n+class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bl_\bl_\be_\bc_\bt_\bi_\bv_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b<_\b _\bT_\b,_\b _\bA_\b _\b>_\b:_\b:_\bi_\bt_\be_\br_\ba_\bt_\bo_\br\n+\u00a0 Iterator over the valid underlying iterators. _\bM_\bo_\br_\be_\b._\b._\b.\n \u00a0\n N\bNa\bam\bme\bes\bsp\bpa\bac\bce\bes\bs\n namespace \u00a0 _\bD_\bu_\bn_\be\n \u00a0 _\bD_\bu_\bn_\be namespace.\n \u00a0\n+F\bFu\bun\bnc\bct\bti\bio\bon\bns\bs\n+template\n+std::ostream &\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b<_\b< (std::ostream &os, const _\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\be_\bx< T1, T2 >\n+ &index)\n+\u00a0\n+template\n+std::ostream &\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b<_\b< (std::ostream &os, const _\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\bi_\bc_\be_\bs< T, A >\n+ &indices)\n+\u00a0\n+template\n+std::ostream &\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b<_\b< (std::ostream &os, const _\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\be_\bx< TG, TA >\n+ &index)\n+\u00a0\n *\b**\b**\b**\b**\b* D\bDe\bet\bta\bai\bil\ble\bed\bd D\bDe\bes\bsc\bcr\bri\bip\bpt\bti\bio\bon\bn *\b**\b**\b**\b**\b*\n-Implements a MPIGuard which detects an error on a remote process.\n+Classes describing a distributed indexset.\n Author\n- Christian Engwer\n+ Markus Blatt\n ===============================================================================\n Generated by\u00a0_\b[_\bd_\bo_\bx_\by_\bg_\be_\bn_\b] 1.9.8\n"}]}, {"source1": "./usr/share/doc/libdune-common-doc/doxygen/a00056_source.html", "source2": "./usr/share/doc/libdune-common-doc/doxygen/a00056_source.html", "unified_diff": "@@ -1,15 +1,15 @@\n \n \n \n \n \n \n \n-dune-common: mpiguard.hh Source File\n+dune-common: remoteindices.hh Source File\n \n \n \n \n \n \n \n@@ -74,212 +74,1694 @@\n \n \n
    \n
    \n-
    mpiguard.hh
    \n+
    remoteindices.hh
    \n
    \n
    \n Go to the documentation of this file.
    1// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
    \n
    2// vi: set et ts=4 sw=2 sts=2:
    \n
    3// SPDX-FileCopyrightInfo: Copyright \u00a9 DUNE Project contributors, see file LICENSE.md in module root
    \n
    4// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception
    \n-
    5
    \n-
    13#ifndef DUNE_COMMON_PARALLEL_MPIGUARD_HH
    \n-
    14#define DUNE_COMMON_PARALLEL_MPIGUARD_HH
    \n-
    15
    \n-
    16#if HAVE_MPI
    \n-
    17#include <mpi.h>
    \n-
    18#endif
    \n+
    5#ifndef DUNE_COMMON_PARALLEL_REMOTEINDICES_HH
    \n+
    6#define DUNE_COMMON_PARALLEL_REMOTEINDICES_HH
    \n+
    7
    \n+
    8#if HAVE_MPI
    \n+
    9
    \n+
    10#include <cassert>
    \n+
    11#include <iostream>
    \n+
    12#include <ostream>
    \n+
    13#include <map>
    \n+
    14#include <memory>
    \n+
    15#include <set>
    \n+
    16#include <tuple>
    \n+
    17#include <utility>
    \n+
    18#include <vector>
    \n
    19
    \n-\n-\n-\n-\n-
    24
    \n-
    25namespace Dune
    \n-
    26{
    \n-
    27
    \n-
    28#ifndef DOXYGEN
    \n-
    29
    \n-
    30 /*
    \n-
    31 Interface class for the communication needed by MPIGuard
    \n-
    32 */
    \n-
    33 struct GuardCommunicator
    \n-
    34 {
    \n-
    35 // cleanup
    \n-
    36 virtual ~GuardCommunicator() {};
    \n-
    37 // all the communication methods we need
    \n-
    38 virtual int rank() = 0;
    \n-
    39 virtual int size() = 0;
    \n-
    40 virtual int sum(int i) = 0;
    \n-
    41 // create a new GuardCommunicator pointer
    \n-
    42 template <class C>
    \n-
    43 static GuardCommunicator * create(const Communication<C> & c);
    \n-
    44#if HAVE_MPI
    \n-
    45 inline
    \n-
    46 static GuardCommunicator * create(const MPI_Comm & c);
    \n-
    47#endif
    \n+
    20#include <mpi.h>
    \n+
    21
    \n+\n+
    23#include <dune/common/sllist.hh>
    \n+\n+\n+\n+\n+
    28
    \n+
    29namespace Dune {
    \n+
    41 template<typename TG, typename TA>
    \n+
    \n+\n+
    43 {
    \n+
    44 public:
    \n+
    45 inline static MPI_Datatype getType();
    \n+
    46 private:
    \n+
    47 static MPI_Datatype type;
    \n
    48 };
    \n+
    \n
    49
    \n-
    50 namespace {
    \n-
    51 /*
    \n-
    52 templated implementation of different communication classes
    \n-
    53 */
    \n-
    54 // the default class will always fail, due to the missing implementation of "sum"
    \n-
    55 template <class Imp>
    \n-
    56 struct GenericGuardCommunicator
    \n-
    57 : public GuardCommunicator
    \n-
    58 {};
    \n-
    59 // specialization for Communication
    \n-
    60 template <class T>
    \n-
    61 struct GenericGuardCommunicator< Communication<T> >
    \n-
    62 : public GuardCommunicator
    \n-
    63 {
    \n-
    64 const Communication<T> comm;
    \n-
    65 GenericGuardCommunicator(const Communication<T> & c) :
    \n-
    66 comm(c) {}
    \n-
    67 int rank() override { return comm.rank(); };
    \n-
    68 int size() override { return comm.size(); };
    \n-
    69 int sum(int i) override { return comm.sum(i); }
    \n-
    70 };
    \n-
    71
    \n-
    72#if HAVE_MPI
    \n-
    73 // specialization for MPI_Comm
    \n-
    74 template <>
    \n-
    75 struct GenericGuardCommunicator<MPI_Comm>
    \n-
    76 : public GenericGuardCommunicator< Communication<MPI_Comm> >
    \n-
    77 {
    \n-
    78 GenericGuardCommunicator(const MPI_Comm & c) :
    \n-
    79 GenericGuardCommunicator< Communication<MPI_Comm> >(
    \n-
    80 Communication<MPI_Comm>(c)) {}
    \n-
    81 };
    \n-
    82#endif
    \n-
    83 } // anonymous namespace
    \n-
    84
    \n-
    85 template<class C>
    \n-
    86 GuardCommunicator * GuardCommunicator::create(const Communication<C> & comm)
    \n-
    87 {
    \n-
    88 return new GenericGuardCommunicator< Communication<C> >(comm);
    \n-
    89 }
    \n-
    90
    \n-
    91#if HAVE_MPI
    \n-
    92 GuardCommunicator * GuardCommunicator::create(const MPI_Comm & comm)
    \n-
    93 {
    \n-
    94 return new GenericGuardCommunicator< Communication<MPI_Comm> >(comm);
    \n-
    95 }
    \n-
    96#endif
    \n-
    97
    \n-
    98#endif
    \n-
    99
    \n-
    103 class MPIGuardError : public ParallelError {};
    \n-
    104
    \n-
    \n-\n-
    138 {
    \n-
    139 GuardCommunicator * comm_;
    \n-
    140 bool active_;
    \n-
    141
    \n-
    142 // we don't want to copy this class
    \n-
    143 MPIGuard (const MPIGuard &);
    \n+
    50
    \n+
    51 template<typename T, typename A>
    \n+
    52 class RemoteIndices;
    \n+
    53
    \n+
    54 template<typename T1, typename T2>
    \n+
    55 class RemoteIndex;
    \n+
    56
    \n+
    57 // forward declaration needed for friend declaration.
    \n+
    58 template<typename T>
    \n+
    59 class IndicesSyncer;
    \n+
    60
    \n+
    61 template<typename T1, typename T2>
    \n+
    62 std::ostream& operator<<(std::ostream& os, const RemoteIndex<T1,T2>& index);
    \n+
    63
    \n+
    64
    \n+
    65 template<typename T, typename A, bool mode>
    \n+\n+
    67
    \n+
    68
    \n+
    72 template<typename T1, typename T2>
    \n+
    \n+\n+
    74 {
    \n+
    75 template<typename T>
    \n+
    76 friend class IndicesSyncer;
    \n+
    77
    \n+
    78 template<typename T, typename A, typename A1>
    \n+
    79 friend void repairLocalIndexPointers(std::map<int,SLList<std::pair<typename T::GlobalIndex, typename T::LocalIndex::Attribute>,A> >&,
    \n+\n+
    81 const T&);
    \n+
    82
    \n+
    83 template<typename T, typename A, bool mode>
    \n+\n+
    85
    \n+
    86 public:
    \n+
    91 typedef T1 GlobalIndex;
    \n+
    100 typedef T2 Attribute;
    \n+
    101
    \n+\n+\n+
    107
    \n+
    112 const Attribute attribute() const;
    \n+
    113
    \n+
    119 const PairType& localIndexPair() const;
    \n+
    120
    \n+
    124 RemoteIndex();
    \n+
    125
    \n+
    126
    \n+
    132 RemoteIndex(const T2& attribute,
    \n+
    133 const PairType* local);
    \n+
    134
    \n+
    135
    \n+
    141 RemoteIndex(const T2& attribute);
    \n+
    142
    \n+
    143 bool operator==(const RemoteIndex& ri) const;
    \n
    144
    \n-
    145 public:
    \n-
    \n-
    150 MPIGuard (bool active=true) :
    \n-
    151 comm_(GuardCommunicator::create(
    \n-
    152 MPIHelper::getCommunication())),
    \n-
    153 active_(active)
    \n-
    154 {}
    \n-
    \n-
    155
    \n-
    \n-
    161 MPIGuard (MPIHelper & m, bool active=true) :
    \n-
    162 comm_(GuardCommunicator::create(
    \n-
    163 m.getCommunication())),
    \n-
    164 active_(active)
    \n-
    165 {}
    \n-
    \n-
    166
    \n-
    177 template <class C>
    \n-
    \n-
    178 MPIGuard (const C & comm, bool active=true) :
    \n-
    179 comm_(GuardCommunicator::create(comm)),
    \n-
    180 active_(active)
    \n-
    181 {}
    \n-
    \n-
    182
    \n-
    183#if HAVE_MPI
    \n-
    \n-
    184 MPIGuard (const MPI_Comm & comm, bool active=true) :
    \n-
    185 comm_(GuardCommunicator::create(comm)),
    \n-
    186 active_(active)
    \n-
    187 {}
    \n-
    \n-
    188#endif
    \n-
    189
    \n-
    \n-\n-
    193 {
    \n-
    194 if (active_)
    \n-
    195 {
    \n-
    196 active_ = false;
    \n-
    197 finalize(false);
    \n-
    198 }
    \n-
    199 delete comm_;
    \n-
    200 }
    \n+
    145 bool operator!=(const RemoteIndex& ri) const;
    \n+
    146 private:
    \n+
    148 const PairType* localIndex_;
    \n+
    149
    \n+
    151 char attribute_;
    \n+
    152 };
    \n
    \n+
    153
    \n+
    154 template<class T, class A>
    \n+
    155 std::ostream& operator<<(std::ostream& os, const RemoteIndices<T,A>& indices);
    \n+
    156
    \n+
    157 class InterfaceBuilder;
    \n+
    158
    \n+
    159 template<class T, class A>
    \n+
    160 class CollectiveIterator;
    \n+
    161
    \n+
    162 // forward declaration needed for friend declaration.
    \n+
    163 template<class T>
    \n+
    164 class IndicesSyncer;
    \n+
    165
    \n+
    166 // forward declaration needed for friend declaration.
    \n+
    167 template<typename T1, typename T2>
    \n+\n+
    169
    \n+
    170
    \n+
    187 template<class T, class A=std::allocator<RemoteIndex<typename T::GlobalIndex,
    \n+
    188 typename T::LocalIndex::Attribute> > >
    \n+
    \n+\n+
    190 {
    \n+
    191 friend class InterfaceBuilder;
    \n+
    192 friend class IndicesSyncer<T>;
    \n+
    193 template<typename T1, typename A2, typename A1>
    \n+
    194 friend void repairLocalIndexPointers(std::map<int,SLList<std::pair<typename T1::GlobalIndex, typename T1::LocalIndex::Attribute>,A2> >&,
    \n+\n+
    196 const T1&);
    \n+
    197
    \n+
    198 template<class G, class T1, class T2>
    \n+\n+
    200 friend std::ostream& operator<<<>(std::ostream&, const RemoteIndices<T>&);
    \n
    201
    \n-
    \n-
    206 void reactivate() {
    \n-
    207 if (active_ == true)
    \n-
    208 finalize();
    \n-
    209 active_ = true;
    \n-
    210 }
    \n-
    \n-
    211
    \n-
    \n-
    222 void finalize(bool success = true)
    \n-
    223 {
    \n-
    224 int result = success ? 0 : 1;
    \n-
    225 bool was_active = active_;
    \n-
    226 active_ = false;
    \n-
    227 result = comm_->sum(result);
    \n-
    228 if (result>0 && was_active)
    \n-
    229 {
    \n-
    230 DUNE_THROW(MPIGuardError, "Terminating process "
    \n-
    231 << comm_->rank() << " due to "
    \n-
    232 << result << " remote error(s)");
    \n-
    233 }
    \n-
    234 }
    \n-
    \n-
    235 };
    \n-
    \n-
    236
    \n-
    237}
    \n-
    238
    \n-
    239#endif // DUNE_COMMON_PARALLEL_MPIGUARD_HH
    \n-
    Helpers for dealing with MPI.
    \n-
    Implements an utility class that provides collective communication methods for sequential programs.
    \n-
    Implements an utility class that provides MPI's collective communication methods.
    \n-
    A few common exception classes.
    \n+
    202 public:
    \n+
    203
    \n+\n+
    208
    \n+\n+
    212
    \n+\n+
    217
    \n+
    218
    \n+\n+
    223
    \n+
    227 typedef typename LocalIndex::Attribute Attribute;
    \n+
    228
    \n+\n+
    233
    \n+
    234
    \n+
    238 using Allocator = typename std::allocator_traits<A>::template rebind_alloc<RemoteIndex>;
    \n+
    239
    \n+\n+\n+
    243
    \n+
    245 typedef std::map<int, std::pair<RemoteIndexList*,RemoteIndexList*> >
    \n+\n+
    247
    \n+
    248 typedef typename RemoteIndexMap::const_iterator const_iterator;
    \n+
    249
    \n+
    267 inline RemoteIndices(const ParallelIndexSet& source, const ParallelIndexSet& destination,
    \n+
    268 const MPI_Comm& comm, const std::vector<int>& neighbours=std::vector<int>(), bool includeSelf=false);
    \n+
    269
    \n+\n+
    271
    \n+
    279 void setIncludeSelf(bool includeSelf);
    \n+
    280
    \n+
    297 void setIndexSets(const ParallelIndexSet& source, const ParallelIndexSet& destination,
    \n+
    298 const MPI_Comm& comm, const std::vector<int>& neighbours=std::vector<int>());
    \n+
    299
    \n+
    300 template<typename C>
    \n+
    \n+\n+
    302 {
    \n+
    303 neighbourIds.clear();
    \n+
    304 neighbourIds.insert(neighbours.begin(), neighbours.end());
    \n+
    305
    \n+
    306 }
    \n+
    \n+
    307
    \n+
    \n+
    308 const std::set<int>& getNeighbours() const
    \n+
    309 {
    \n+
    310 return neighbourIds;
    \n+
    311 }
    \n+
    \n+
    312
    \n+\n+
    317
    \n+
    327 template<bool ignorePublic>
    \n+
    328 void rebuild();
    \n+
    329
    \n+
    330 bool operator==(const RemoteIndices& ri) const;
    \n+
    331
    \n+
    339 inline bool isSynced() const;
    \n+
    340
    \n+
    344 inline MPI_Comm communicator() const;
    \n+
    345
    \n+
    360 template<bool mode, bool send>
    \n+\n+
    362
    \n+
    369 inline const_iterator find(int proc) const;
    \n+
    370
    \n+
    375 inline const_iterator begin() const;
    \n+
    376
    \n+
    381 inline const_iterator end() const;
    \n+
    382
    \n+
    386 template<bool send>
    \n+
    387 inline CollectiveIteratorT iterator() const;
    \n+
    388
    \n+
    392 inline void free();
    \n+
    393
    \n+
    398 inline int neighbours() const;
    \n+
    399
    \n+
    401 inline const ParallelIndexSet& sourceIndexSet() const;
    \n+
    402
    \n+
    404 inline const ParallelIndexSet& destinationIndexSet() const;
    \n+
    405
    \n+
    406 private:
    \n+
    408 RemoteIndices(const RemoteIndices&) = delete;
    \n+
    409
    \n+
    411 const ParallelIndexSet* source_;
    \n+
    412
    \n+
    414 const ParallelIndexSet* target_;
    \n+
    415
    \n+
    417 MPI_Comm comm_;
    \n+
    418
    \n+
    421 std::set<int> neighbourIds;
    \n+
    422
    \n+
    424 const static int commTag_=333;
    \n+
    425
    \n+
    430 int sourceSeqNo_;
    \n+
    431
    \n+
    436 int destSeqNo_;
    \n+
    437
    \n+
    441 bool publicIgnored;
    \n+
    442
    \n+
    446 bool firstBuild;
    \n+
    447
    \n+
    448 /*
    \n+
    449 * @brief If true, sending from indices of the processor to other
    \n+
    450 * indices on the same processor is enabled even if the same indexset is used
    \n+
    451 * on both the
    \n+
    452 * sending and receiving side.
    \n+
    453 */
    \n+
    454 bool includeSelf;
    \n+
    455
    \n+\n+
    458 PairType;
    \n+
    459
    \n+
    466 RemoteIndexMap remoteIndices_;
    \n+
    467
    \n+
    478 template<bool ignorePublic>
    \n+
    479 inline void buildRemote(bool includeSelf);
    \n+
    480
    \n+
    486 inline int noPublic(const ParallelIndexSet& indexSet);
    \n+
    487
    \n+
    499 template<bool ignorePublic>
    \n+
    500 inline void packEntries(PairType** myPairs, const ParallelIndexSet& indexSet,
    \n+
    501 char* p_out, MPI_Datatype type, int bufferSize,
    \n+
    502 int* position, int n);
    \n+
    503
    \n+
    517 inline void unpackIndices(RemoteIndexList& remote, int remoteEntries,
    \n+
    518 PairType** local, int localEntries, char* p_in,
    \n+
    519 MPI_Datatype type, int* position, int bufferSize,
    \n+
    520 bool fromOurself);
    \n+
    521
    \n+
    522 inline void unpackIndices(RemoteIndexList& send, RemoteIndexList& receive,
    \n+
    523 int remoteEntries, PairType** localSource,
    \n+
    524 int localSourceEntries, PairType** localDest,
    \n+
    525 int localDestEntries, char* p_in,
    \n+
    526 MPI_Datatype type, int* position, int bufferSize);
    \n+
    527
    \n+
    528 void unpackCreateRemote(char* p_in, PairType** sourcePairs, PairType** DestPairs,
    \n+
    529 int remoteProc, int sourcePublish, int destPublish,
    \n+
    530 int bufferSize, bool sendTwo, bool fromOurSelf=false);
    \n+
    531 };
    \n+
    \n+
    532
    \n+
    548 template<class T, class A, bool mode>
    \n+
    \n+\n+
    550 {
    \n+
    551
    \n+
    552 template<typename T1, typename A1>
    \n+
    553 friend class RemoteIndices;
    \n+
    554
    \n+
    555 public:
    \n+
    \n+\n+
    557 {};
    \n+
    \n+
    558
    \n+
    567 constexpr static bool MODIFYINDEXSET = mode;
    \n+
    568
    \n+\n+
    573
    \n+\n+
    578
    \n+\n+
    583
    \n+
    587 typedef typename LocalIndex::Attribute Attribute;
    \n+
    588
    \n+\n+
    593
    \n+
    597 typedef A Allocator;
    \n+
    598
    \n+\n+\n+
    602
    \n+\n+
    607
    \n+\n+
    612
    \n+
    626 void insert(const RemoteIndex& index);
    \n+
    627
    \n+
    628
    \n+
    643 void insert(const RemoteIndex& index, const GlobalIndex& global);
    \n+
    644
    \n+
    652 bool remove(const GlobalIndex& global);
    \n+
    653
    \n+\n+
    667
    \n+
    668
    \n+\n+
    670
    \n+
    \n+\n+
    676 : glist_()
    \n+
    677 {}
    \n+
    \n+
    678
    \n+
    679 private:
    \n+
    680
    \n+\n+
    687 RemoteIndexList& rList);
    \n+
    688
    \n+
    689 typedef SLList<GlobalIndex,Allocator> GlobalList;
    \n+
    690 typedef typename GlobalList::ModifyIterator GlobalModifyIterator;
    \n+
    691 RemoteIndexList* rList_;
    \n+
    692 const ParallelIndexSet* indexSet_;
    \n+
    693 GlobalList glist_;
    \n+
    694 ModifyIterator iter_;
    \n+
    695 GlobalModifyIterator giter_;
    \n+
    696 ConstIterator end_;
    \n+
    697 bool first_;
    \n+
    698 GlobalIndex last_;
    \n+
    699 };
    \n+
    \n+
    700
    \n+
    705 template<class T, class A>
    \n+
    \n+\n+
    707 {
    \n+
    708
    \n+
    712 typedef T ParallelIndexSet;
    \n+
    713
    \n+
    717 typedef typename ParallelIndexSet::GlobalIndex GlobalIndex;
    \n+
    718
    \n+
    722 typedef typename ParallelIndexSet::LocalIndex LocalIndex;
    \n+
    723
    \n+
    727 typedef typename LocalIndex::Attribute Attribute;
    \n+
    728
    \n+\n+
    731
    \n+
    733 using Allocator = typename std::allocator_traits<A>::template rebind_alloc<RemoteIndex>;
    \n+
    734
    \n+\n+
    737
    \n+
    739 typedef std::map<int,std::pair<typename RemoteIndexList::const_iterator,
    \n+
    740 const typename RemoteIndexList::const_iterator> >
    \n+
    741 Map;
    \n+
    742
    \n+
    743 public:
    \n+
    744
    \n+
    746 typedef std::map<int, std::pair<RemoteIndexList*,RemoteIndexList*> >
    \n+\n+
    748
    \n+
    754 inline CollectiveIterator(const RemoteIndexMap& map_, bool send);
    \n+
    755
    \n+
    764 inline void advance(const GlobalIndex& global);
    \n+
    765
    \n+
    775 inline void advance(const GlobalIndex& global, const Attribute& attribute);
    \n+
    776
    \n+\n+
    778
    \n+
    782 inline bool empty() const;
    \n+
    783
    \n+
    \n+\n+
    791 {
    \n+
    792 public:
    \n+
    793 typedef typename Map::iterator RealIterator;
    \n+
    794 typedef typename Map::iterator ConstRealIterator;
    \n+
    795
    \n+
    796
    \n+
    \n+
    798 iterator(const RealIterator& iter, const ConstRealIterator& end, GlobalIndex& index)
    \n+
    799 : iter_(iter), end_(end), index_(index), hasAttribute(false)
    \n+
    800 {
    \n+
    801 // Move to the first valid entry
    \n+
    802 while(iter_!=end_ && iter_->second.first->localIndexPair().global()!=index_)
    \n+
    803 ++iter_;
    \n+
    804 }
    \n+
    \n+
    805
    \n+
    \n+
    806 iterator(const RealIterator& iter, const ConstRealIterator& end, GlobalIndex index,
    \n+
    807 Attribute attribute)
    \n+
    808 : iter_(iter), end_(end), index_(index), attribute_(attribute), hasAttribute(true)
    \n+
    809 {
    \n+
    810 // Move to the first valid entry or the end
    \n+
    811 while(iter_!=end_ && (iter_->second.first->localIndexPair().global()!=index_
    \n+
    812 || iter_->second.first->localIndexPair().local().attribute()!=attribute))
    \n+
    813 ++iter_;
    \n+
    814 }
    \n+
    \n+
    \n+
    816 iterator(const iterator& other)
    \n+
    817 : iter_(other.iter_), end_(other.end_), index_(other.index_)
    \n+
    818 { }
    \n+
    \n+
    819
    \n+
    \n+\n+
    822 {
    \n+
    823 ++iter_;
    \n+
    824 // If entry is not valid move on
    \n+
    825 while(iter_!=end_ && (iter_->second.first->localIndexPair().global()!=index_ ||
    \n+
    826 (hasAttribute &&
    \n+
    827 iter_->second.first->localIndexPair().local().attribute()!=attribute_)))
    \n+
    828 ++iter_;
    \n+
    829 assert(iter_==end_ ||
    \n+
    830 (iter_->second.first->localIndexPair().global()==index_));
    \n+
    831 assert(iter_==end_ || !hasAttribute ||
    \n+
    832 (iter_->second.first->localIndexPair().local().attribute()==attribute_));
    \n+
    833 return *this;
    \n+
    834 }
    \n+
    \n+
    835
    \n+
    \n+
    837 const RemoteIndex& operator*() const
    \n+
    838 {
    \n+
    839 return *(iter_->second.first);
    \n+
    840 }
    \n+
    \n+
    841
    \n+
    \n+
    843 int process() const
    \n+
    844 {
    \n+
    845 return iter_->first;
    \n+
    846 }
    \n+
    \n+
    847
    \n+
    \n+
    849 const RemoteIndex* operator->() const
    \n+
    850 {
    \n+
    851 return iter_->second.first.operator->();
    \n+
    852 }
    \n+
    \n+
    853
    \n+
    \n+
    855 bool operator==(const iterator& other) const
    \n+
    856 {
    \n+
    857 return other.iter_==iter_;
    \n+
    858 }
    \n+
    \n+
    859
    \n+
    \n+
    861 bool operator!=(const iterator& other) const
    \n+
    862 {
    \n+
    863 return other.iter_!=iter_;
    \n+
    864 }
    \n+
    \n+
    865
    \n+
    866 private:
    \n+
    867 iterator();
    \n+
    868
    \n+
    869 RealIterator iter_;
    \n+
    870 RealIterator end_;
    \n+
    871 GlobalIndex index_;
    \n+
    872 Attribute attribute_;
    \n+
    873 bool hasAttribute;
    \n+
    874 };
    \n+
    \n+
    875
    \n+
    876 iterator begin();
    \n+
    877
    \n+
    878 iterator end();
    \n+
    879
    \n+
    880 private:
    \n+
    881
    \n+
    882 Map map_;
    \n+
    883 GlobalIndex index_;
    \n+
    884 Attribute attribute_;
    \n+
    885 bool noattribute;
    \n+
    886 };
    \n+
    \n+
    887
    \n+
    888 template<typename TG, typename TA>
    \n+
    \n+\n+
    890 {
    \n+
    891 if(type==MPI_DATATYPE_NULL) {
    \n+
    892 int length[2] = {1, 1};
    \n+
    893 MPI_Aint base;
    \n+
    894 MPI_Aint disp[2];
    \n+
    895 MPI_Datatype types[2] = {MPITraits<TG>::getType(),
    \n+\n+\n+
    898 MPI_Get_address(&rep, &base); // lower bound of the datatype
    \n+
    899 MPI_Get_address(&(rep.global_), &disp[0]);
    \n+
    900 MPI_Get_address(&(rep.local_), &disp[1]);
    \n+
    901 for (MPI_Aint& d : disp)
    \n+
    902 d -= base;
    \n+
    903
    \n+
    904 MPI_Datatype tmp;
    \n+
    905 MPI_Type_create_struct(2, length, disp, types, &tmp);
    \n+
    906
    \n+
    907 MPI_Type_create_resized(tmp, 0, sizeof(IndexPair<TG,ParallelLocalIndex<TA> >), &type);
    \n+
    908 MPI_Type_commit(&type);
    \n+
    909
    \n+
    910 MPI_Type_free(&tmp);
    \n+
    911 }
    \n+
    912 return type;
    \n+
    913 }
    \n+
    \n+
    914
    \n+
    915 template<typename TG, typename TA>
    \n+
    916 MPI_Datatype MPITraits<IndexPair<TG,ParallelLocalIndex<TA> > >::type=MPI_DATATYPE_NULL;
    \n+
    917
    \n+
    918 template<typename T1, typename T2>
    \n+
    \n+
    919 RemoteIndex<T1,T2>::RemoteIndex(const T2& attribute, const PairType* local)
    \n+
    920 : localIndex_(local), attribute_(static_cast<std::underlying_type_t<T2>>(attribute))
    \n+
    921 {}
    \n+
    \n+
    922
    \n+
    923 template<typename T1, typename T2>
    \n+
    \n+\n+
    925 : localIndex_(0), attribute_(static_cast<std::underlying_type_t<T2>>(attribute))
    \n+
    926 {}
    \n+
    \n+
    927
    \n+
    928 template<typename T1, typename T2>
    \n+
    \n+\n+
    930 : localIndex_(0), attribute_()
    \n+
    931 {}
    \n+
    \n+
    932 template<typename T1, typename T2>
    \n+
    \n+
    933 inline bool RemoteIndex<T1,T2>::operator==(const RemoteIndex& ri) const
    \n+
    934 {
    \n+
    935 return localIndex_==ri.localIndex_ && attribute_==ri.attribute_;
    \n+
    936 }
    \n+
    \n+
    937
    \n+
    938 template<typename T1, typename T2>
    \n+
    \n+
    939 inline bool RemoteIndex<T1,T2>::operator!=(const RemoteIndex& ri) const
    \n+
    940 {
    \n+
    941 return localIndex_!=ri.localIndex_ || attribute_!=ri.attribute_;
    \n+
    942 }
    \n+
    \n+
    943
    \n+
    944 template<typename T1, typename T2>
    \n+
    \n+
    945 inline const T2 RemoteIndex<T1,T2>::attribute() const
    \n+
    946 {
    \n+
    947 return T2(attribute_);
    \n+
    948 }
    \n+
    \n+
    949
    \n+
    950 template<typename T1, typename T2>
    \n+
    \n+\n+
    952 {
    \n+
    953 return *localIndex_;
    \n+
    954 }
    \n+
    \n+
    955
    \n+
    956 template<typename T, typename A>
    \n+
    \n+\n+
    958 const ParallelIndexSet& destination,
    \n+
    959 const MPI_Comm& comm,
    \n+
    960 const std::vector<int>& neighbours,
    \n+
    961 bool includeSelf_)
    \n+
    962 : source_(&source), target_(&destination), comm_(comm),
    \n+
    963 sourceSeqNo_(-1), destSeqNo_(-1), publicIgnored(false), firstBuild(true),
    \n+
    964 includeSelf(includeSelf_)
    \n+
    965 {
    \n+\n+
    967 }
    \n+
    \n+
    968
    \n+
    969 template<typename T, typename A>
    \n+
    \n+\n+
    971 {
    \n+
    972 includeSelf=b;
    \n+
    973 }
    \n+
    \n+
    974
    \n+
    975 template<typename T, typename A>
    \n+
    \n+\n+
    977 : source_(0), target_(0), sourceSeqNo_(-1),
    \n+
    978 destSeqNo_(-1), publicIgnored(false), firstBuild(true),
    \n+
    979 includeSelf(false)
    \n+
    980 {}
    \n+
    \n+
    981
    \n+
    982 template<class T, typename A>
    \n+
    \n+\n+
    984 const ParallelIndexSet& destination,
    \n+
    985 const MPI_Comm& comm,
    \n+
    986 const std::vector<int>& neighbours)
    \n+
    987 {
    \n+
    988 free();
    \n+
    989 source_ = &source;
    \n+
    990 target_ = &destination;
    \n+
    991 comm_ = comm;
    \n+
    992 firstBuild = true;
    \n+
    993 setNeighbours(neighbours);
    \n+
    994 }
    \n+
    \n+
    995
    \n+
    996 template<typename T, typename A>
    \n+\n+
    \n+\n+
    999 {
    \n+
    1000 return *source_;
    \n+
    1001 }
    \n+
    \n+
    1002
    \n+
    1003
    \n+
    1004 template<typename T, typename A>
    \n+\n+
    \n+\n+
    1007 {
    \n+
    1008 return *target_;
    \n+
    1009 }
    \n+
    \n+
    1010
    \n+
    1011
    \n+
    1012 template<typename T, typename A>
    \n+
    \n+\n+
    1014 {
    \n+
    1015 free();
    \n+
    1016 }
    \n+
    \n+
    1017
    \n+
    1018 template<typename T, typename A>
    \n+
    1019 template<bool ignorePublic>
    \n+
    \n+\n+
    1021 const ParallelIndexSet& indexSet,
    \n+
    1022 char* p_out, MPI_Datatype type,
    \n+
    1023 int bufferSize,
    \n+
    1024 int *position,
    \n+
    1025 [[maybe_unused]] int n)
    \n+
    1026 {
    \n+
    1027 // fill with own indices
    \n+
    1028 const auto end = indexSet.end();
    \n+
    1029
    \n+
    1030 //Now pack the source indices
    \n+
    1031 int i=0;
    \n+
    1032 for(auto index = indexSet.begin(); index != end; ++index)
    \n+
    1033 if(ignorePublic || index->local().isPublic()) {
    \n+
    1034
    \n+
    1035 MPI_Pack(const_cast<PairType*>(&(*index)), 1,
    \n+
    1036 type,
    \n+
    1037 p_out, bufferSize, position, comm_);
    \n+
    1038 pairs[i++] = const_cast<PairType*>(&(*index));
    \n+
    1039
    \n+
    1040 }
    \n+
    1041 assert(i==n);
    \n+
    1042 }
    \n+
    \n+
    1043
    \n+
    1044 template<typename T, typename A>
    \n+
    1045 inline int RemoteIndices<T,A>::noPublic(const ParallelIndexSet& indexSet)
    \n+
    1046 {
    \n+
    1047
    \n+
    1048 int noPublic=0;
    \n+
    1049
    \n+
    1050 const auto end=indexSet.end();
    \n+
    1051 for(auto index=indexSet.begin(); index!=end; ++index)
    \n+
    1052 if(index->local().isPublic())
    \n+
    1053 noPublic++;
    \n+
    1054
    \n+
    1055 return noPublic;
    \n+
    1056
    \n+
    1057 }
    \n+
    1058
    \n+
    1059
    \n+
    1060 template<typename T, typename A>
    \n+
    1061 inline void RemoteIndices<T,A>::unpackCreateRemote(char* p_in, PairType** sourcePairs,
    \n+
    1062 PairType** destPairs, int remoteProc,
    \n+
    1063 int sourcePublish, int destPublish,
    \n+
    1064 int bufferSize, bool sendTwo,
    \n+
    1065 bool fromOurSelf)
    \n+
    1066 {
    \n+
    1067
    \n+
    1068 // unpack the number of indices we received
    \n+
    1069 int noRemoteSource=-1, noRemoteDest=-1;
    \n+
    1070 char twoIndexSets=0;
    \n+
    1071 int position=0;
    \n+
    1072 // Did we receive two index sets?
    \n+
    1073 MPI_Unpack(p_in, bufferSize, &position, &twoIndexSets, 1, MPI_CHAR, comm_);
    \n+
    1074 // The number of source indices received
    \n+
    1075 MPI_Unpack(p_in, bufferSize, &position, &noRemoteSource, 1, MPI_INT, comm_);
    \n+
    1076 // The number of destination indices received
    \n+
    1077 MPI_Unpack(p_in, bufferSize, &position, &noRemoteDest, 1, MPI_INT, comm_);
    \n+
    1078
    \n+
    1079
    \n+
    1080 // Indices for which we receive
    \n+
    1081 RemoteIndexList* receive= new RemoteIndexList();
    \n+
    1082 // Indices for which we send
    \n+
    1083 RemoteIndexList* send=0;
    \n+
    1084
    \n+
    1085 MPI_Datatype type= MPITraits<PairType>::getType();
    \n+
    1086
    \n+
    1087 if(!twoIndexSets) {
    \n+
    1088 if(sendTwo) {
    \n+
    1089 send = new RemoteIndexList();
    \n+
    1090 // Create both remote index sets simultaneously
    \n+
    1091 unpackIndices(*send, *receive, noRemoteSource, sourcePairs, sourcePublish,
    \n+
    1092 destPairs, destPublish, p_in, type, &position, bufferSize);
    \n+
    1093 }else{
    \n+
    1094 // we only need one list
    \n+
    1095 unpackIndices(*receive, noRemoteSource, sourcePairs, sourcePublish,
    \n+
    1096 p_in, type, &position, bufferSize, fromOurSelf);
    \n+
    1097 send=receive;
    \n+
    1098 }
    \n+
    1099 }else{
    \n+
    1100
    \n+
    1101 int oldPos=position;
    \n+
    1102 // Two index sets received
    \n+
    1103 unpackIndices(*receive, noRemoteSource, destPairs, destPublish,
    \n+
    1104 p_in, type, &position, bufferSize, fromOurSelf);
    \n+
    1105 if(!sendTwo)
    \n+
    1106 //unpack source entries again as destination entries
    \n+
    1107 position=oldPos;
    \n+
    1108
    \n+
    1109 send = new RemoteIndexList();
    \n+
    1110 unpackIndices(*send, noRemoteDest, sourcePairs, sourcePublish,
    \n+
    1111 p_in, type, &position, bufferSize, fromOurSelf);
    \n+
    1112 }
    \n+
    1113
    \n+
    1114 if(receive->empty() && send->empty()) {
    \n+
    1115 if(send==receive) {
    \n+
    1116 delete send;
    \n+
    1117 }else{
    \n+
    1118 delete send;
    \n+
    1119 delete receive;
    \n+
    1120 }
    \n+
    1121 }else{
    \n+
    1122 remoteIndices_.insert(std::make_pair(remoteProc,
    \n+
    1123 std::make_pair(send,receive)));
    \n+
    1124 }
    \n+
    1125 }
    \n+
    1126
    \n+
    1127
    \n+
    1128 template<typename T, typename A>
    \n+
    1129 template<bool ignorePublic>
    \n+
    1130 inline void RemoteIndices<T,A>::buildRemote(bool includeSelf_)
    \n+
    1131 {
    \n+
    1132 // Processor configuration
    \n+
    1133 int rank, procs;
    \n+
    1134 MPI_Comm_rank(comm_, &rank);
    \n+
    1135 MPI_Comm_size(comm_, &procs);
    \n+
    1136
    \n+
    1137 // number of local indices to publish
    \n+
    1138 // The indices of the destination will be send.
    \n+
    1139 int sourcePublish, destPublish;
    \n+
    1140
    \n+
    1141 // Do we need to send two index sets?
    \n+
    1142 char sendTwo = (source_ != target_);
    \n+
    1143
    \n+
    1144 if(procs==1 && !(sendTwo || includeSelf_))
    \n+
    1145 // Nothing to communicate
    \n+
    1146 return;
    \n+
    1147
    \n+
    1148 sourcePublish = (ignorePublic) ? source_->size() : noPublic(*source_);
    \n+
    1149
    \n+
    1150 if(sendTwo)
    \n+
    1151 destPublish = (ignorePublic) ? target_->size() : noPublic(*target_);
    \n+
    1152 else
    \n+
    1153 // we only need to send one set of indices
    \n+
    1154 destPublish = 0;
    \n+
    1155
    \n+
    1156 int maxPublish, publish=sourcePublish+destPublish;
    \n+
    1157
    \n+
    1158 // Calculate maximum number of indices send
    \n+
    1159 MPI_Allreduce(&publish, &maxPublish, 1, MPI_INT, MPI_MAX, comm_);
    \n+
    1160
    \n+
    1161 // allocate buffers
    \n+
    1162 PairType** destPairs;
    \n+
    1163 PairType** sourcePairs = new PairType*[sourcePublish>0 ? sourcePublish : 1];
    \n+
    1164
    \n+
    1165 if(sendTwo)
    \n+
    1166 destPairs = new PairType*[destPublish>0 ? destPublish : 1];
    \n+
    1167 else
    \n+
    1168 destPairs=sourcePairs;
    \n+
    1169
    \n+
    1170 char** buffer = new char*[2];
    \n+
    1171 int bufferSize;
    \n+
    1172 int position=0;
    \n+
    1173 int intSize;
    \n+
    1174 int charSize;
    \n+
    1175
    \n+
    1176 // calculate buffer size
    \n+
    1177 MPI_Datatype type = MPITraits<PairType>::getType();
    \n+
    1178
    \n+
    1179 MPI_Pack_size(maxPublish, type, comm_,
    \n+
    1180 &bufferSize);
    \n+
    1181 MPI_Pack_size(1, MPI_INT, comm_,
    \n+
    1182 &intSize);
    \n+
    1183 MPI_Pack_size(1, MPI_CHAR, comm_,
    \n+
    1184 &charSize);
    \n+
    1185 // Our message will contain the following:
    \n+
    1186 // a bool whether two index sets where sent
    \n+
    1187 // the size of the source and the dest indexset,
    \n+
    1188 // then the source and destination indices
    \n+
    1189 bufferSize += 2 * intSize + charSize;
    \n+
    1190
    \n+
    1191 if(bufferSize<=0) bufferSize=1;
    \n+
    1192
    \n+
    1193 buffer[0] = new char[bufferSize];
    \n+
    1194 buffer[1] = new char[bufferSize];
    \n+
    1195
    \n+
    1196
    \n+
    1197 // pack entries into buffer[0], p_out below!
    \n+
    1198 MPI_Pack(&sendTwo, 1, MPI_CHAR, buffer[0], bufferSize, &position,
    \n+
    1199 comm_);
    \n+
    1200
    \n+
    1201 // The number of indices we send for each index set
    \n+
    1202 MPI_Pack(&sourcePublish, 1, MPI_INT, buffer[0], bufferSize, &position,
    \n+
    1203 comm_);
    \n+
    1204 MPI_Pack(&destPublish, 1, MPI_INT, buffer[0], bufferSize, &position,
    \n+
    1205 comm_);
    \n+
    1206
    \n+
    1207 // Now pack the source indices and setup the destination pairs
    \n+
    1208 packEntries<ignorePublic>(sourcePairs, *source_, buffer[0], type,
    \n+
    1209 bufferSize, &position, sourcePublish);
    \n+
    1210 // If necessary send the dest indices and setup the source pairs
    \n+
    1211 if(sendTwo)
    \n+
    1212 packEntries<ignorePublic>(destPairs, *target_, buffer[0], type,
    \n+
    1213 bufferSize, &position, destPublish);
    \n+
    1214
    \n+
    1215
    \n+
    1216 // Update remote indices for ourself
    \n+
    1217 if(sendTwo|| includeSelf_)
    \n+
    1218 unpackCreateRemote(buffer[0], sourcePairs, destPairs, rank, sourcePublish,
    \n+
    1219 destPublish, bufferSize, sendTwo, includeSelf_);
    \n+
    1220
    \n+
    1221 neighbourIds.erase(rank);
    \n+
    1222
    \n+
    1223 if(neighbourIds.size()==0)
    \n+
    1224 {
    \n+
    1225 Dune::dvverb<<rank<<": Sending messages in a ring"<<std::endl;
    \n+
    1226 // send messages in ring
    \n+
    1227 for(int proc=1; proc<procs; proc++) {
    \n+
    1228 // pointers to the current input and output buffers
    \n+
    1229 char* p_out = buffer[1-(proc%2)];
    \n+
    1230 char* p_in = buffer[proc%2];
    \n+
    1231
    \n+
    1232 MPI_Status status;
    \n+
    1233 if(rank%2==0) {
    \n+
    1234 MPI_Ssend(p_out, bufferSize, MPI_PACKED, (rank+1)%procs,
    \n+
    1235 commTag_, comm_);
    \n+
    1236 MPI_Recv(p_in, bufferSize, MPI_PACKED, (rank+procs-1)%procs,
    \n+
    1237 commTag_, comm_, &status);
    \n+
    1238 }else{
    \n+
    1239 MPI_Recv(p_in, bufferSize, MPI_PACKED, (rank+procs-1)%procs,
    \n+
    1240 commTag_, comm_, &status);
    \n+
    1241 MPI_Ssend(p_out, bufferSize, MPI_PACKED, (rank+1)%procs,
    \n+
    1242 commTag_, comm_);
    \n+
    1243 }
    \n+
    1244
    \n+
    1245
    \n+
    1246 // The process these indices are from
    \n+
    1247 int remoteProc = (rank+procs-proc)%procs;
    \n+
    1248
    \n+
    1249 unpackCreateRemote(p_in, sourcePairs, destPairs, remoteProc, sourcePublish,
    \n+
    1250 destPublish, bufferSize, sendTwo);
    \n+
    1251
    \n+
    1252 }
    \n+
    1253
    \n+
    1254 }
    \n+
    1255 else
    \n+
    1256 {
    \n+
    1257 MPI_Request* requests=new MPI_Request[neighbourIds.size()];
    \n+
    1258 MPI_Request* req=requests;
    \n+
    1259
    \n+
    1260 typedef typename std::set<int>::size_type size_type;
    \n+
    1261 size_type noNeighbours=neighbourIds.size();
    \n+
    1262
    \n+
    1263 // setup sends
    \n+
    1264 for(std::set<int>::iterator neighbour=neighbourIds.begin();
    \n+
    1265 neighbour!= neighbourIds.end(); ++neighbour) {
    \n+
    1266 // Only send the information to the neighbouring processors
    \n+
    1267 MPI_Issend(buffer[0], position , MPI_PACKED, *neighbour, commTag_, comm_, req++);
    \n+
    1268 }
    \n+
    1269
    \n+
    1270 //Test for received messages
    \n+
    1271
    \n+
    1272 for(size_type received=0; received <noNeighbours; ++received)
    \n+
    1273 {
    \n+
    1274 MPI_Status status;
    \n+
    1275 // probe for next message
    \n+
    1276 MPI_Probe(MPI_ANY_SOURCE, commTag_, comm_, &status);
    \n+
    1277 int remoteProc=status.MPI_SOURCE;
    \n+
    1278 int size;
    \n+
    1279 MPI_Get_count(&status, MPI_PACKED, &size);
    \n+
    1280 // receive message
    \n+
    1281 MPI_Recv(buffer[1], size, MPI_PACKED, remoteProc,
    \n+
    1282 commTag_, comm_, &status);
    \n+
    1283
    \n+
    1284 unpackCreateRemote(buffer[1], sourcePairs, destPairs, remoteProc, sourcePublish,
    \n+
    1285 destPublish, bufferSize, sendTwo);
    \n+
    1286 }
    \n+
    1287 // wait for completion of pending requests
    \n+
    1288 MPI_Status* statuses = new MPI_Status[neighbourIds.size()];
    \n+
    1289
    \n+
    1290 if(int(MPI_ERR_IN_STATUS)==MPI_Waitall(neighbourIds.size(), requests, statuses)) {
    \n+
    1291 for(size_type i=0; i < neighbourIds.size(); ++i)
    \n+
    1292 if(statuses[i].MPI_ERROR!=MPI_SUCCESS) {
    \n+
    1293 std::cerr<<rank<<": MPI_Error occurred while receiving message."<<std::endl;
    \n+
    1294 MPI_Abort(comm_, 999);
    \n+
    1295 }
    \n+
    1296 }
    \n+
    1297 delete[] requests;
    \n+
    1298 delete[] statuses;
    \n+
    1299 }
    \n+
    1300
    \n+
    1301
    \n+
    1302 // delete allocated memory
    \n+
    1303 if(destPairs!=sourcePairs)
    \n+
    1304 delete[] destPairs;
    \n+
    1305
    \n+
    1306 delete[] sourcePairs;
    \n+
    1307 delete[] buffer[0];
    \n+
    1308 delete[] buffer[1];
    \n+
    1309 delete[] buffer;
    \n+
    1310 }
    \n+
    1311
    \n+
    1312 template<typename T, typename A>
    \n+
    1313 inline void RemoteIndices<T,A>::unpackIndices(RemoteIndexList& remote,
    \n+
    1314 int remoteEntries,
    \n+
    1315 PairType** local,
    \n+
    1316 int localEntries,
    \n+
    1317 char* p_in,
    \n+
    1318 MPI_Datatype type,
    \n+
    1319 int* position,
    \n+
    1320 int bufferSize,
    \n+
    1321 bool fromOurSelf)
    \n+
    1322 {
    \n+
    1323 if(remoteEntries==0)
    \n+
    1324 return;
    \n+
    1325
    \n+
    1326 PairType index;
    \n+
    1327 MPI_Unpack(p_in, bufferSize, position, &index, 1,
    \n+
    1328 type, comm_);
    \n+
    1329 GlobalIndex oldGlobal=index.global();
    \n+
    1330 int n_in=0, localIndex=0;
    \n+
    1331
    \n+
    1332 //Check if we know the global index
    \n+
    1333 while(localIndex<localEntries) {
    \n+
    1334 if(local[localIndex]->global()==index.global()) {
    \n+
    1335 int oldLocalIndex=localIndex;
    \n+
    1336
    \n+
    1337 while(localIndex<localEntries &&
    \n+
    1338 local[localIndex]->global()==index.global()) {
    \n+
    1339 if(!fromOurSelf || index.local().attribute() !=
    \n+
    1340 local[localIndex]->local().attribute())
    \n+
    1341 // if index is from us it has to have a different attribute
    \n+
    1342 remote.push_back(RemoteIndex(index.local().attribute(),
    \n+
    1343 local[localIndex]));
    \n+
    1344 localIndex++;
    \n+
    1345 }
    \n+
    1346
    \n+
    1347 // unpack next remote index
    \n+
    1348 if((++n_in) < remoteEntries) {
    \n+
    1349 MPI_Unpack(p_in, bufferSize, position, &index, 1,
    \n+
    1350 type, comm_);
    \n+
    1351 if(index.global()==oldGlobal)
    \n+
    1352 // Restart comparison for the same global indices
    \n+
    1353 localIndex=oldLocalIndex;
    \n+
    1354 else
    \n+
    1355 oldGlobal=index.global();
    \n+
    1356 }else{
    \n+
    1357 // No more received indices
    \n+
    1358 break;
    \n+
    1359 }
    \n+
    1360 continue;
    \n+
    1361 }
    \n+
    1362
    \n+
    1363 if (local[localIndex]->global()<index.global()) {
    \n+
    1364 // compare with next entry in our list
    \n+
    1365 ++localIndex;
    \n+
    1366 }else{
    \n+
    1367 // We do not know the index, unpack next
    \n+
    1368 if((++n_in) < remoteEntries) {
    \n+
    1369 MPI_Unpack(p_in, bufferSize, position, &index, 1,
    \n+
    1370 type, comm_);
    \n+
    1371 oldGlobal=index.global();
    \n+
    1372 }else
    \n+
    1373 // No more received indices
    \n+
    1374 break;
    \n+
    1375 }
    \n+
    1376 }
    \n+
    1377
    \n+
    1378 // Unpack the other received indices without doing anything
    \n+
    1379 while(++n_in < remoteEntries)
    \n+
    1380 MPI_Unpack(p_in, bufferSize, position, &index, 1,
    \n+
    1381 type, comm_);
    \n+
    1382 }
    \n+
    1383
    \n+
    1384
    \n+
    1385 template<typename T, typename A>
    \n+
    1386 inline void RemoteIndices<T,A>::unpackIndices(RemoteIndexList& send,
    \n+
    1387 RemoteIndexList& receive,
    \n+
    1388 int remoteEntries,
    \n+
    1389 PairType** localSource,
    \n+
    1390 int localSourceEntries,
    \n+
    1391 PairType** localDest,
    \n+
    1392 int localDestEntries,
    \n+
    1393 char* p_in,
    \n+
    1394 MPI_Datatype type,
    \n+
    1395 int* position,
    \n+
    1396 int bufferSize)
    \n+
    1397 {
    \n+
    1398 int n_in=0, sourceIndex=0, destIndex=0;
    \n+
    1399
    \n+
    1400 //Check if we know the global index
    \n+
    1401 while(n_in<remoteEntries && (sourceIndex<localSourceEntries || destIndex<localDestEntries)) {
    \n+
    1402 // Unpack next index
    \n+
    1403 PairType index;
    \n+
    1404 MPI_Unpack(p_in, bufferSize, position, &index, 1,
    \n+
    1405 type, comm_);
    \n+
    1406 n_in++;
    \n+
    1407
    \n+
    1408 // Advance until global index in localSource and localDest are >= than the one in the unpacked index
    \n+
    1409 while(sourceIndex<localSourceEntries && localSource[sourceIndex]->global()<index.global())
    \n+
    1410 sourceIndex++;
    \n+
    1411
    \n+
    1412 while(destIndex<localDestEntries && localDest[destIndex]->global()<index.global())
    \n+
    1413 destIndex++;
    \n+
    1414
    \n+
    1415 // Add a remote index if we found the global index.
    \n+
    1416 if(sourceIndex<localSourceEntries && localSource[sourceIndex]->global()==index.global())
    \n+
    1417 send.push_back(RemoteIndex(index.local().attribute(),
    \n+
    1418 localSource[sourceIndex]));
    \n+
    1419
    \n+
    1420 if(destIndex < localDestEntries && localDest[destIndex]->global() == index.global())
    \n+
    1421 receive.push_back(RemoteIndex(index.local().attribute(),
    \n+
    1422 localDest[sourceIndex]));
    \n+
    1423 }
    \n+
    1424
    \n+
    1425 }
    \n+
    1426
    \n+
    1427 template<typename T, typename A>
    \n+
    \n+\n+
    1429 {
    \n+
    1430 auto lend = remoteIndices_.end();
    \n+
    1431 for(auto lists=remoteIndices_.begin(); lists != lend; ++lists) {
    \n+
    1432 if(lists->second.first==lists->second.second) {
    \n+
    1433 // there is only one remote index list.
    \n+
    1434 delete lists->second.first;
    \n+
    1435 }else{
    \n+
    1436 delete lists->second.first;
    \n+
    1437 delete lists->second.second;
    \n+
    1438 }
    \n+
    1439 }
    \n+
    1440 remoteIndices_.clear();
    \n+
    1441 firstBuild=true;
    \n+
    1442 }
    \n+
    \n+
    1443
    \n+
    1444 template<typename T, typename A>
    \n+
    \n+\n+
    1446 {
    \n+
    1447 return remoteIndices_.size();
    \n+
    1448 }
    \n+
    \n+
    1449
    \n+
    1450 template<typename T, typename A>
    \n+
    1451 template<bool ignorePublic>
    \n+
    \n+\n+
    1453 {
    \n+
    1454 // Test whether a rebuild is Needed.
    \n+
    1455 if(firstBuild ||
    \n+
    1456 ignorePublic!=publicIgnored || !
    \n+
    1457 isSynced()) {
    \n+
    1458 free();
    \n+
    1459
    \n+
    1460 buildRemote<ignorePublic>(includeSelf);
    \n+
    1461
    \n+
    1462 sourceSeqNo_ = source_->seqNo();
    \n+
    1463 destSeqNo_ = target_->seqNo();
    \n+
    1464 firstBuild=false;
    \n+
    1465 publicIgnored=ignorePublic;
    \n+
    1466 }
    \n+
    1467
    \n+
    1468
    \n+
    1469 }
    \n+
    \n+
    1470
    \n+
    1471 template<typename T, typename A>
    \n+
    \n+\n+
    1473 {
    \n+
    1474 return sourceSeqNo_==source_->seqNo() && destSeqNo_ ==target_->seqNo();
    \n+
    1475 }
    \n+
    \n+
    1476
    \n+
    1477 template<typename T, typename A>
    \n+
    1478 template<bool mode, bool send>
    \n+
    \n+\n+
    1480 {
    \n+
    1481
    \n+
    1482 // The user are on their own now!
    \n+
    1483 // We assume they know what they are doing and just set the
    \n+
    1484 // remote indices to synced status.
    \n+
    1485 sourceSeqNo_ = source_->seqNo();
    \n+
    1486 destSeqNo_ = target_->seqNo();
    \n+
    1487
    \n+
    1488 typename RemoteIndexMap::iterator found = remoteIndices_.find(process);
    \n+
    1489
    \n+
    1490 if(found == remoteIndices_.end())
    \n+
    1491 {
    \n+
    1492 if(source_ != target_)
    \n+
    1493 found = remoteIndices_.insert(found, std::make_pair(process,
    \n+
    1494 std::make_pair(new RemoteIndexList(),
    \n+
    1495 new RemoteIndexList())));
    \n+
    1496 else{
    \n+
    1497 RemoteIndexList* rlist = new RemoteIndexList();
    \n+
    1498 found = remoteIndices_.insert(found,
    \n+
    1499 std::make_pair(process,
    \n+
    1500 std::make_pair(rlist, rlist)));
    \n+
    1501 }
    \n+
    1502 }
    \n+
    1503
    \n+
    1504 firstBuild = false;
    \n+
    1505
    \n+
    1506 if(send)
    \n+
    1507 return RemoteIndexListModifier<T,A,mode>(*source_, *(found->second.first));
    \n+
    1508 else
    \n+
    1509 return RemoteIndexListModifier<T,A,mode>(*target_, *(found->second.second));
    \n+
    1510 }
    \n+
    \n+
    1511
    \n+
    1512 template<typename T, typename A>
    \n+\n+
    \n+\n+
    1515 {
    \n+
    1516 return remoteIndices_.find(proc);
    \n+
    1517 }
    \n+
    \n+
    1518
    \n+
    1519 template<typename T, typename A>
    \n+\n+
    \n+\n+
    1522 {
    \n+
    1523 return remoteIndices_.begin();
    \n+
    1524 }
    \n+
    \n+
    1525
    \n+
    1526 template<typename T, typename A>
    \n+\n+
    \n+\n+
    1529 {
    \n+
    1530 return remoteIndices_.end();
    \n+
    1531 }
    \n+
    \n+
    1532
    \n+
    1533
    \n+
    1534 template<typename T, typename A>
    \n+
    \n+\n+
    1536 {
    \n+
    1537 if(neighbours()!=ri.neighbours())
    \n+
    1538 return false;
    \n+
    1539
    \n+
    1540 const auto rend = remoteIndices_.end();
    \n+
    1541
    \n+
    1542 for(auto rindex = remoteIndices_.begin(), rindex1=ri.remoteIndices_.begin(); rindex!=rend; ++rindex, ++rindex1) {
    \n+
    1543 if(rindex->first != rindex1->first)
    \n+
    1544 return false;
    \n+
    1545 if(*(rindex->second.first) != *(rindex1->second.first))
    \n+
    1546 return false;
    \n+
    1547 if(*(rindex->second.second) != *(rindex1->second.second))
    \n+
    1548 return false;
    \n+
    1549 }
    \n+
    1550 return true;
    \n+
    1551 }
    \n+
    \n+
    1552
    \n+
    1553 template<class T, class A, bool mode>
    \n+\n+
    1555 RemoteIndexList& rList)
    \n+
    1556 : rList_(&rList), indexSet_(&indexSet), iter_(rList.beginModify()), end_(rList.end()), first_(true)
    \n+
    1557 {
    \n+
    1558 if(MODIFYINDEXSET) {
    \n+
    1559 assert(indexSet_);
    \n+
    1560 for(ConstIterator iter=iter_; iter != end_; ++iter)
    \n+
    1561 glist_.push_back(iter->localIndexPair().global());
    \n+
    1562 giter_ = glist_.beginModify();
    \n+
    1563 }
    \n+
    1564 }
    \n+
    1565
    \n+
    1566 template<typename T, typename A, bool mode>
    \n+
    \n+\n+
    1568 : rList_(other.rList_), indexSet_(other.indexSet_),
    \n+
    1569 glist_(other.glist_), iter_(other.iter_), giter_(other.giter_), end_(other.end_),
    \n+
    1570 first_(other.first_), last_(other.last_)
    \n+
    1571 {}
    \n+
    \n+
    1572
    \n+
    1573 template<typename T, typename A, bool mode>
    \n+
    \n+\n+
    1575 {
    \n+
    1576 if(MODIFYINDEXSET) {
    \n+
    1577 // repair pointers to local index set.
    \n+
    1578#ifdef DUNE_ISTL_WITH_CHECKING
    \n+
    1579 if(indexSet_->state()!=GROUND)
    \n+
    1580 DUNE_THROW(InvalidIndexSetState, "Index has to be in ground mode for repairing pointers to indices");
    \n+
    1581#endif
    \n+
    1582 auto giter = glist_.begin();
    \n+
    1583 auto index = indexSet_->begin();
    \n+
    1584
    \n+
    1585 for(auto iter=rList_->begin(); iter != end_; ++iter) {
    \n+
    1586 while(index->global()<*giter) {
    \n+
    1587 ++index;
    \n+
    1588#ifdef DUNE_ISTL_WITH_CHECKING
    \n+
    1589 if(index == indexSet_->end())
    \n+
    1590 DUNE_THROW(InvalidPosition, "No such global index in set!");
    \n+
    1591#endif
    \n+
    1592 }
    \n+
    1593
    \n+
    1594#ifdef DUNE_ISTL_WITH_CHECKING
    \n+
    1595 if(index->global() != *giter)
    \n+
    1596 DUNE_THROW(InvalidPosition, "No such global index in set!");
    \n+
    1597#endif
    \n+
    1598 iter->localIndex_ = &(*index);
    \n+
    1599 }
    \n+
    1600 }
    \n+
    1601 }
    \n+
    \n+
    1602
    \n+
    1603 template<typename T, typename A, bool mode>
    \n+
    \n+\n+
    1605 {
    \n+
    1606 static_assert(!mode,"Not allowed if the mode indicates that new indices"
    \n+
    1607 "might be added to the underlying index set. Use "
    \n+
    1608 "insert(const RemoteIndex&, const GlobalIndex&) instead");
    \n+
    1609
    \n+
    1610#ifdef DUNE_ISTL_WITH_CHECKING
    \n+
    1611 if(!first_ && index.localIndexPair().global()<last_)
    \n+
    1612 DUNE_THROW(InvalidPosition, "Modification of remote indices have to occur with ascending global index.");
    \n+
    1613#endif
    \n+
    1614 // Move to the correct position
    \n+
    1615 while(iter_ != end_ && iter_->localIndexPair().global() < index.localIndexPair().global()) {
    \n+
    1616 ++iter_;
    \n+
    1617 }
    \n+
    1618
    \n+
    1619 // No duplicate entries allowed
    \n+
    1620 assert(iter_==end_ || iter_->localIndexPair().global() != index.localIndexPair().global());
    \n+
    1621 iter_.insert(index);
    \n+
    1622 last_ = index.localIndexPair().global();
    \n+
    1623 first_ = false;
    \n+
    1624 }
    \n+
    \n+
    1625
    \n+
    1626 template<typename T, typename A, bool mode>
    \n+
    \n+\n+
    1628 {
    \n+
    1629 static_assert(mode,"Not allowed if the mode indicates that no new indices"
    \n+
    1630 "might be added to the underlying index set. Use "
    \n+
    1631 "insert(const RemoteIndex&) instead");
    \n+
    1632#ifdef DUNE_ISTL_WITH_CHECKING
    \n+
    1633 if(!first_ && global<last_)
    \n+
    1634 DUNE_THROW(InvalidPosition, "Modification of remote indices have to occur with ascending global index.");
    \n+
    1635#endif
    \n+
    1636 // Move to the correct position
    \n+
    1637 while(iter_ != end_ && *giter_ < global) {
    \n+
    1638 ++giter_;
    \n+
    1639 ++iter_;
    \n+
    1640 }
    \n+
    1641
    \n+
    1642 // No duplicate entries allowed
    \n+
    1643 assert(iter_->localIndexPair().global() != global);
    \n+
    1644 iter_.insert(index);
    \n+
    1645 giter_.insert(global);
    \n+
    1646
    \n+
    1647 last_ = global;
    \n+
    1648 first_ = false;
    \n+
    1649 }
    \n+
    \n+
    1650
    \n+
    1651 template<typename T, typename A, bool mode>
    \n+
    \n+\n+
    1653 {
    \n+
    1654#ifdef DUNE_ISTL_WITH_CHECKING
    \n+
    1655 if(!first_ && global<last_)
    \n+
    1656 DUNE_THROW(InvalidPosition, "Modification of remote indices have to occur with ascending global index.");
    \n+
    1657#endif
    \n+
    1658
    \n+
    1659 bool found= false;
    \n+
    1660
    \n+
    1661 if(MODIFYINDEXSET) {
    \n+
    1662 // Move to the correct position
    \n+
    1663 while(iter_!=end_ && *giter_< global) {
    \n+
    1664 ++giter_;
    \n+
    1665 ++iter_;
    \n+
    1666 }
    \n+
    1667 if(*giter_ == global) {
    \n+
    1668 giter_.remove();
    \n+
    1669 iter_.remove();
    \n+
    1670 found=true;
    \n+
    1671 }
    \n+
    1672 }else{
    \n+
    1673 while(iter_!=end_ && iter_->localIndexPair().global() < global)
    \n+
    1674 ++iter_;
    \n+
    1675
    \n+
    1676 if(iter_->localIndexPair().global()==global) {
    \n+
    1677 iter_.remove();
    \n+
    1678 found = true;
    \n+
    1679 }
    \n+
    1680 }
    \n+
    1681
    \n+
    1682 last_ = global;
    \n+
    1683 first_ = false;
    \n+
    1684 return found;
    \n+
    1685 }
    \n+
    \n+
    1686
    \n+
    1687 template<typename T, typename A>
    \n+
    1688 template<bool send>
    \n+
    \n+\n+
    1690 {
    \n+
    1691 return CollectiveIterator<T,A>(remoteIndices_, send);
    \n+
    1692 }
    \n+
    \n+
    1693
    \n+
    1694 template<typename T, typename A>
    \n+
    \n+
    1695 inline MPI_Comm RemoteIndices<T,A>::communicator() const
    \n+
    1696 {
    \n+
    1697 return comm_;
    \n+
    1698
    \n+
    1699 }
    \n+
    \n+
    1700
    \n+
    1701 template<typename T, typename A>
    \n+
    \n+\n+
    1703 {
    \n+
    1704
    \n+
    1705 const auto end = pmap.end();
    \n+
    1706 for(auto process = pmap.begin(); process != end; ++process) {
    \n+
    1707 const RemoteIndexList* list = send ? process->second.first : process->second.second;
    \n+
    1708 using ri_iterator = typename RemoteIndexList::const_iterator;
    \n+
    1709 map_.insert(std::make_pair(process->first,
    \n+
    1710 std::pair<ri_iterator, const ri_iterator>(list->begin(), list->end())));
    \n+
    1711 }
    \n+
    1712 }
    \n+
    \n+
    1713
    \n+
    1714 template<typename T, typename A>
    \n+
    \n+
    1715 inline void CollectiveIterator<T,A>::advance(const GlobalIndex& index)
    \n+
    1716 {
    \n+
    1717 const auto end = map_.end();
    \n+
    1718
    \n+
    1719 for(auto iter = map_.begin(); iter != end;) {
    \n+
    1720 // Step the iterator until we are >= index
    \n+
    1721 typename RemoteIndexList::const_iterator current = iter->second.first;
    \n+
    1722 typename RemoteIndexList::const_iterator rend = iter->second.second;
    \n+
    1723 RemoteIndex remoteIndex;
    \n+
    1724 if(current != rend)
    \n+
    1725 remoteIndex = *current;
    \n+
    1726
    \n+
    1727 while(iter->second.first!=iter->second.second && iter->second.first->localIndexPair().global()<index)
    \n+
    1728 ++(iter->second.first);
    \n+
    1729
    \n+
    1730 // erase from the map if there are no more entries.
    \n+
    1731 if(iter->second.first == iter->second.second)
    \n+
    1732 map_.erase(iter++);
    \n+
    1733 else{
    \n+
    1734 ++iter;
    \n+
    1735 }
    \n+
    1736 }
    \n+
    1737 index_=index;
    \n+
    1738 noattribute=true;
    \n+
    1739 }
    \n+
    \n+
    1740
    \n+
    1741 template<typename T, typename A>
    \n+
    \n+
    1742 inline void CollectiveIterator<T,A>::advance(const GlobalIndex& index,
    \n+
    1743 const Attribute& attribute)
    \n+
    1744 {
    \n+
    1745 const auto end = map_.end();
    \n+
    1746
    \n+
    1747 for(auto iter = map_.begin(); iter != end;) {
    \n+
    1748 // Step the iterator until we are >= index
    \n+
    1749 typename RemoteIndexList::const_iterator current = iter->second.first;
    \n+
    1750 typename RemoteIndexList::const_iterator rend = iter->second.second;
    \n+
    1751 RemoteIndex remoteIndex;
    \n+
    1752 if(current != rend)
    \n+
    1753 remoteIndex = *current;
    \n+
    1754
    \n+
    1755 // Move to global index or bigger
    \n+
    1756 while(iter->second.first!=iter->second.second && iter->second.first->localIndexPair().global()<index)
    \n+
    1757 ++(iter->second.first);
    \n+
    1758
    \n+
    1759 // move to attribute or bigger
    \n+
    1760 while(iter->second.first!=iter->second.second
    \n+
    1761 && iter->second.first->localIndexPair().global()==index
    \n+
    1762 && iter->second.first->localIndexPair().local().attribute()<attribute)
    \n+
    1763 ++(iter->second.first);
    \n+
    1764
    \n+
    1765 // erase from the map if there are no more entries.
    \n+
    1766 if(iter->second.first == iter->second.second)
    \n+
    1767 map_.erase(iter++);
    \n+
    1768 else{
    \n+
    1769 ++iter;
    \n+
    1770 }
    \n+
    1771 }
    \n+
    1772 index_=index;
    \n+
    1773 attribute_=attribute;
    \n+
    1774 noattribute=false;
    \n+
    1775 }
    \n+
    \n+
    1776
    \n+
    1777 template<typename T, typename A>
    \n+
    \n+\n+
    1779 {
    \n+
    1780 const auto end = map_.end();
    \n+
    1781
    \n+
    1782 for(auto iter = map_.begin(); iter != end;) {
    \n+
    1783 // Step the iterator until we are >= index
    \n+
    1784 auto current = iter->second.first;
    \n+
    1785 auto rend = iter->second.second;
    \n+
    1786
    \n+
    1787 // move all iterators pointing to the current global index to next value
    \n+
    1788 if(iter->second.first->localIndexPair().global()==index_ &&
    \n+
    1789 (noattribute || iter->second.first->localIndexPair().local().attribute() == attribute_))
    \n+
    1790 ++(iter->second.first);
    \n+
    1791
    \n+
    1792 // erase from the map if there are no more entries.
    \n+
    1793 if(iter->second.first == iter->second.second)
    \n+
    1794 map_.erase(iter++);
    \n+
    1795 else{
    \n+
    1796 ++iter;
    \n+
    1797 }
    \n+
    1798 }
    \n+
    1799 return *this;
    \n+
    1800 }
    \n+
    \n+
    1801
    \n+
    1802 template<typename T, typename A>
    \n+
    \n+\n+
    1804 {
    \n+
    1805 return map_.empty();
    \n+
    1806 }
    \n+
    \n+
    1807
    \n+
    1808 template<typename T, typename A>
    \n+
    1809 inline typename CollectiveIterator<T,A>::iterator
    \n+
    \n+\n+
    1811 {
    \n+
    1812 if(noattribute)
    \n+
    1813 return iterator(map_.begin(), map_.end(), index_);
    \n+
    1814 else
    \n+
    1815 return iterator(map_.begin(), map_.end(), index_,
    \n+
    1816 attribute_);
    \n+
    1817 }
    \n+
    \n+
    1818
    \n+
    1819 template<typename T, typename A>
    \n+
    1820 inline typename CollectiveIterator<T,A>::iterator
    \n+
    \n+\n+
    1822 {
    \n+
    1823 return iterator(map_.end(), map_.end(), index_);
    \n+
    1824 }
    \n+
    \n+
    1825
    \n+
    1826 template<typename TG, typename TA>
    \n+
    \n+
    1827 inline std::ostream& operator<<(std::ostream& os, const RemoteIndex<TG,TA>& index)
    \n+
    1828 {
    \n+
    1829 os<<"[global="<<index.localIndexPair().global()<<", remote attribute="<<index.attribute()<<" local attribute="<<index.localIndexPair().local().attribute()<<"]";
    \n+
    1830 return os;
    \n+
    1831 }
    \n+
    \n+
    1832
    \n+
    1833 template<typename T, typename A>
    \n+
    \n+
    1834 inline std::ostream& operator<<(std::ostream& os, const RemoteIndices<T,A>& indices)
    \n+
    1835 {
    \n+
    1836 int rank;
    \n+
    1837 MPI_Comm_rank(indices.comm_, &rank);
    \n+
    1838 const auto rend = indices.remoteIndices_.end();
    \n+
    1839
    \n+
    1840 for(auto rindex = indices.remoteIndices_.begin(); rindex!=rend; ++rindex) {
    \n+
    1841 os<<rank<<": Process "<<rindex->first<<":";
    \n+
    1842
    \n+
    1843 if(!rindex->second.first->empty()) {
    \n+
    1844 os<<" send:";
    \n+
    1845
    \n+
    1846 const auto send= rindex->second.first->end();
    \n+
    1847
    \n+
    1848 for(auto index = rindex->second.first->begin();
    \n+
    1849 index != send; ++index)
    \n+
    1850 os<<*index<<" ";
    \n+
    1851 os<<std::endl;
    \n+
    1852 }
    \n+
    1853 if(!rindex->second.second->empty()) {
    \n+
    1854 os<<rank<<": Process "<<rindex->first<<": "<<"receive: ";
    \n+
    1855
    \n+
    1856 for(const auto& index : *(rindex->second.second))
    \n+
    1857 os << index << " ";
    \n+
    1858 }
    \n+
    1859 os<<std::endl<<std::flush;
    \n+
    1860 }
    \n+
    1861 return os;
    \n+
    1862 }
    \n+
    \n+
    1864}
    \n+
    1865
    \n+
    1866#endif // HAVE_MPI
    \n+
    1867#endif // DUNE_COMMON_PARALLEL_REMOTEINDICES_HH
    \n+
    Provides a map between global and local indices.
    \n+
    Provides classes for use as the local index in ParallelIndexSet for distributed computing.
    \n+
    Traits classes for mapping types onto MPI_Datatype.
    \n+
    Standard Dune debug streams.
    \n+
    Implements a singly linked list together with the necessary iterators.
    \n+
    A few common exception classes.
    \n+
    iterator end()
    Get an iterator pointing to the end of the list.
    Definition sllist.hh:774
    \n+
    SLListConstIterator< RemoteIndex, Allocator > const_iterator
    The constant iterator of the list.
    Definition sllist.hh:74
    \n+
    SLListModifyIterator< GlobalIndex, Allocator > ModifyIterator
    The type of the iterator capable of deletion and insertion.
    Definition sllist.hh:103
    \n+
    iterator begin()
    Get an iterator pointing to the first element in the list.
    Definition sllist.hh:762
    \n+
    std::ostream & operator<<(std::ostream &s, const bigunsignedint< k > &x)
    Definition bigunsignedint.hh:278
    \n
    #define DUNE_THROW(E, m)
    Definition exceptions.hh:218
    \n+
    void repairLocalIndexPointers()
    Repair the pointers to the local index pairs.
    Definition remoteindices.hh:1574
    \n+
    const Attribute attribute() const
    Get the attribute of the index on the remote process.
    Definition remoteindices.hh:945
    \n+
    RemoteIndices()
    Definition remoteindices.hh:976
    \n+
    CollectiveIterator & operator++()
    Definition remoteindices.hh:1778
    \n+
    void setIndexSets(const ParallelIndexSet &source, const ParallelIndexSet &destination, const MPI_Comm &comm, const std::vector< int > &neighbours=std::vector< int >())
    Set the index sets and communicator we work with.
    Definition remoteindices.hh:983
    \n+
    void free()
    Free the index lists.
    Definition remoteindices.hh:1428
    \n+
    void insert(const RemoteIndex &index)
    Insert an index to the list.
    Definition remoteindices.hh:1604
    \n+
    iterator end()
    Definition remoteindices.hh:1821
    \n+
    void rebuild()
    Rebuilds the set of remote indices.
    Definition remoteindices.hh:1452
    \n+
    bool operator==(const RemoteIndex &ri) const
    Definition remoteindices.hh:933
    \n+
    MPI_Comm communicator() const
    Get the mpi communicator used.
    Definition remoteindices.hh:1695
    \n+
    CollectiveIteratorT iterator() const
    Get an iterator for collectively iterating over the remote indices of all remote processes.
    Definition remoteindices.hh:1689
    \n+
    void setIncludeSelf(bool includeSelf)
    Tell whether sending from indices of the processor to other indices on the same processor is enabled ...
    Definition remoteindices.hh:970
    \n+
    CollectiveIterator(const RemoteIndexMap &map_, bool send)
    Constructor.
    Definition remoteindices.hh:1702
    \n+
    iterator begin()
    Get an iterator over the indices positioned at the first index.
    \n+
    iterator end()
    Get an iterator over the indices positioned after the last index.
    \n+
    const_iterator end() const
    Get an iterator over all remote index lists.
    Definition remoteindices.hh:1528
    \n+
    bool operator==(const RemoteIndices &ri) const
    Definition remoteindices.hh:1535
    \n+
    bool empty() const
    Checks whether there are still iterators in the map.
    Definition remoteindices.hh:1803
    \n+
    RemoteIndexListModifier< T, A, mode > getModifier(int process)
    Get a modifier for a remote index list.
    Definition remoteindices.hh:1479
    \n+
    void advance(const GlobalIndex &global)
    Advances all underlying iterators.
    Definition remoteindices.hh:1715
    \n+
    const PairType & localIndexPair() const
    Get the corresponding local index pair.
    Definition remoteindices.hh:951
    \n+
    const ParallelIndexSet & sourceIndexSet() const
    Get the index set at the source.
    Definition remoteindices.hh:998
    \n+
    ~RemoteIndices()
    Destructor.
    Definition remoteindices.hh:1013
    \n+
    TL LocalIndex
    The type of the local index, e.g. ParallelLocalIndex.
    Definition indexset.hh:239
    \n+
    bool remove(const GlobalIndex &global)
    Remove a remote index.
    Definition remoteindices.hh:1652
    \n+
    const GlobalIndex & global() const
    Get the global index.
    \n+
    RemoteIndex()
    Parameterless Constructor.
    Definition remoteindices.hh:929
    \n+
    int neighbours() const
    Get the number of processors we share indices with.
    Definition remoteindices.hh:1445
    \n+
    LocalIndex & local()
    Get the local index.
    \n+
    TG GlobalIndex
    the type of the global index. This type has to provide at least a operator< for sorting.
    Definition indexset.hh:226
    \n+
    const ParallelIndexSet & destinationIndexSet() const
    Get the index set at destination.
    Definition remoteindices.hh:1006
    \n+
    const_iterator find(int proc) const
    Find an iterator over the remote index lists of a specific process.
    Definition remoteindices.hh:1514
    \n+
    bool isSynced() const
    Checks whether the remote indices are synced with the indexsets.
    Definition remoteindices.hh:1472
    \n+
    bool operator!=(const RemoteIndex &ri) const
    Definition remoteindices.hh:939
    \n+
    const_iterator begin() const
    Get an iterator over all remote index lists.
    Definition remoteindices.hh:1521
    \n+
    iterator begin()
    Definition remoteindices.hh:1810
    \n+
    @ GROUND
    The default mode. Indicates that the index set is ready to be used.
    Definition indexset.hh:186
    \n+
    DVVerbType dvverb(std::cout)
    stream for very verbose output.
    Definition stdstreams.hh:96
    \n+
    STL namespace.
    \n
    Dune namespace.
    Definition alignedallocator.hh:13
    \n-
    Default exception if an error in the parallel communication of the program occurred.
    Definition exceptions.hh:287
    \n-
    This exception is thrown if the MPIGuard detects an error on a remote process.
    Definition mpiguard.hh:103
    \n-
    detects a thrown exception and communicates to all other processes
    Definition mpiguard.hh:138
    \n-
    void reactivate()
    reactivate the guard.
    Definition mpiguard.hh:206
    \n-
    void finalize(bool success=true)
    stop the guard.
    Definition mpiguard.hh:222
    \n-
    ~MPIGuard()
    destroy the guard and check for undetected exceptions
    Definition mpiguard.hh:192
    \n-
    MPIGuard(const C &comm, bool active=true)
    create an MPIGuard operating on an arbitrary communicator.
    Definition mpiguard.hh:178
    \n-
    MPIGuard(const MPI_Comm &comm, bool active=true)
    Definition mpiguard.hh:184
    \n-
    MPIGuard(bool active=true)
    create an MPIGuard operating on the Communicator of the global Dune::MPIHelper
    Definition mpiguard.hh:150
    \n-
    MPIGuard(MPIHelper &m, bool active=true)
    create an MPIGuard operating on the Communicator of a special Dune::MPIHelper m
    Definition mpiguard.hh:161
    \n-
    A real mpi helper.
    Definition mpihelper.hh:181
    \n+
    constexpr std::integral_constant< std::size_t, sizeof...(II)> size(std::integer_sequence< T, II... >)
    Return the size of the sequence.
    Definition integersequence.hh:75
    \n+
    A traits class describing the mapping of types onto MPI_Datatypes.
    Definition mpitraits.hh:41
    \n+
    static MPI_Datatype getType()
    Definition mpitraits.hh:48
    \n+
    Default exception class for range errors.
    Definition exceptions.hh:254
    \n+
    A pair consisting of a global and local index.
    Definition indexset.hh:85
    \n+
    Exception indicating that the index set is not in the expected state.
    Definition indexset.hh:205
    \n+
    Manager class for the mapping between local indices and globally unique indices.
    Definition indexset.hh:218
    \n+
    Class for recomputing missing indices of a distributed index set.
    Definition indicessyncer.hh:45
    \n+
    Base class of all classes representing a communication interface.
    Definition parallel/interface.hh:44
    \n+
    An index present on the local process with an additional attribute flag.
    Definition plocalindex.hh:52
    \n+
    The indices present on remote processes.
    Definition remoteindices.hh:190
    \n+
    const std::set< int > & getNeighbours() const
    Definition remoteindices.hh:308
    \n+
    Dune::RemoteIndex< GlobalIndex, Attribute > RemoteIndex
    Type of the remote indices we manage.
    Definition remoteindices.hh:232
    \n+
    friend void fillIndexSetHoles(const G &graph, Dune::OwnerOverlapCopyCommunication< T1, T2 > &oocomm)
    \n+
    friend void repairLocalIndexPointers(std::map< int, SLList< std::pair< typename T1::GlobalIndex, typename T1::LocalIndex::Attribute >, A2 > > &, RemoteIndices< T1, A1 > &, const T1 &)
    \n+
    ParallelIndexSet::GlobalIndex GlobalIndex
    The type of the global index.
    Definition remoteindices.hh:216
    \n+
    T ParallelIndexSet
    Type of the index set we use, e.g. ParallelLocalIndexSet.
    Definition remoteindices.hh:207
    \n+
    LocalIndex::Attribute Attribute
    The type of the attribute.
    Definition remoteindices.hh:227
    \n+
    std::map< int, std::pair< RemoteIndexList *, RemoteIndexList * > > RemoteIndexMap
    The type of the map from rank to remote index list.
    Definition remoteindices.hh:246
    \n+
    void setNeighbours(const C &neighbours)
    Definition remoteindices.hh:301
    \n+
    Dune::SLList< RemoteIndex, Allocator > RemoteIndexList
    The type of the remote index list.
    Definition remoteindices.hh:242
    \n+
    CollectiveIterator< T, A > CollectiveIteratorT
    The type of the collective iterator over all remote indices.
    Definition remoteindices.hh:211
    \n+
    typename std::allocator_traits< A >::template rebind_alloc< RemoteIndex > Allocator
    The type of the allocator for the remote index list.
    Definition remoteindices.hh:238
    \n+
    ParallelIndexSet::LocalIndex LocalIndex
    The type of the local index.
    Definition remoteindices.hh:222
    \n+
    RemoteIndexMap::const_iterator const_iterator
    Definition remoteindices.hh:248
    \n+
    Information about an index residing on another processor.
    Definition remoteindices.hh:74
    \n+
    friend void repairLocalIndexPointers(std::map< int, SLList< std::pair< typename T::GlobalIndex, typename T::LocalIndex::Attribute >, A > > &, RemoteIndices< T, A1 > &, const T &)
    \n+
    T1 GlobalIndex
    the type of the global index. This type has to provide at least a operator< for sorting.
    Definition remoteindices.hh:91
    \n+
    T2 Attribute
    The type of the attributes. Normally this will be an enumeration like.
    Definition remoteindices.hh:100
    \n+
    IndexPair< GlobalIndex, ParallelLocalIndex< Attribute > > PairType
    The type of the index pair.
    Definition remoteindices.hh:106
    \n+
    Modifier for adding and/or deleting remote indices from the remote index list.
    Definition remoteindices.hh:550
    \n+
    Dune::SLList< RemoteIndex, Allocator > RemoteIndexList
    The type of the remote index list.
    Definition remoteindices.hh:601
    \n+
    A Allocator
    The type of the allocator for the remote index list.
    Definition remoteindices.hh:597
    \n+
    ParallelIndexSet::GlobalIndex GlobalIndex
    The type of the global index.
    Definition remoteindices.hh:577
    \n+
    ParallelIndexSet::LocalIndex LocalIndex
    The type of the local index.
    Definition remoteindices.hh:582
    \n+
    RemoteIndexList::const_iterator ConstIterator
    The type of the remote index list iterator.
    Definition remoteindices.hh:611
    \n+
    SLListModifyIterator< RemoteIndex, Allocator > ModifyIterator
    The type of the modifying iterator of the remote index list.
    Definition remoteindices.hh:606
    \n+
    T ParallelIndexSet
    Type of the index set we use.
    Definition remoteindices.hh:572
    \n+
    RemoteIndexListModifier()
    Default constructor.
    Definition remoteindices.hh:675
    \n+
    LocalIndex::Attribute Attribute
    The type of the attribute.
    Definition remoteindices.hh:587
    \n+
    Dune::RemoteIndex< GlobalIndex, Attribute > RemoteIndex
    Type of the remote indices we manage.
    Definition remoteindices.hh:592
    \n+
    static constexpr bool MODIFYINDEXSET
    If true the index set corresponding to the remote indices might get modified.
    Definition remoteindices.hh:567
    \n+
    A collective iterator for moving over the remote indices for all processes collectively.
    Definition remoteindices.hh:707
    \n+
    std::map< int, std::pair< RemoteIndexList *, RemoteIndexList * > > RemoteIndexMap
    The type of the map from rank to remote index list.
    Definition remoteindices.hh:747
    \n+
    Definition remoteindices.hh:168
    \n+
    Definition remoteindices.hh:557
    \n+
    Iterator over the valid underlying iterators.
    Definition remoteindices.hh:791
    \n+
    iterator(const RealIterator &iter, const ConstRealIterator &end, GlobalIndex &index)
    Definition remoteindices.hh:798
    \n+
    iterator(const iterator &other)
    Definition remoteindices.hh:816
    \n+
    const RemoteIndex & operator*() const
    Definition remoteindices.hh:837
    \n+
    Map::iterator ConstRealIterator
    Definition remoteindices.hh:794
    \n+
    iterator & operator++()
    Definition remoteindices.hh:821
    \n+
    const RemoteIndex * operator->() const
    Definition remoteindices.hh:849
    \n+
    bool operator==(const iterator &other) const
    Definition remoteindices.hh:855
    \n+
    int process() const
    Definition remoteindices.hh:843
    \n+
    iterator(const RealIterator &iter, const ConstRealIterator &end, GlobalIndex index, Attribute attribute)
    Definition remoteindices.hh:806
    \n+
    bool operator!=(const iterator &other) const
    Definition remoteindices.hh:861
    \n+
    Map::iterator RealIterator
    Definition remoteindices.hh:793
    \n+
    A constant iterator for the SLList.
    Definition sllist.hh:371
    \n+
    A mutable iterator for the SLList.
    Definition sllist.hh:429
    \n+
    A single linked list.
    Definition sllist.hh:44
    \n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,231 +1,1930 @@\n dune-common\u00a02.10\n Loading...\n Searching...\n No Matches\n * _\bd_\bu_\bn_\be\n * _\bc_\bo_\bm_\bm_\bo_\bn\n * _\bp_\ba_\br_\ba_\bl_\bl_\be_\bl\n-mpiguard.hh\n+remoteindices.hh\n _\bG_\bo_\b _\bt_\bo_\b _\bt_\bh_\be_\b _\bd_\bo_\bc_\bu_\bm_\be_\bn_\bt_\ba_\bt_\bi_\bo_\bn_\b _\bo_\bf_\b _\bt_\bh_\bi_\bs_\b _\bf_\bi_\bl_\be_\b.\n 1// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-\n 2// vi: set et ts=4 sw=2 sts=2:\n 3// SPDX-FileCopyrightInfo: Copyright \u00c2\u00a9 DUNE Project contributors, see file\n LICENSE.md in module root\n 4// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception\n-5\n-13#ifndef DUNE_COMMON_PARALLEL_MPIGUARD_HH\n-14#define DUNE_COMMON_PARALLEL_MPIGUARD_HH\n-15\n-16#if HAVE_MPI\n-17#include \n-18#endif\n+5#ifndef DUNE_COMMON_PARALLEL_REMOTEINDICES_HH\n+6#define DUNE_COMMON_PARALLEL_REMOTEINDICES_HH\n+7\n+8#if HAVE_MPI\n+9\n+10#include \n+11#include \n+12#include \n+13#include \n+14#include \n+15#include \n+16#include \n+17#include \n+18#include \n 19\n-20#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\be_\bx_\bc_\be_\bp_\bt_\bi_\bo_\bn_\bs_\b._\bh_\bh>\n-21#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bp_\ba_\br_\ba_\bl_\bl_\be_\bl_\b/_\bc_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b._\bh_\bh>\n-22#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bp_\ba_\br_\ba_\bl_\bl_\be_\bl_\b/_\bm_\bp_\bi_\bc_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b._\bh_\bh>\n-23#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bp_\ba_\br_\ba_\bl_\bl_\be_\bl_\b/_\bm_\bp_\bi_\bh_\be_\bl_\bp_\be_\br_\b._\bh_\bh>\n-24\n-25namespace _\bD_\bu_\bn_\be\n-26{\n-27\n-28#ifndef DOXYGEN\n-29\n-30 /*\n-31 Interface class for the communication needed by MPIGuard\n-32 */\n-33 struct GuardCommunicator\n-34 {\n-35 // cleanup\n-36 virtual ~GuardCommunicator() {};\n-37 // all the communication methods we need\n-38 virtual int rank() = 0;\n-39 virtual int size() = 0;\n-40 virtual int sum(int i) = 0;\n-41 // create a new GuardCommunicator pointer\n-42 template \n-43 static GuardCommunicator * create(const Communication & c);\n-44#if HAVE_MPI\n-45 inline\n-46 static GuardCommunicator * create(const MPI_Comm & c);\n-47#endif\n+20#include \n+21\n+22#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\be_\bx_\bc_\be_\bp_\bt_\bi_\bo_\bn_\bs_\b._\bh_\bh>\n+23#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bs_\bl_\bl_\bi_\bs_\bt_\b._\bh_\bh>\n+24#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bs_\bt_\bd_\bs_\bt_\br_\be_\ba_\bm_\bs_\b._\bh_\bh>\n+25#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bp_\ba_\br_\ba_\bl_\bl_\be_\bl_\b/_\bi_\bn_\bd_\be_\bx_\bs_\be_\bt_\b._\bh_\bh>\n+26#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bp_\ba_\br_\ba_\bl_\bl_\be_\bl_\b/_\bm_\bp_\bi_\bt_\br_\ba_\bi_\bt_\bs_\b._\bh_\bh>\n+27#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bp_\ba_\br_\ba_\bl_\bl_\be_\bl_\b/_\bp_\bl_\bo_\bc_\ba_\bl_\bi_\bn_\bd_\be_\bx_\b._\bh_\bh>\n+28\n+29namespace _\bD_\bu_\bn_\be {\n+41 template\n+_\b4_\b2 class _\bM_\bP_\bI_\bT_\br_\ba_\bi_\bt_\bs<_\bI_\bn_\bd_\be_\bx_\bP_\ba_\bi_\br > >\n+43 {\n+44 public:\n+45 inline static MPI_Datatype _\bg_\be_\bt_\bT_\by_\bp_\be();\n+46 private:\n+47 static MPI_Datatype type;\n 48 };\n 49\n-50 namespace {\n-51 /*\n-52 templated implementation of different communication classes\n-53 */\n-54 // the default class will always fail, due to the missing implementation of\n-\"sum\"\n-55 template \n-56 struct GenericGuardCommunicator\n-57 : public GuardCommunicator\n-58 {};\n-59 // specialization for Communication\n-60 template \n-61 struct GenericGuardCommunicator< Communication >\n-62 : public GuardCommunicator\n-63 {\n-64 const Communication comm;\n-65 GenericGuardCommunicator(const Communication & c) :\n-66 comm(c) {}\n-67 int rank() override { return comm.rank(); };\n-68 int size() override { return comm.size(); };\n-69 int sum(int i) override { return comm.sum(i); }\n-70 };\n-71\n-72#if HAVE_MPI\n-73 // specialization for MPI_Comm\n-74 template <>\n-75 struct GenericGuardCommunicator\n-76 : public GenericGuardCommunicator< Communication >\n-77 {\n-78 GenericGuardCommunicator(const MPI_Comm & c) :\n-79 GenericGuardCommunicator< Communication >(\n-80 Communication(c)) {}\n-81 };\n-82#endif\n-83 } // anonymous namespace\n-84\n-85 template\n-86 GuardCommunicator * GuardCommunicator::create(const Communication & comm)\n-87 {\n-88 return new GenericGuardCommunicator< Communication >(comm);\n-89 }\n-90\n-91#if HAVE_MPI\n-92 GuardCommunicator * GuardCommunicator::create(const MPI_Comm & comm)\n-93 {\n-94 return new GenericGuardCommunicator< Communication >(comm);\n-95 }\n-96#endif\n-97\n-98#endif\n-99\n-_\b1_\b0_\b3 class _\bM_\bP_\bI_\bG_\bu_\ba_\br_\bd_\bE_\br_\br_\bo_\br : public _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bE_\br_\br_\bo_\br {};\n-104\n-_\b1_\b3_\b7 class _\bM_\bP_\bI_\bG_\bu_\ba_\br_\bd\n-138 {\n-139 GuardCommunicator * comm_;\n-140 bool active_;\n-141\n-142 // we don't want to copy this class\n-143 _\bM_\bP_\bI_\bG_\bu_\ba_\br_\bd (const _\bM_\bP_\bI_\bG_\bu_\ba_\br_\bd &);\n+50\n+51 template\n+52 class _\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\bi_\bc_\be_\bs;\n+53\n+54 template\n+55 class _\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\be_\bx;\n+56\n+57 // forward declaration needed for friend declaration.\n+58 template\n+59 class _\bI_\bn_\bd_\bi_\bc_\be_\bs_\bS_\by_\bn_\bc_\be_\br;\n+60\n+61 template\n+_\b6_\b2 std::ostream& _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b<_\b<(std::ostream& os, const _\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\be_\bx_\b<_\bT_\b1_\b,_\bT_\b2_\b>& index);\n+63\n+64\n+65 template\n+66 class _\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\be_\bx_\bL_\bi_\bs_\bt_\bM_\bo_\bd_\bi_\bf_\bi_\be_\br;\n+67\n+68\n+72 template\n+_\b7_\b3 class _\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\be_\bx\n+74 {\n+75 template\n+_\b7_\b6 friend class _\bI_\bn_\bd_\bi_\bc_\be_\bs_\bS_\by_\bn_\bc_\be_\br;\n+77\n+78 template\n+_\b7_\b9 friend void _\br_\be_\bp_\ba_\bi_\br_\bL_\bo_\bc_\ba_\bl_\bI_\bn_\bd_\be_\bx_\bP_\bo_\bi_\bn_\bt_\be_\br_\bs(std::map,A> >&,\n+80 _\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\bi_\bc_\be_\bs_\b<_\bT_\b,_\bA_\b1_\b>&,\n+81 const T&);\n+82\n+83 template\n+_\b8_\b4 friend class _\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\be_\bx_\bL_\bi_\bs_\bt_\bM_\bo_\bd_\bi_\bf_\bi_\be_\br;\n+85\n+86 public:\n+_\b9_\b1 typedef T1 _\bG_\bl_\bo_\bb_\ba_\bl_\bI_\bn_\bd_\be_\bx;\n+_\b1_\b0_\b0 typedef T2 _\bA_\bt_\bt_\br_\bi_\bb_\bu_\bt_\be;\n+101\n+105 typedef _\bI_\bn_\bd_\be_\bx_\bP_\ba_\bi_\br_\b<_\bG_\bl_\bo_\bb_\ba_\bl_\bI_\bn_\bd_\be_\bx_\b,_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bL_\bo_\bc_\ba_\bl_\bI_\bn_\bd_\be_\bx_\b<_\bA_\bt_\bt_\br_\bi_\bb_\bu_\bt_\be_\b> >\n+_\b1_\b0_\b6 _\bP_\ba_\bi_\br_\bT_\by_\bp_\be;\n+107\n+112 const _\bA_\bt_\bt_\br_\bi_\bb_\bu_\bt_\be _\ba_\bt_\bt_\br_\bi_\bb_\bu_\bt_\be() const;\n+113\n+119 const _\bP_\ba_\bi_\br_\bT_\by_\bp_\be& _\bl_\bo_\bc_\ba_\bl_\bI_\bn_\bd_\be_\bx_\bP_\ba_\bi_\br() const;\n+120\n+124 _\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\be_\bx();\n+125\n+126\n+132 _\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\be_\bx(const T2& _\ba_\bt_\bt_\br_\bi_\bb_\bu_\bt_\be,\n+133 const _\bP_\ba_\bi_\br_\bT_\by_\bp_\be* local);\n+134\n+135\n+141 _\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\be_\bx(const T2& _\ba_\bt_\bt_\br_\bi_\bb_\bu_\bt_\be);\n+142\n+143 bool _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b=_\b=(const _\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\be_\bx& ri) const;\n 144\n-145 public:\n-_\b1_\b5_\b0 _\bM_\bP_\bI_\bG_\bu_\ba_\br_\bd (bool active=true) :\n-151 comm_(GuardCommunicator::create(\n-152 _\bM_\bP_\bI_\bH_\be_\bl_\bp_\be_\br::getCommunication())),\n-153 active_(active)\n-154 {}\n-155\n-_\b1_\b6_\b1 _\bM_\bP_\bI_\bG_\bu_\ba_\br_\bd (_\bM_\bP_\bI_\bH_\be_\bl_\bp_\be_\br & m, bool active=true) :\n-162 comm_(GuardCommunicator::create(\n-163 m.getCommunication())),\n-164 active_(active)\n-165 {}\n-166\n-177 template \n-_\b1_\b7_\b8 _\bM_\bP_\bI_\bG_\bu_\ba_\br_\bd (const C & comm, bool active=true) :\n-179 comm_(GuardCommunicator::create(comm)),\n-180 active_(active)\n-181 {}\n-182\n-183#if HAVE_MPI\n-_\b1_\b8_\b4 _\bM_\bP_\bI_\bG_\bu_\ba_\br_\bd (const MPI_Comm & comm, bool active=true) :\n-185 comm_(GuardCommunicator::create(comm)),\n-186 active_(active)\n-187 {}\n-188#endif\n-189\n-_\b1_\b9_\b2 _\b~_\bM_\bP_\bI_\bG_\bu_\ba_\br_\bd()\n-193 {\n-194 if (active_)\n-195 {\n-196 active_ = false;\n-197 _\bf_\bi_\bn_\ba_\bl_\bi_\bz_\be(false);\n-198 }\n-199 delete comm_;\n-200 }\n+145 bool _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b!_\b=(const _\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\be_\bx& ri) const;\n+146 private:\n+148 const _\bP_\ba_\bi_\br_\bT_\by_\bp_\be* localIndex_;\n+149\n+151 char attribute_;\n+152 };\n+153\n+154 template\n+155 std::ostream& _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b<_\b<(std::ostream& os, const _\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\bi_\bc_\be_\bs_\b<_\bT_\b,_\bA_\b>&\n+indices);\n+156\n+157 class _\bI_\bn_\bt_\be_\br_\bf_\ba_\bc_\be_\bB_\bu_\bi_\bl_\bd_\be_\br;\n+158\n+159 template\n+160 class _\bC_\bo_\bl_\bl_\be_\bc_\bt_\bi_\bv_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br;\n+161\n+162 // forward declaration needed for friend declaration.\n+163 template\n+164 class _\bI_\bn_\bd_\bi_\bc_\be_\bs_\bS_\by_\bn_\bc_\be_\br;\n+165\n+166 // forward declaration needed for friend declaration.\n+167 template\n+_\b1_\b6_\b8 class _\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn;\n+169\n+170\n+187 template > >\n+_\b1_\b8_\b9 class _\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\bi_\bc_\be_\bs\n+190 {\n+_\b1_\b9_\b1 friend class _\bI_\bn_\bt_\be_\br_\bf_\ba_\bc_\be_\bB_\bu_\bi_\bl_\bd_\be_\br;\n+192 friend class _\bI_\bn_\bd_\bi_\bc_\be_\bs_\bS_\by_\bn_\bc_\be_\br;\n+193 template\n+_\b1_\b9_\b4 friend void _\br_\be_\bp_\ba_\bi_\br_\bL_\bo_\bc_\ba_\bl_\bI_\bn_\bd_\be_\bx_\bP_\bo_\bi_\bn_\bt_\be_\br_\bs(std::map,A2> >&,\n+195 _\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\bi_\bc_\be_\bs_\b<_\bT_\b1_\b,_\bA_\b1_\b>&,\n+196 const T1&);\n+197\n+198 template\n+_\b1_\b9_\b9 friend void _\bf_\bi_\bl_\bl_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt_\bH_\bo_\bl_\be_\bs(const G& graph, _\bD_\bu_\bn_\be_\b:_\b:\n+_\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b<_\bT_\b1_\b,_\bT_\b2_\b>& oocomm);\n+_\b2_\b0_\b0 friend std::ostream& operator<<<>(std::ostream&, const _\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\bi_\bc_\be_\bs_\b<_\bT_\b>&);\n 201\n-_\b2_\b0_\b6 void _\br_\be_\ba_\bc_\bt_\bi_\bv_\ba_\bt_\be() {\n-207 if (active_ == true)\n-208 _\bf_\bi_\bn_\ba_\bl_\bi_\bz_\be();\n-209 active_ = true;\n-210 }\n-211\n-_\b2_\b2_\b2 void _\bf_\bi_\bn_\ba_\bl_\bi_\bz_\be(bool success = true)\n-223 {\n-224 int result = success ? 0 : 1;\n-225 bool was_active = active_;\n-226 active_ = false;\n-227 result = comm_->sum(result);\n-228 if (result>0 && was_active)\n-229 {\n-230 _\bD_\bU_\bN_\bE_\b__\bT_\bH_\bR_\bO_\bW(_\bM_\bP_\bI_\bG_\bu_\ba_\br_\bd_\bE_\br_\br_\bo_\br, \"Terminating process \"\n-231 << comm_->rank() << \" due to \"\n-232 << result << \" remote error(s)\");\n-233 }\n-234 }\n-235 };\n-236\n-237}\n-238\n-239#endif // DUNE_COMMON_PARALLEL_MPIGUARD_HH\n-_\bm_\bp_\bi_\bh_\be_\bl_\bp_\be_\br_\b._\bh_\bh\n-Helpers for dealing with MPI.\n-_\bc_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b._\bh_\bh\n-Implements an utility class that provides collective communication methods for\n-sequential programs.\n-_\bm_\bp_\bi_\bc_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b._\bh_\bh\n-Implements an utility class that provides MPI's collective communication\n-methods.\n+202 public:\n+203\n+_\b2_\b0_\b7 typedef T _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt;\n+208\n+_\b2_\b1_\b1 typedef _\bC_\bo_\bl_\bl_\be_\bc_\bt_\bi_\bv_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b<_\bT_\b,_\bA_\b> _\bC_\bo_\bl_\bl_\be_\bc_\bt_\bi_\bv_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bT;\n+212\n+_\b2_\b1_\b6 typedef typename _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt_\b:_\b:_\bG_\bl_\bo_\bb_\ba_\bl_\bI_\bn_\bd_\be_\bx _\bG_\bl_\bo_\bb_\ba_\bl_\bI_\bn_\bd_\be_\bx;\n+217\n+218\n+_\b2_\b2_\b2 typedef typename _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt_\b:_\b:_\bL_\bo_\bc_\ba_\bl_\bI_\bn_\bd_\be_\bx _\bL_\bo_\bc_\ba_\bl_\bI_\bn_\bd_\be_\bx;\n+223\n+_\b2_\b2_\b7 typedef typename LocalIndex::Attribute _\bA_\bt_\bt_\br_\bi_\bb_\bu_\bt_\be;\n+228\n+_\b2_\b3_\b2 typedef _\bD_\bu_\bn_\be_\b:_\b:_\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\be_\bx_\b<_\bG_\bl_\bo_\bb_\ba_\bl_\bI_\bn_\bd_\be_\bx_\b,_\bA_\bt_\bt_\br_\bi_\bb_\bu_\bt_\be_\b> _\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\be_\bx;\n+233\n+234\n+_\b2_\b3_\b8 using _\bA_\bl_\bl_\bo_\bc_\ba_\bt_\bo_\br = typename std::allocator_traits::template\n+rebind_alloc;\n+239\n+241 typedef _\bD_\bu_\bn_\be_\b:_\b:_\bS_\bL_\bL_\bi_\bs_\bt_\b<_\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\be_\bx_\b,_\bA_\bl_\bl_\bo_\bc_\ba_\bt_\bo_\br_\b>\n+_\b2_\b4_\b2 _\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\be_\bx_\bL_\bi_\bs_\bt;\n+243\n+245 typedef std::map >\n+_\b2_\b4_\b6 _\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\be_\bx_\bM_\ba_\bp;\n+247\n+_\b2_\b4_\b8 typedef typename RemoteIndexMap::const_iterator _\bc_\bo_\bn_\bs_\bt_\b__\bi_\bt_\be_\br_\ba_\bt_\bo_\br;\n+249\n+267 inline _\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\bi_\bc_\be_\bs(const _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt& source, const\n+_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt& destination,\n+268 const MPI_Comm& comm, const std::vector& _\bn_\be_\bi_\bg_\bh_\bb_\bo_\bu_\br_\bs=std::vector\n+(), bool includeSelf=false);\n+269\n+270 _\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\bi_\bc_\be_\bs();\n+271\n+279 void _\bs_\be_\bt_\bI_\bn_\bc_\bl_\bu_\bd_\be_\bS_\be_\bl_\bf(bool includeSelf);\n+280\n+297 void _\bs_\be_\bt_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt_\bs(const _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt& source, const _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt&\n+destination,\n+298 const MPI_Comm& comm, const std::vector& _\bn_\be_\bi_\bg_\bh_\bb_\bo_\bu_\br_\bs=std::vector\n+());\n+299\n+300 template\n+_\b3_\b0_\b1 void _\bs_\be_\bt_\bN_\be_\bi_\bg_\bh_\bb_\bo_\bu_\br_\bs(const C& _\bn_\be_\bi_\bg_\bh_\bb_\bo_\bu_\br_\bs)\n+302 {\n+303 neighbourIds.clear();\n+304 neighbourIds.insert(_\bn_\be_\bi_\bg_\bh_\bb_\bo_\bu_\br_\bs.begin(), _\bn_\be_\bi_\bg_\bh_\bb_\bo_\bu_\br_\bs.end());\n+305\n+306 }\n+307\n+_\b3_\b0_\b8 const std::set& _\bg_\be_\bt_\bN_\be_\bi_\bg_\bh_\bb_\bo_\bu_\br_\bs() const\n+309 {\n+310 return neighbourIds;\n+311 }\n+312\n+316 _\b~_\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\bi_\bc_\be_\bs();\n+317\n+327 template\n+328 void _\br_\be_\bb_\bu_\bi_\bl_\bd();\n+329\n+330 bool _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b=_\b=(const _\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\bi_\bc_\be_\bs& ri) const;\n+331\n+339 inline bool _\bi_\bs_\bS_\by_\bn_\bc_\be_\bd() const;\n+340\n+344 inline MPI_Comm _\bc_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bo_\br() const;\n+345\n+360 template\n+361 inline _\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\be_\bx_\bL_\bi_\bs_\bt_\bM_\bo_\bd_\bi_\bf_\bi_\be_\br_\b<_\bT_\b,_\bA_\b,_\bm_\bo_\bd_\be_\b> _\bg_\be_\bt_\bM_\bo_\bd_\bi_\bf_\bi_\be_\br(int process);\n+362\n+369 inline _\bc_\bo_\bn_\bs_\bt_\b__\bi_\bt_\be_\br_\ba_\bt_\bo_\br _\bf_\bi_\bn_\bd(int proc) const;\n+370\n+375 inline _\bc_\bo_\bn_\bs_\bt_\b__\bi_\bt_\be_\br_\ba_\bt_\bo_\br _\bb_\be_\bg_\bi_\bn() const;\n+376\n+381 inline _\bc_\bo_\bn_\bs_\bt_\b__\bi_\bt_\be_\br_\ba_\bt_\bo_\br _\be_\bn_\bd() const;\n+382\n+386 template\n+387 inline _\bC_\bo_\bl_\bl_\be_\bc_\bt_\bi_\bv_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bT _\bi_\bt_\be_\br_\ba_\bt_\bo_\br() const;\n+388\n+392 inline void _\bf_\br_\be_\be();\n+393\n+398 inline int _\bn_\be_\bi_\bg_\bh_\bb_\bo_\bu_\br_\bs() const;\n+399\n+401 inline const _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt& _\bs_\bo_\bu_\br_\bc_\be_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt() const;\n+402\n+404 inline const _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt& _\bd_\be_\bs_\bt_\bi_\bn_\ba_\bt_\bi_\bo_\bn_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt() const;\n+405\n+406 private:\n+408 _\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\bi_\bc_\be_\bs(const _\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\bi_\bc_\be_\bs&) = delete;\n+409\n+411 const _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt* source_;\n+412\n+414 const _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt* target_;\n+415\n+417 MPI_Comm comm_;\n+418\n+421 std::set neighbourIds;\n+422\n+424 const static int commTag_=333;\n+425\n+430 int sourceSeqNo_;\n+431\n+436 int destSeqNo_;\n+437\n+441 bool publicIgnored;\n+442\n+446 bool firstBuild;\n+447\n+448 /*\n+449 * @brief If true, sending from indices of the processor to other\n+450 * indices on the same processor is enabled even if the same indexset is\n+used\n+451 * on both the\n+452 * sending and receiving side.\n+453 */\n+454 bool includeSelf;\n+455\n+457 typedef _\bI_\bn_\bd_\be_\bx_\bP_\ba_\bi_\br_\b<_\bG_\bl_\bo_\bb_\ba_\bl_\bI_\bn_\bd_\be_\bx_\b,_\b _\bL_\bo_\bc_\ba_\bl_\bI_\bn_\bd_\be_\bx_\b>\n+458 PairType;\n+459\n+466 _\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\be_\bx_\bM_\ba_\bp remoteIndices_;\n+467\n+478 template\n+479 inline void buildRemote(bool includeSelf);\n+480\n+486 inline int noPublic(const _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt& indexSet);\n+487\n+499 template\n+500 inline void packEntries(PairType** myPairs, const _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt&\n+indexSet,\n+501 char* p_out, MPI_Datatype type, int bufferSize,\n+502 int* position, int n);\n+503\n+517 inline void unpackIndices(_\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\be_\bx_\bL_\bi_\bs_\bt& remote, int remoteEntries,\n+518 PairType** local, int localEntries, char* p_in,\n+519 MPI_Datatype type, int* position, int bufferSize,\n+520 bool fromOurself);\n+521\n+522 inline void unpackIndices(_\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\be_\bx_\bL_\bi_\bs_\bt& send, _\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\be_\bx_\bL_\bi_\bs_\bt& receive,\n+523 int remoteEntries, PairType** localSource,\n+524 int localSourceEntries, PairType** localDest,\n+525 int localDestEntries, char* p_in,\n+526 MPI_Datatype type, int* position, int bufferSize);\n+527\n+528 void unpackCreateRemote(char* p_in, PairType** sourcePairs, PairType**\n+DestPairs,\n+529 int remoteProc, int sourcePublish, int destPublish,\n+530 int bufferSize, bool sendTwo, bool fromOurSelf=false);\n+531 };\n+532\n+548 template\n+_\b5_\b4_\b9 class _\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\be_\bx_\bL_\bi_\bs_\bt_\bM_\bo_\bd_\bi_\bf_\bi_\be_\br\n+550 {\n+551\n+552 template\n+_\b5_\b5_\b3 friend class _\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\bi_\bc_\be_\bs;\n+554\n+555 public:\n+_\b5_\b5_\b6 class _\bI_\bn_\bv_\ba_\bl_\bi_\bd_\bP_\bo_\bs_\bi_\bt_\bi_\bo_\bn : public _\bR_\ba_\bn_\bg_\be_\bE_\br_\br_\bo_\br\n+557 {};\n+558\n+_\b5_\b6_\b7 constexpr static bool _\bM_\bO_\bD_\bI_\bF_\bY_\bI_\bN_\bD_\bE_\bX_\bS_\bE_\bT = mode;\n+568\n+_\b5_\b7_\b2 typedef T _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt;\n+573\n+_\b5_\b7_\b7 typedef typename _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt_\b:_\b:_\bG_\bl_\bo_\bb_\ba_\bl_\bI_\bn_\bd_\be_\bx _\bG_\bl_\bo_\bb_\ba_\bl_\bI_\bn_\bd_\be_\bx;\n+578\n+_\b5_\b8_\b2 typedef typename _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt_\b:_\b:_\bL_\bo_\bc_\ba_\bl_\bI_\bn_\bd_\be_\bx _\bL_\bo_\bc_\ba_\bl_\bI_\bn_\bd_\be_\bx;\n+583\n+_\b5_\b8_\b7 typedef typename LocalIndex::Attribute _\bA_\bt_\bt_\br_\bi_\bb_\bu_\bt_\be;\n+588\n+_\b5_\b9_\b2 typedef _\bD_\bu_\bn_\be_\b:_\b:_\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\be_\bx_\b<_\bG_\bl_\bo_\bb_\ba_\bl_\bI_\bn_\bd_\be_\bx_\b,_\bA_\bt_\bt_\br_\bi_\bb_\bu_\bt_\be_\b> _\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\be_\bx;\n+593\n+_\b5_\b9_\b7 typedef A _\bA_\bl_\bl_\bo_\bc_\ba_\bt_\bo_\br;\n+598\n+600 typedef _\bD_\bu_\bn_\be_\b:_\b:_\bS_\bL_\bL_\bi_\bs_\bt_\b<_\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\be_\bx_\b,_\bA_\bl_\bl_\bo_\bc_\ba_\bt_\bo_\br_\b>\n+_\b6_\b0_\b1 _\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\be_\bx_\bL_\bi_\bs_\bt;\n+602\n+_\b6_\b0_\b6 typedef _\bS_\bL_\bL_\bi_\bs_\bt_\bM_\bo_\bd_\bi_\bf_\by_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b<_\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\be_\bx_\b,_\bA_\bl_\bl_\bo_\bc_\ba_\bt_\bo_\br_\b> _\bM_\bo_\bd_\bi_\bf_\by_\bI_\bt_\be_\br_\ba_\bt_\bo_\br;\n+607\n+_\b6_\b1_\b1 typedef typename _\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\be_\bx_\bL_\bi_\bs_\bt_\b:_\b:_\bc_\bo_\bn_\bs_\bt_\b__\bi_\bt_\be_\br_\ba_\bt_\bo_\br _\bC_\bo_\bn_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br;\n+612\n+626 void _\bi_\bn_\bs_\be_\br_\bt(const _\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\be_\bx& index);\n+627\n+628\n+643 void _\bi_\bn_\bs_\be_\br_\bt(const _\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\be_\bx& index, const _\bG_\bl_\bo_\bb_\ba_\bl_\bI_\bn_\bd_\be_\bx& global);\n+644\n+652 bool _\br_\be_\bm_\bo_\bv_\be(const _\bG_\bl_\bo_\bb_\ba_\bl_\bI_\bn_\bd_\be_\bx& global);\n+653\n+666 void _\br_\be_\bp_\ba_\bi_\br_\bL_\bo_\bc_\ba_\bl_\bI_\bn_\bd_\be_\bx_\bP_\bo_\bi_\bn_\bt_\be_\br_\bs();\n+667\n+668\n+669 _\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\be_\bx_\bL_\bi_\bs_\bt_\bM_\bo_\bd_\bi_\bf_\bi_\be_\br(const _\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\be_\bx_\bL_\bi_\bs_\bt_\bM_\bo_\bd_\bi_\bf_\bi_\be_\br&);\n+670\n+_\b6_\b7_\b5 _\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\be_\bx_\bL_\bi_\bs_\bt_\bM_\bo_\bd_\bi_\bf_\bi_\be_\br()\n+676 : glist_()\n+677 {}\n+678\n+679 private:\n+680\n+686 _\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\be_\bx_\bL_\bi_\bs_\bt_\bM_\bo_\bd_\bi_\bf_\bi_\be_\br(const _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt& indexSet,\n+687 _\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\be_\bx_\bL_\bi_\bs_\bt& rList);\n+688\n+689 typedef _\bS_\bL_\bL_\bi_\bs_\bt_\b<_\bG_\bl_\bo_\bb_\ba_\bl_\bI_\bn_\bd_\be_\bx_\b,_\bA_\bl_\bl_\bo_\bc_\ba_\bt_\bo_\br_\b> GlobalList;\n+690 typedef typename _\bG_\bl_\bo_\bb_\ba_\bl_\bL_\bi_\bs_\bt_\b:_\b:_\bM_\bo_\bd_\bi_\bf_\by_\bI_\bt_\be_\br_\ba_\bt_\bo_\br GlobalModifyIterator;\n+691 _\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\be_\bx_\bL_\bi_\bs_\bt* rList_;\n+692 const _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt* indexSet_;\n+693 GlobalList glist_;\n+694 _\bM_\bo_\bd_\bi_\bf_\by_\bI_\bt_\be_\br_\ba_\bt_\bo_\br iter_;\n+695 GlobalModifyIterator giter_;\n+696 _\bC_\bo_\bn_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br end_;\n+697 bool first_;\n+698 _\bG_\bl_\bo_\bb_\ba_\bl_\bI_\bn_\bd_\be_\bx last_;\n+699 };\n+700\n+705 template\n+_\b7_\b0_\b6 class _\bC_\bo_\bl_\bl_\be_\bc_\bt_\bi_\bv_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br\n+707 {\n+708\n+712 typedef T ParallelIndexSet;\n+713\n+717 typedef typename _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt_\b:_\b:_\bG_\bl_\bo_\bb_\ba_\bl_\bI_\bn_\bd_\be_\bx GlobalIndex;\n+718\n+722 typedef typename _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt_\b:_\b:_\bL_\bo_\bc_\ba_\bl_\bI_\bn_\bd_\be_\bx LocalIndex;\n+723\n+727 typedef typename LocalIndex::Attribute Attribute;\n+728\n+730 typedef _\bD_\bu_\bn_\be_\b:_\b:_\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\be_\bx_\b<_\bG_\bl_\bo_\bb_\ba_\bl_\bI_\bn_\bd_\be_\bx_\b,_\bA_\bt_\bt_\br_\bi_\bb_\bu_\bt_\be_\b> _\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\be_\bx;\n+731\n+733 using Allocator = typename std::allocator_traits::template\n+rebind_alloc;\n+734\n+736 typedef _\bD_\bu_\bn_\be_\b:_\b:_\bS_\bL_\bL_\bi_\bs_\bt_\b<_\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\be_\bx_\b,_\bA_\bl_\bl_\bo_\bc_\ba_\bt_\bo_\br_\b> _\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\be_\bx_\bL_\bi_\bs_\bt;\n+737\n+739 typedef std::map >\n+741 Map;\n+742\n+743 public:\n+744\n+746 typedef std::map >\n+_\b7_\b4_\b7 _\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\be_\bx_\bM_\ba_\bp;\n+748\n+754 inline _\bC_\bo_\bl_\bl_\be_\bc_\bt_\bi_\bv_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br(const _\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\be_\bx_\bM_\ba_\bp& map_, bool send);\n+755\n+764 inline void _\ba_\bd_\bv_\ba_\bn_\bc_\be(const GlobalIndex& global);\n+765\n+775 inline void _\ba_\bd_\bv_\ba_\bn_\bc_\be(const GlobalIndex& global, const Attribute& attribute);\n+776\n+777 _\bC_\bo_\bl_\bl_\be_\bc_\bt_\bi_\bv_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br& _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b+_\b+();\n+778\n+782 inline bool _\be_\bm_\bp_\bt_\by() const;\n+783\n+_\b7_\b9_\b0 class _\bi_\bt_\be_\br_\ba_\bt_\bo_\br\n+791 {\n+792 public:\n+_\b7_\b9_\b3 typedef typename Map::iterator _\bR_\be_\ba_\bl_\bI_\bt_\be_\br_\ba_\bt_\bo_\br;\n+_\b7_\b9_\b4 typedef typename Map::iterator _\bC_\bo_\bn_\bs_\bt_\bR_\be_\ba_\bl_\bI_\bt_\be_\br_\ba_\bt_\bo_\br;\n+795\n+796\n+_\b7_\b9_\b8 _\bi_\bt_\be_\br_\ba_\bt_\bo_\br(const _\bR_\be_\ba_\bl_\bI_\bt_\be_\br_\ba_\bt_\bo_\br& iter, const _\bC_\bo_\bn_\bs_\bt_\bR_\be_\ba_\bl_\bI_\bt_\be_\br_\ba_\bt_\bo_\br& _\be_\bn_\bd,\n+GlobalIndex& index)\n+799 : iter_(iter), end_(_\be_\bn_\bd), index_(index), hasAttribute(false)\n+800 {\n+801 // Move to the first valid entry\n+802 while(iter_!=end_ && iter_->second.first->localIndexPair().global\n+()!=index_)\n+803 ++iter_;\n+804 }\n+805\n+_\b8_\b0_\b6 _\bi_\bt_\be_\br_\ba_\bt_\bo_\br(const _\bR_\be_\ba_\bl_\bI_\bt_\be_\br_\ba_\bt_\bo_\br& iter, const _\bC_\bo_\bn_\bs_\bt_\bR_\be_\ba_\bl_\bI_\bt_\be_\br_\ba_\bt_\bo_\br& _\be_\bn_\bd,\n+GlobalIndex index,\n+807 Attribute attribute)\n+808 : iter_(iter), end_(_\be_\bn_\bd), index_(index), attribute_(attribute),\n+hasAttribute(true)\n+809 {\n+810 // Move to the first valid entry or the end\n+811 while(iter_!=end_ && (iter_->second.first->localIndexPair().global\n+()!=index_\n+812 || iter_->second.first->localIndexPair().local().attribute()!=attribute))\n+813 ++iter_;\n+814 }\n+_\b8_\b1_\b6 _\bi_\bt_\be_\br_\ba_\bt_\bo_\br(const _\bi_\bt_\be_\br_\ba_\bt_\bo_\br& other)\n+817 : iter_(other.iter_), end_(other.end_), index_(other.index_)\n+818 { }\n+819\n+_\b8_\b2_\b1 _\bi_\bt_\be_\br_\ba_\bt_\bo_\br& _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b+_\b+()\n+822 {\n+823 ++iter_;\n+824 // If entry is not valid move on\n+825 while(iter_!=end_ && (iter_->second.first->localIndexPair().global\n+()!=index_ ||\n+826 (hasAttribute &&\n+827 iter_->second.first->localIndexPair().local().attribute()!=attribute_)))\n+828 ++iter_;\n+829 assert(iter_==end_ ||\n+830 (iter_->second.first->localIndexPair().global()==index_));\n+831 assert(iter_==end_ || !hasAttribute ||\n+832 (iter_->second.first->localIndexPair().local().attribute()==attribute_));\n+833 return *this;\n+834 }\n+835\n+_\b8_\b3_\b7 const _\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\be_\bx& _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b*() const\n+838 {\n+839 return *(iter_->second.first);\n+840 }\n+841\n+_\b8_\b4_\b3 int _\bp_\br_\bo_\bc_\be_\bs_\bs() const\n+844 {\n+845 return iter_->first;\n+846 }\n+847\n+_\b8_\b4_\b9 const _\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\be_\bx* _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b-_\b>() const\n+850 {\n+851 return iter_->second.first.operator->();\n+852 }\n+853\n+_\b8_\b5_\b5 bool _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b=_\b=(const _\bi_\bt_\be_\br_\ba_\bt_\bo_\br& other) const\n+856 {\n+857 return other.iter_==iter_;\n+858 }\n+859\n+_\b8_\b6_\b1 bool _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b!_\b=(const _\bi_\bt_\be_\br_\ba_\bt_\bo_\br& other) const\n+862 {\n+863 return other.iter_!=iter_;\n+864 }\n+865\n+866 private:\n+867 _\bi_\bt_\be_\br_\ba_\bt_\bo_\br();\n+868\n+869 _\bR_\be_\ba_\bl_\bI_\bt_\be_\br_\ba_\bt_\bo_\br iter_;\n+870 _\bR_\be_\ba_\bl_\bI_\bt_\be_\br_\ba_\bt_\bo_\br end_;\n+871 GlobalIndex index_;\n+872 Attribute attribute_;\n+873 bool hasAttribute;\n+874 };\n+875\n+876 iterator _\bb_\be_\bg_\bi_\bn();\n+877\n+878 iterator _\be_\bn_\bd();\n+879\n+880 private:\n+881\n+882 Map map_;\n+883 GlobalIndex index_;\n+884 Attribute attribute_;\n+885 bool noattribute;\n+886 };\n+887\n+888 template\n+_\b8_\b8_\b9 MPI_Datatype _\bM_\bP_\bI_\bT_\br_\ba_\bi_\bt_\bs_\b<_\bI_\bn_\bd_\be_\bx_\bP_\ba_\bi_\br_\b<_\bT_\bG_\b,_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bL_\bo_\bc_\ba_\bl_\bI_\bn_\bd_\be_\bx_\b<_\bT_\bA_\b> > >::getType()\n+890 {\n+891 if(type==MPI_DATATYPE_NULL) {\n+892 int length[2] = {1, 1};\n+893 MPI_Aint base;\n+894 MPI_Aint disp[2];\n+895 MPI_Datatype types[2] = {_\bM_\bP_\bI_\bT_\br_\ba_\bi_\bt_\bs_\b<_\bT_\bG_\b>_\b:_\b:_\bg_\be_\bt_\bT_\by_\bp_\be(),\n+896 _\bM_\bP_\bI_\bT_\br_\ba_\bi_\bt_\bs_\b<_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bL_\bo_\bc_\ba_\bl_\bI_\bn_\bd_\be_\bx_\b<_\bT_\bA_\b> >::getType()};\n+897 _\bI_\bn_\bd_\be_\bx_\bP_\ba_\bi_\br_\b<_\bT_\bG_\b,_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bL_\bo_\bc_\ba_\bl_\bI_\bn_\bd_\be_\bx_\b<_\bT_\bA_\b> > rep;\n+898 MPI_Get_address(&rep, &base); // lower bound of the datatype\n+899 MPI_Get_address(&(rep.global_), &disp[0]);\n+900 MPI_Get_address(&(rep.local_), &disp[1]);\n+901 for (MPI_Aint& d : disp)\n+902 d -= base;\n+903\n+904 MPI_Datatype tmp;\n+905 MPI_Type_create_struct(2, length, disp, types, &tmp);\n+906\n+907 MPI_Type_create_resized(tmp, 0, sizeof(_\bI_\bn_\bd_\be_\bx_\bP_\ba_\bi_\br\n+>), &type);\n+908 MPI_Type_commit(&type);\n+909\n+910 MPI_Type_free(&tmp);\n+911 }\n+912 return type;\n+913 }\n+914\n+915 template\n+916 MPI_Datatype _\bM_\bP_\bI_\bT_\br_\ba_\bi_\bt_\bs_\b<_\bI_\bn_\bd_\be_\bx_\bP_\ba_\bi_\br_\b<_\bT_\bG_\b,_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bL_\bo_\bc_\ba_\bl_\bI_\bn_\bd_\be_\bx_\b<_\bT_\bA_\b> > >::\n+type=MPI_DATATYPE_NULL;\n+917\n+918 template\n+_\b9_\b1_\b9 _\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\be_\bx_\b<_\bT_\b1_\b,_\bT_\b2_\b>_\b:_\b:_\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\be_\bx(const T2& attribute, const _\bP_\ba_\bi_\br_\bT_\by_\bp_\be* local)\n+920 : localIndex_(local), attribute_(static_cast<_\bs_\bt_\bd::underlying_type_t>\n+(attribute))\n+921 {}\n+922\n+923 template\n+_\b9_\b2_\b4 _\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\be_\bx_\b<_\bT_\b1_\b,_\bT_\b2_\b>_\b:_\b:_\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\be_\bx(const T2& attribute)\n+925 : localIndex_(0), attribute_(static_cast<_\bs_\bt_\bd::underlying_type_t>\n+(attribute))\n+926 {}\n+927\n+928 template\n+_\b9_\b2_\b9 _\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\be_\bx_\b<_\bT_\b1_\b,_\bT_\b2_\b>_\b:_\b:_\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\be_\bx()\n+930 : localIndex_(0), attribute_()\n+931 {}\n+932 template\n+_\b9_\b3_\b3 inline bool _\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\be_\bx_\b<_\bT_\b1_\b,_\bT_\b2_\b>_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b=_\b=(const _\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\be_\bx& ri) const\n+934 {\n+935 return localIndex_==ri.localIndex_ && attribute_==ri.attribute_;\n+936 }\n+937\n+938 template\n+_\b9_\b3_\b9 inline bool _\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\be_\bx_\b<_\bT_\b1_\b,_\bT_\b2_\b>_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b!_\b=(const _\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\be_\bx& ri) const\n+940 {\n+941 return localIndex_!=ri.localIndex_ || attribute_!=ri.attribute_;\n+942 }\n+943\n+944 template\n+_\b9_\b4_\b5 inline const T2 _\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\be_\bx_\b<_\bT_\b1_\b,_\bT_\b2_\b>_\b:_\b:_\ba_\bt_\bt_\br_\bi_\bb_\bu_\bt_\be() const\n+946 {\n+947 return T2(attribute_);\n+948 }\n+949\n+950 template\n+_\b9_\b5_\b1 inline const _\bI_\bn_\bd_\be_\bx_\bP_\ba_\bi_\br_\b<_\bT_\b1_\b,_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bL_\bo_\bc_\ba_\bl_\bI_\bn_\bd_\be_\bx_\b<_\bT_\b2_\b> >& _\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\be_\bx_\b<_\bT_\b1_\b,_\bT_\b2_\b>_\b:_\b:\n+_\bl_\bo_\bc_\ba_\bl_\bI_\bn_\bd_\be_\bx_\bP_\ba_\bi_\br() const\n+952 {\n+953 return *localIndex_;\n+954 }\n+955\n+956 template\n+_\b9_\b5_\b7 inline _\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\bi_\bc_\be_\bs_\b<_\bT_\b,_\bA_\b>_\b:_\b:_\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\bi_\bc_\be_\bs(const _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt& source,\n+958 const _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt& destination,\n+959 const MPI_Comm& comm,\n+960 const std::vector& neighbours,\n+961 bool includeSelf_)\n+962 : source_(&source), target_(&destination), comm_(comm),\n+963 sourceSeqNo_(-1), destSeqNo_(-1), publicIgnored(false), firstBuild(true),\n+964 includeSelf(includeSelf_)\n+965 {\n+966 _\bs_\be_\bt_\bN_\be_\bi_\bg_\bh_\bb_\bo_\bu_\br_\bs(_\bn_\be_\bi_\bg_\bh_\bb_\bo_\bu_\br_\bs);\n+967 }\n+968\n+969 template\n+_\b9_\b7_\b0 void _\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\bi_\bc_\be_\bs_\b<_\bT_\b,_\bA_\b>_\b:_\b:_\bs_\be_\bt_\bI_\bn_\bc_\bl_\bu_\bd_\be_\bS_\be_\bl_\bf(bool b)\n+971 {\n+972 includeSelf=b;\n+973 }\n+974\n+975 template\n+_\b9_\b7_\b6 _\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\bi_\bc_\be_\bs_\b<_\bT_\b,_\bA_\b>_\b:_\b:_\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\bi_\bc_\be_\bs()\n+977 : source_(0), target_(0), sourceSeqNo_(-1),\n+978 destSeqNo_(-1), publicIgnored(false), firstBuild(true),\n+979 includeSelf(false)\n+980 {}\n+981\n+982 template\n+_\b9_\b8_\b3 void _\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\bi_\bc_\be_\bs_\b<_\bT_\b,_\bA_\b>_\b:_\b:_\bs_\be_\bt_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt_\bs(const _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt& source,\n+984 const _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt& destination,\n+985 const MPI_Comm& comm,\n+986 const std::vector& neighbours)\n+987 {\n+988 free();\n+989 source_ = &source;\n+990 target_ = &destination;\n+991 comm_ = comm;\n+992 firstBuild = true;\n+993 setNeighbours(neighbours);\n+994 }\n+995\n+996 template\n+997 const typename _\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\bi_\bc_\be_\bs_\b<_\bT_\b,_\bA_\b>_\b:_\b:_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt&\n+_\b9_\b9_\b8 _\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\bi_\bc_\be_\bs_\b<_\bT_\b,_\bA_\b>_\b:_\b:_\bs_\bo_\bu_\br_\bc_\be_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt() const\n+999 {\n+1000 return *source_;\n+1001 }\n+1002\n+1003\n+1004 template\n+1005 const typename _\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\bi_\bc_\be_\bs_\b<_\bT_\b,_\bA_\b>_\b:_\b:_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt&\n+_\b1_\b0_\b0_\b6 _\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\bi_\bc_\be_\bs_\b<_\bT_\b,_\bA_\b>_\b:_\b:_\bd_\be_\bs_\bt_\bi_\bn_\ba_\bt_\bi_\bo_\bn_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt() const\n+1007 {\n+1008 return *target_;\n+1009 }\n+1010\n+1011\n+1012 template\n+_\b1_\b0_\b1_\b3 _\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\bi_\bc_\be_\bs_\b<_\bT_\b,_\bA_\b>_\b:_\b:_\b~_\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\bi_\bc_\be_\bs()\n+1014 {\n+1015 free();\n+1016 }\n+1017\n+1018 template\n+1019 template\n+_\b1_\b0_\b2_\b0 inline void _\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\bi_\bc_\be_\bs_\b<_\bT_\b,_\bA_\b>_\b:_\b:_\bp_\ba_\bc_\bk_\bE_\bn_\bt_\br_\bi_\be_\bs\n+(_\bI_\bn_\bd_\be_\bx_\bP_\ba_\bi_\br_\b<_\bG_\bl_\bo_\bb_\ba_\bl_\bI_\bn_\bd_\be_\bx_\b,_\bL_\bo_\bc_\ba_\bl_\bI_\bn_\bd_\be_\bx_\b>** pairs,\n+1021 const _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt& indexSet,\n+1022 char* p_out, MPI_Datatype type,\n+1023 int bufferSize,\n+1024 int *position,\n+1025 [[maybe_unused]] int n)\n+1026 {\n+1027 // fill with own indices\n+1028 const auto end = indexSet._\be_\bn_\bd();\n+1029\n+1030 //Now pack the source indices\n+1031 int i=0;\n+1032 for(auto index = indexSet.begin(); index != end; ++index)\n+1033 if(ignorePublic || index->local().isPublic()) {\n+1034\n+1035 MPI_Pack(const_cast<_\bP_\ba_\bi_\br_\bT_\by_\bp_\be*>(&(*index)), 1,\n+1036 type,\n+1037 p_out, bufferSize, position, comm_);\n+1038 pairs[i++] = const_cast<_\bP_\ba_\bi_\br_\bT_\by_\bp_\be*>(&(*index));\n+1039\n+1040 }\n+1041 assert(i==n);\n+1042 }\n+1043\n+1044 template\n+1045 inline int _\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\bi_\bc_\be_\bs_\b<_\bT_\b,_\bA_\b>_\b:_\b:_\bn_\bo_\bP_\bu_\bb_\bl_\bi_\bc(const _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt& indexSet)\n+1046 {\n+1047\n+1048 int noPublic=0;\n+1049\n+1050 const auto end=indexSet._\be_\bn_\bd();\n+1051 for(auto index=indexSet._\bb_\be_\bg_\bi_\bn(); index!=end; ++index)\n+1052 if(index->local().isPublic())\n+1053 noPublic++;\n+1054\n+1055 return noPublic;\n+1056\n+1057 }\n+1058\n+1059\n+1060 template\n+1061 inline void RemoteIndices::unpackCreateRemote(char* p_in, PairType**\n+sourcePairs,\n+1062 PairType** destPairs, int remoteProc,\n+1063 int sourcePublish, int destPublish,\n+1064 int bufferSize, bool sendTwo,\n+1065 bool fromOurSelf)\n+1066 {\n+1067\n+1068 // unpack the number of indices we received\n+1069 int noRemoteSource=-1, noRemoteDest=-1;\n+1070 char twoIndexSets=0;\n+1071 int position=0;\n+1072 // Did we receive two index sets?\n+1073 MPI_Unpack(p_in, bufferSize, &position, &twoIndexSets, 1, MPI_CHAR,\n+comm_);\n+1074 // The number of source indices received\n+1075 MPI_Unpack(p_in, bufferSize, &position, &noRemoteSource, 1, MPI_INT,\n+comm_);\n+1076 // The number of destination indices received\n+1077 MPI_Unpack(p_in, bufferSize, &position, &noRemoteDest, 1, MPI_INT, comm_);\n+1078\n+1079\n+1080 // Indices for which we receive\n+1081 RemoteIndexList* receive= new RemoteIndexList();\n+1082 // Indices for which we send\n+1083 RemoteIndexList* send=0;\n+1084\n+1085 MPI_Datatype type= _\bM_\bP_\bI_\bT_\br_\ba_\bi_\bt_\bs_\b<_\bP_\ba_\bi_\br_\bT_\by_\bp_\be_\b>_\b:_\b:_\bg_\be_\bt_\bT_\by_\bp_\be();\n+1086\n+1087 if(!twoIndexSets) {\n+1088 if(sendTwo) {\n+1089 send = new RemoteIndexList();\n+1090 // Create both remote index sets simultaneously\n+1091 unpackIndices(*send, *receive, noRemoteSource, sourcePairs, sourcePublish,\n+1092 destPairs, destPublish, p_in, type, &position, bufferSize);\n+1093 }else{\n+1094 // we only need one list\n+1095 unpackIndices(*receive, noRemoteSource, sourcePairs, sourcePublish,\n+1096 p_in, type, &position, bufferSize, fromOurSelf);\n+1097 send=receive;\n+1098 }\n+1099 }else{\n+1100\n+1101 int oldPos=position;\n+1102 // Two index sets received\n+1103 unpackIndices(*receive, noRemoteSource, destPairs, destPublish,\n+1104 p_in, type, &position, bufferSize, fromOurSelf);\n+1105 if(!sendTwo)\n+1106 //unpack source entries again as destination entries\n+1107 position=oldPos;\n+1108\n+1109 send = new RemoteIndexList();\n+1110 unpackIndices(*send, noRemoteDest, sourcePairs, sourcePublish,\n+1111 p_in, type, &position, bufferSize, fromOurSelf);\n+1112 }\n+1113\n+1114 if(receive->empty() && send->empty()) {\n+1115 if(send==receive) {\n+1116 delete send;\n+1117 }else{\n+1118 delete send;\n+1119 delete receive;\n+1120 }\n+1121 }else{\n+1122 remoteIndices_.insert(std::make_pair(remoteProc,\n+1123 std::make_pair(send,receive)));\n+1124 }\n+1125 }\n+1126\n+1127\n+1128 template\n+1129 template\n+1130 inline void RemoteIndices::buildRemote(bool includeSelf_)\n+1131 {\n+1132 // Processor configuration\n+1133 int rank, procs;\n+1134 MPI_Comm_rank(comm_, &rank);\n+1135 MPI_Comm_size(comm_, &procs);\n+1136\n+1137 // number of local indices to publish\n+1138 // The indices of the destination will be send.\n+1139 int sourcePublish, destPublish;\n+1140\n+1141 // Do we need to send two index sets?\n+1142 char sendTwo = (source_ != target_);\n+1143\n+1144 if(procs==1 && !(sendTwo || includeSelf_))\n+1145 // Nothing to communicate\n+1146 return;\n+1147\n+1148 sourcePublish = (ignorePublic) ? source_->size() : noPublic(*source_);\n+1149\n+1150 if(sendTwo)\n+1151 destPublish = (ignorePublic) ? target_->size() : noPublic(*target_);\n+1152 else\n+1153 // we only need to send one set of indices\n+1154 destPublish = 0;\n+1155\n+1156 int maxPublish, publish=sourcePublish+destPublish;\n+1157\n+1158 // Calculate maximum number of indices send\n+1159 MPI_Allreduce(&publish, &maxPublish, 1, MPI_INT, MPI_MAX, comm_);\n+1160\n+1161 // allocate buffers\n+1162 PairType** destPairs;\n+1163 PairType** sourcePairs = new PairType*[sourcePublish>0 ? sourcePublish :\n+1];\n+1164\n+1165 if(sendTwo)\n+1166 destPairs = new PairType*[destPublish>0 ? destPublish : 1];\n+1167 else\n+1168 destPairs=sourcePairs;\n+1169\n+1170 char** buffer = new char*[2];\n+1171 int bufferSize;\n+1172 int position=0;\n+1173 int intSize;\n+1174 int charSize;\n+1175\n+1176 // calculate buffer size\n+1177 MPI_Datatype type = _\bM_\bP_\bI_\bT_\br_\ba_\bi_\bt_\bs_\b<_\bP_\ba_\bi_\br_\bT_\by_\bp_\be_\b>_\b:_\b:_\bg_\be_\bt_\bT_\by_\bp_\be();\n+1178\n+1179 MPI_Pack_size(maxPublish, type, comm_,\n+1180 &bufferSize);\n+1181 MPI_Pack_size(1, MPI_INT, comm_,\n+1182 &intSize);\n+1183 MPI_Pack_size(1, MPI_CHAR, comm_,\n+1184 &charSize);\n+1185 // Our message will contain the following:\n+1186 // a bool whether two index sets where sent\n+1187 // the size of the source and the dest indexset,\n+1188 // then the source and destination indices\n+1189 bufferSize += 2 * intSize + charSize;\n+1190\n+1191 if(bufferSize<=0) bufferSize=1;\n+1192\n+1193 buffer[0] = new char[bufferSize];\n+1194 buffer[1] = new char[bufferSize];\n+1195\n+1196\n+1197 // pack entries into buffer[0], p_out below!\n+1198 MPI_Pack(&sendTwo, 1, MPI_CHAR, buffer[0], bufferSize, &position,\n+1199 comm_);\n+1200\n+1201 // The number of indices we send for each index set\n+1202 MPI_Pack(&sourcePublish, 1, MPI_INT, buffer[0], bufferSize, &position,\n+1203 comm_);\n+1204 MPI_Pack(&destPublish, 1, MPI_INT, buffer[0], bufferSize, &position,\n+1205 comm_);\n+1206\n+1207 // Now pack the source indices and setup the destination pairs\n+1208 packEntries(sourcePairs, *source_, buffer[0], type,\n+1209 bufferSize, &position, sourcePublish);\n+1210 // If necessary send the dest indices and setup the source pairs\n+1211 if(sendTwo)\n+1212 packEntries(destPairs, *target_, buffer[0], type,\n+1213 bufferSize, &position, destPublish);\n+1214\n+1215\n+1216 // Update remote indices for ourself\n+1217 if(sendTwo|| includeSelf_)\n+1218 unpackCreateRemote(buffer[0], sourcePairs, destPairs, rank, sourcePublish,\n+1219 destPublish, bufferSize, sendTwo, includeSelf_);\n+1220\n+1221 neighbourIds.erase(rank);\n+1222\n+1223 if(neighbourIds.size()==0)\n+1224 {\n+1225 _\bD_\bu_\bn_\be_\b:_\b:_\bd_\bv_\bv_\be_\br_\bb<::size_type size_type;\n+1261 size_type noNeighbours=neighbourIds.size();\n+1262\n+1263 // setup sends\n+1264 for(std::set::iterator neighbour=neighbourIds.begin();\n+1265 neighbour!= neighbourIds.end(); ++neighbour) {\n+1266 // Only send the information to the neighbouring processors\n+1267 MPI_Issend(buffer[0], position , MPI_PACKED, *neighbour, commTag_, comm_,\n+req++);\n+1268 }\n+1269\n+1270 //Test for received messages\n+1271\n+1272 for(size_type received=0; received \n+1313 inline void RemoteIndices::unpackIndices(RemoteIndexList& remote,\n+1314 int remoteEntries,\n+1315 PairType** local,\n+1316 int localEntries,\n+1317 char* p_in,\n+1318 MPI_Datatype type,\n+1319 int* position,\n+1320 int bufferSize,\n+1321 bool fromOurSelf)\n+1322 {\n+1323 if(remoteEntries==0)\n+1324 return;\n+1325\n+1326 PairType index;\n+1327 MPI_Unpack(p_in, bufferSize, position, &index, 1,\n+1328 type, comm_);\n+1329 GlobalIndex oldGlobal=index.global();\n+1330 int n_in=0, localIndex=0;\n+1331\n+1332 //Check if we know the global index\n+1333 while(localIndexglobal()==index.global()) {\n+1335 int oldLocalIndex=localIndex;\n+1336\n+1337 while(localIndexglobal()==index.global()) {\n+1339 if(!fromOurSelf || index.local().attribute() !=\n+1340 local[localIndex]->local().attribute())\n+1341 // if index is from us it has to have a different attribute\n+1342 remote.push_back(RemoteIndex(index.local().attribute(),\n+1343 local[localIndex]));\n+1344 localIndex++;\n+1345 }\n+1346\n+1347 // unpack next remote index\n+1348 if((++n_in) < remoteEntries) {\n+1349 MPI_Unpack(p_in, bufferSize, position, &index, 1,\n+1350 type, comm_);\n+1351 if(index.global()==oldGlobal)\n+1352 // Restart comparison for the same global indices\n+1353 localIndex=oldLocalIndex;\n+1354 else\n+1355 oldGlobal=index.global();\n+1356 }else{\n+1357 // No more received indices\n+1358 break;\n+1359 }\n+1360 continue;\n+1361 }\n+1362\n+1363 if (local[localIndex]->global()\n+1386 inline void RemoteIndices::unpackIndices(RemoteIndexList& send,\n+1387 RemoteIndexList& receive,\n+1388 int remoteEntries,\n+1389 PairType** localSource,\n+1390 int localSourceEntries,\n+1391 PairType** localDest,\n+1392 int localDestEntries,\n+1393 char* p_in,\n+1394 MPI_Datatype type,\n+1395 int* position,\n+1396 int bufferSize)\n+1397 {\n+1398 int n_in=0, sourceIndex=0, destIndex=0;\n+1399\n+1400 //Check if we know the global index\n+1401 while(n_in= than the\n+one in the unpacked index\n+1409 while(sourceIndexglobal\n+()global\n+()global\n+()==index.global())\n+1417 send.push_back(RemoteIndex(index.local().attribute(),\n+1418 localSource[sourceIndex]));\n+1419\n+1420 if(destIndex < localDestEntries && localDest[destIndex]->global() ==\n+index.global())\n+1421 receive.push_back(RemoteIndex(index.local().attribute(),\n+1422 localDest[sourceIndex]));\n+1423 }\n+1424\n+1425 }\n+1426\n+1427 template\n+_\b1_\b4_\b2_\b8 inline void _\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\bi_\bc_\be_\bs_\b<_\bT_\b,_\bA_\b>_\b:_\b:_\bf_\br_\be_\be()\n+1429 {\n+1430 auto lend = remoteIndices_.end();\n+1431 for(auto lists=remoteIndices_.begin(); lists != lend; ++lists) {\n+1432 if(lists->second.first==lists->second.second) {\n+1433 // there is only one remote index list.\n+1434 delete lists->second.first;\n+1435 }else{\n+1436 delete lists->second.first;\n+1437 delete lists->second.second;\n+1438 }\n+1439 }\n+1440 remoteIndices_.clear();\n+1441 firstBuild=true;\n+1442 }\n+1443\n+1444 template\n+_\b1_\b4_\b4_\b5 inline int _\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\bi_\bc_\be_\bs_\b<_\bT_\b,_\bA_\b>_\b:_\b:_\bn_\be_\bi_\bg_\bh_\bb_\bo_\bu_\br_\bs() const\n+1446 {\n+1447 return remoteIndices_.size();\n+1448 }\n+1449\n+1450 template\n+1451 template\n+_\b1_\b4_\b5_\b2 inline void _\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\bi_\bc_\be_\bs_\b<_\bT_\b,_\bA_\b>_\b:_\b:_\br_\be_\bb_\bu_\bi_\bl_\bd()\n+1453 {\n+1454 // Test whether a rebuild is Needed.\n+1455 if(firstBuild ||\n+1456 ignorePublic!=publicIgnored || !\n+1457 isSynced()) {\n+1458 free();\n+1459\n+1460 buildRemote(includeSelf);\n+1461\n+1462 sourceSeqNo_ = source_->seqNo();\n+1463 destSeqNo_ = target_->seqNo();\n+1464 firstBuild=false;\n+1465 publicIgnored=ignorePublic;\n+1466 }\n+1467\n+1468\n+1469 }\n+1470\n+1471 template\n+_\b1_\b4_\b7_\b2 inline bool _\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\bi_\bc_\be_\bs_\b<_\bT_\b,_\bA_\b>_\b:_\b:_\bi_\bs_\bS_\by_\bn_\bc_\be_\bd() const\n+1473 {\n+1474 return sourceSeqNo_==source_->seqNo() && destSeqNo_ ==target_->seqNo();\n+1475 }\n+1476\n+1477 template\n+1478 template\n+_\b1_\b4_\b7_\b9 _\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\be_\bx_\bL_\bi_\bs_\bt_\bM_\bo_\bd_\bi_\bf_\bi_\be_\br_\b<_\bT_\b,_\bA_\b,_\bm_\bo_\bd_\be_\b> _\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\bi_\bc_\be_\bs_\b<_\bT_\b,_\bA_\b>_\b:_\b:_\bg_\be_\bt_\bM_\bo_\bd_\bi_\bf_\bi_\be_\br(int\n+process)\n+1480 {\n+1481\n+1482 // The user are on their own now!\n+1483 // We assume they know what they are doing and just set the\n+1484 // remote indices to synced status.\n+1485 sourceSeqNo_ = source_->seqNo();\n+1486 destSeqNo_ = target_->seqNo();\n+1487\n+1488 typename RemoteIndexMap::iterator found = remoteIndices_.find(process);\n+1489\n+1490 if(found == remoteIndices_.end())\n+1491 {\n+1492 if(source_ != target_)\n+1493 found = remoteIndices_._\bi_\bn_\bs_\be_\br_\bt(found, std::make_pair(process,\n+1494 std::make_pair(new _\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\be_\bx_\bL_\bi_\bs_\bt(),\n+1495 new _\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\be_\bx_\bL_\bi_\bs_\bt())));\n+1496 else{\n+1497 _\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\be_\bx_\bL_\bi_\bs_\bt* rlist = new _\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\be_\bx_\bL_\bi_\bs_\bt();\n+1498 found = remoteIndices_.insert(found,\n+1499 std::make_pair(process,\n+1500 std::make_pair(rlist, rlist)));\n+1501 }\n+1502 }\n+1503\n+1504 firstBuild = false;\n+1505\n+1506 if(send)\n+1507 return _\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\be_\bx_\bL_\bi_\bs_\bt_\bM_\bo_\bd_\bi_\bf_\bi_\be_\br_\b<_\bT_\b,_\bA_\b,_\bm_\bo_\bd_\be_\b>(*source_, *(found-\n+>second.first));\n+1508 else\n+1509 return _\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\be_\bx_\bL_\bi_\bs_\bt_\bM_\bo_\bd_\bi_\bf_\bi_\be_\br_\b<_\bT_\b,_\bA_\b,_\bm_\bo_\bd_\be_\b>(*target_, *(found-\n+>second.second));\n+1510 }\n+1511\n+1512 template\n+1513 inline typename _\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\bi_\bc_\be_\bs_\b<_\bT_\b,_\bA_\b>_\b:_\b:_\bc_\bo_\bn_\bs_\bt_\b__\bi_\bt_\be_\br_\ba_\bt_\bo_\br\n+_\b1_\b5_\b1_\b4 _\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\bi_\bc_\be_\bs_\b<_\bT_\b,_\bA_\b>_\b:_\b:_\bf_\bi_\bn_\bd(int proc) const\n+1515 {\n+1516 return remoteIndices_.find(proc);\n+1517 }\n+1518\n+1519 template\n+1520 inline typename _\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\bi_\bc_\be_\bs_\b<_\bT_\b,_\bA_\b>_\b:_\b:_\bc_\bo_\bn_\bs_\bt_\b__\bi_\bt_\be_\br_\ba_\bt_\bo_\br\n+_\b1_\b5_\b2_\b1 _\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\bi_\bc_\be_\bs_\b<_\bT_\b,_\bA_\b>_\b:_\b:_\bb_\be_\bg_\bi_\bn() const\n+1522 {\n+1523 return remoteIndices_.begin();\n+1524 }\n+1525\n+1526 template\n+1527 inline typename _\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\bi_\bc_\be_\bs_\b<_\bT_\b,_\bA_\b>_\b:_\b:_\bc_\bo_\bn_\bs_\bt_\b__\bi_\bt_\be_\br_\ba_\bt_\bo_\br\n+_\b1_\b5_\b2_\b8 _\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\bi_\bc_\be_\bs_\b<_\bT_\b,_\bA_\b>_\b:_\b:_\be_\bn_\bd() const\n+1529 {\n+1530 return remoteIndices_.end();\n+1531 }\n+1532\n+1533\n+1534 template\n+_\b1_\b5_\b3_\b5 bool _\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\bi_\bc_\be_\bs_\b<_\bT_\b,_\bA_\b>_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b=_\b=(const _\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\bi_\bc_\be_\bs& ri) const\n+1536 {\n+1537 if(neighbours()!=ri._\bn_\be_\bi_\bg_\bh_\bb_\bo_\bu_\br_\bs())\n+1538 return false;\n+1539\n+1540 const auto rend = remoteIndices_.end();\n+1541\n+1542 for(auto rindex = remoteIndices_.begin(), rindex1=ri.remoteIndices_.begin\n+(); rindex!=rend; ++rindex, ++rindex1) {\n+1543 if(rindex->first != rindex1->first)\n+1544 return false;\n+1545 if(*(rindex->second.first) != *(rindex1->second.first))\n+1546 return false;\n+1547 if(*(rindex->second.second) != *(rindex1->second.second))\n+1548 return false;\n+1549 }\n+1550 return true;\n+1551 }\n+1552\n+1553 template\n+1554 _\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\be_\bx_\bL_\bi_\bs_\bt_\bM_\bo_\bd_\bi_\bf_\bi_\be_\br_\b<_\bT_\b,_\bA_\b,_\bm_\bo_\bd_\be_\b>_\b:_\b:_\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\be_\bx_\bL_\bi_\bs_\bt_\bM_\bo_\bd_\bi_\bf_\bi_\be_\br(const\n+_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt& indexSet,\n+1555 RemoteIndexList& rList)\n+1556 : rList_(&rList), indexSet_(&indexSet), iter_(rList.beginModify()), end_\n+(rList.end()), first_(true)\n+1557 {\n+1558 if(MODIFYINDEXSET) {\n+1559 assert(indexSet_);\n+1560 for(ConstIterator iter=iter_; iter != end_; ++iter)\n+1561 glist_.push_back(iter->localIndexPair().global());\n+1562 giter_ = glist_.beginModify();\n+1563 }\n+1564 }\n+1565\n+1566 template\n+_\b1_\b5_\b6_\b7 _\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\be_\bx_\bL_\bi_\bs_\bt_\bM_\bo_\bd_\bi_\bf_\bi_\be_\br_\b<_\bT_\b,_\bA_\b,_\bm_\bo_\bd_\be_\b>_\b:_\b:_\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\be_\bx_\bL_\bi_\bs_\bt_\bM_\bo_\bd_\bi_\bf_\bi_\be_\br(const\n+_\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\be_\bx_\bL_\bi_\bs_\bt_\bM_\bo_\bd_\bi_\bf_\bi_\be_\br_\b<_\bT_\b,_\bA_\b,_\bm_\bo_\bd_\be_\b>& other)\n+1568 : rList_(other.rList_), indexSet_(other.indexSet_),\n+1569 glist_(other.glist_), iter_(other.iter_), giter_(other.giter_), end_\n+(other.end_),\n+1570 first_(other.first_), last_(other.last_)\n+1571 {}\n+1572\n+1573 template\n+_\b1_\b5_\b7_\b4 inline void _\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\be_\bx_\bL_\bi_\bs_\bt_\bM_\bo_\bd_\bi_\bf_\bi_\be_\br_\b<_\bT_\b,_\bA_\b,_\bm_\bo_\bd_\be_\b>_\b:_\b:_\br_\be_\bp_\ba_\bi_\br_\bL_\bo_\bc_\ba_\bl_\bI_\bn_\bd_\be_\bx_\bP_\bo_\bi_\bn_\bt_\be_\br_\bs()\n+1575 {\n+1576 if(MODIFYINDEXSET) {\n+1577 // repair pointers to local index set.\n+1578#ifdef DUNE_ISTL_WITH_CHECKING\n+1579 if(indexSet_->state()!=_\bG_\bR_\bO_\bU_\bN_\bD)\n+1580 _\bD_\bU_\bN_\bE_\b__\bT_\bH_\bR_\bO_\bW(_\bI_\bn_\bv_\ba_\bl_\bi_\bd_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt_\bS_\bt_\ba_\bt_\be, \"Index has to be in ground mode for\n+repairing pointers to indices\");\n+1581#endif\n+1582 auto giter = glist_.begin();\n+1583 auto index = indexSet_->begin();\n+1584\n+1585 for(auto iter=rList_->begin(); iter != end_; ++iter) {\n+1586 while(index->global()<*giter) {\n+1587 ++index;\n+1588#ifdef DUNE_ISTL_WITH_CHECKING\n+1589 if(index == indexSet_->end())\n+1590 _\bD_\bU_\bN_\bE_\b__\bT_\bH_\bR_\bO_\bW(_\bI_\bn_\bv_\ba_\bl_\bi_\bd_\bP_\bo_\bs_\bi_\bt_\bi_\bo_\bn, \"No such global index in set!\");\n+1591#endif\n+1592 }\n+1593\n+1594#ifdef DUNE_ISTL_WITH_CHECKING\n+1595 if(index->global() != *giter)\n+1596 _\bD_\bU_\bN_\bE_\b__\bT_\bH_\bR_\bO_\bW(_\bI_\bn_\bv_\ba_\bl_\bi_\bd_\bP_\bo_\bs_\bi_\bt_\bi_\bo_\bn, \"No such global index in set!\");\n+1597#endif\n+1598 iter->localIndex_ = &(*index);\n+1599 }\n+1600 }\n+1601 }\n+1602\n+1603 template\n+_\b1_\b6_\b0_\b4 inline void _\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\be_\bx_\bL_\bi_\bs_\bt_\bM_\bo_\bd_\bi_\bf_\bi_\be_\br_\b<_\bT_\b,_\bA_\b,_\bm_\bo_\bd_\be_\b>_\b:_\b:_\bi_\bn_\bs_\be_\br_\bt(const _\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\be_\bx&\n+index)\n+1605 {\n+1606 static_assert(!mode,\"Not allowed if the mode indicates that new indices\"\n+1607 \"might be added to the underlying index set. Use \"\n+1608 \"insert(const RemoteIndex&, const GlobalIndex&) instead\");\n+1609\n+1610#ifdef DUNE_ISTL_WITH_CHECKING\n+1611 if(!first_ && index._\bl_\bo_\bc_\ba_\bl_\bI_\bn_\bd_\be_\bx_\bP_\ba_\bi_\br()._\bg_\bl_\bo_\bb_\ba_\bl()localIndexPair().global() <\n+index._\bl_\bo_\bc_\ba_\bl_\bI_\bn_\bd_\be_\bx_\bP_\ba_\bi_\br()._\bg_\bl_\bo_\bb_\ba_\bl()) {\n+1616 ++iter_;\n+1617 }\n+1618\n+1619 // No duplicate entries allowed\n+1620 assert(iter_==end_ || iter_->localIndexPair().global() !=\n+index._\bl_\bo_\bc_\ba_\bl_\bI_\bn_\bd_\be_\bx_\bP_\ba_\bi_\br()._\bg_\bl_\bo_\bb_\ba_\bl());\n+1621 iter_.insert(index);\n+1622 last_ = index._\bl_\bo_\bc_\ba_\bl_\bI_\bn_\bd_\be_\bx_\bP_\ba_\bi_\br()._\bg_\bl_\bo_\bb_\ba_\bl();\n+1623 first_ = false;\n+1624 }\n+1625\n+1626 template\n+_\b1_\b6_\b2_\b7 inline void _\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\be_\bx_\bL_\bi_\bs_\bt_\bM_\bo_\bd_\bi_\bf_\bi_\be_\br_\b<_\bT_\b,_\bA_\b,_\bm_\bo_\bd_\be_\b>_\b:_\b:_\bi_\bn_\bs_\be_\br_\bt(const _\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\be_\bx&\n+index, const _\bG_\bl_\bo_\bb_\ba_\bl_\bI_\bn_\bd_\be_\bx& global)\n+1628 {\n+1629 static_assert(mode,\"Not allowed if the mode indicates that no new indices\"\n+1630 \"might be added to the underlying index set. Use \"\n+1631 \"insert(const RemoteIndex&) instead\");\n+1632#ifdef DUNE_ISTL_WITH_CHECKING\n+1633 if(!first_ && globallocalIndexPair().global() != global);\n+1644 iter_.insert(index);\n+1645 giter_.insert(global);\n+1646\n+1647 last_ = global;\n+1648 first_ = false;\n+1649 }\n+1650\n+1651 template\n+_\b1_\b6_\b5_\b2 bool _\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\be_\bx_\bL_\bi_\bs_\bt_\bM_\bo_\bd_\bi_\bf_\bi_\be_\br_\b<_\bT_\b,_\bA_\b,_\bm_\bo_\bd_\be_\b>_\b:_\b:_\br_\be_\bm_\bo_\bv_\be(const _\bG_\bl_\bo_\bb_\ba_\bl_\bI_\bn_\bd_\be_\bx& global)\n+1653 {\n+1654#ifdef DUNE_ISTL_WITH_CHECKING\n+1655 if(!first_ && globallocalIndexPair().global() < global)\n+1674 ++iter_;\n+1675\n+1676 if(iter_->localIndexPair().global()==global) {\n+1677 iter_.remove();\n+1678 found = true;\n+1679 }\n+1680 }\n+1681\n+1682 last_ = global;\n+1683 first_ = false;\n+1684 return found;\n+1685 }\n+1686\n+1687 template\n+1688 template\n+_\b1_\b6_\b8_\b9 inline typename _\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\bi_\bc_\be_\bs_\b<_\bT_\b,_\bA_\b>_\b:_\b:_\bC_\bo_\bl_\bl_\be_\bc_\bt_\bi_\bv_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bT\n+_\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\bi_\bc_\be_\bs_\b<_\bT_\b,_\bA_\b>_\b:_\b:_\bi_\bt_\be_\br_\ba_\bt_\bo_\br() const\n+1690 {\n+1691 return _\bC_\bo_\bl_\bl_\be_\bc_\bt_\bi_\bv_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b<_\bT_\b,_\bA_\b>(remoteIndices_, send);\n+1692 }\n+1693\n+1694 template\n+_\b1_\b6_\b9_\b5 inline MPI_Comm _\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\bi_\bc_\be_\bs_\b<_\bT_\b,_\bA_\b>_\b:_\b:_\bc_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bo_\br() const\n+1696 {\n+1697 return comm_;\n+1698\n+1699 }\n+1700\n+1701 template\n+_\b1_\b7_\b0_\b2 _\bC_\bo_\bl_\bl_\be_\bc_\bt_\bi_\bv_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b<_\bT_\b,_\bA_\b>_\b:_\b:_\bC_\bo_\bl_\bl_\be_\bc_\bt_\bi_\bv_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br(const _\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\be_\bx_\bM_\ba_\bp& pmap,\n+bool send)\n+1703 {\n+1704\n+1705 const auto end = pmap.end();\n+1706 for(auto process = pmap.begin(); process != end; ++process) {\n+1707 const _\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\be_\bx_\bL_\bi_\bs_\bt* list = send ? process->second.first : process-\n+>second.second;\n+1708 using ri_iterator = typename _\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\be_\bx_\bL_\bi_\bs_\bt_\b:_\b:_\bc_\bo_\bn_\bs_\bt_\b__\bi_\bt_\be_\br_\ba_\bt_\bo_\br;\n+1709 map_.insert(std::make_pair(process->first,\n+1710 std::pair(list->_\bb_\be_\bg_\bi_\bn(), list->_\be_\bn_\bd())));\n+1711 }\n+1712 }\n+1713\n+1714 template\n+_\b1_\b7_\b1_\b5 inline void _\bC_\bo_\bl_\bl_\be_\bc_\bt_\bi_\bv_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b<_\bT_\b,_\bA_\b>_\b:_\b:_\ba_\bd_\bv_\ba_\bn_\bc_\be(const GlobalIndex& index)\n+1716 {\n+1717 const auto end = map_.end();\n+1718\n+1719 for(auto iter = map_.begin(); iter != end;) {\n+1720 // Step the iterator until we are >= index\n+1721 typename _\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\be_\bx_\bL_\bi_\bs_\bt_\b:_\b:_\bc_\bo_\bn_\bs_\bt_\b__\bi_\bt_\be_\br_\ba_\bt_\bo_\br current = iter->second.first;\n+1722 typename _\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\be_\bx_\bL_\bi_\bs_\bt_\b:_\b:_\bc_\bo_\bn_\bs_\bt_\b__\bi_\bt_\be_\br_\ba_\bt_\bo_\br rend = iter->second.second;\n+1723 _\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\be_\bx remoteIndex;\n+1724 if(current != rend)\n+1725 remoteIndex = *current;\n+1726\n+1727 while(iter->second.first!=iter->second.second && iter->second.first-\n+>localIndexPair().global()second.first);\n+1729\n+1730 // erase from the map if there are no more entries.\n+1731 if(iter->second.first == iter->second.second)\n+1732 map_.erase(iter++);\n+1733 else{\n+1734 ++iter;\n+1735 }\n+1736 }\n+1737 index_=index;\n+1738 noattribute=true;\n+1739 }\n+1740\n+1741 template\n+_\b1_\b7_\b4_\b2 inline void _\bC_\bo_\bl_\bl_\be_\bc_\bt_\bi_\bv_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b<_\bT_\b,_\bA_\b>_\b:_\b:_\ba_\bd_\bv_\ba_\bn_\bc_\be(const GlobalIndex& index,\n+1743 const Attribute& attribute)\n+1744 {\n+1745 const auto end = map_.end();\n+1746\n+1747 for(auto iter = map_.begin(); iter != end;) {\n+1748 // Step the iterator until we are >= index\n+1749 typename _\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\be_\bx_\bL_\bi_\bs_\bt_\b:_\b:_\bc_\bo_\bn_\bs_\bt_\b__\bi_\bt_\be_\br_\ba_\bt_\bo_\br current = iter->second.first;\n+1750 typename _\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\be_\bx_\bL_\bi_\bs_\bt_\b:_\b:_\bc_\bo_\bn_\bs_\bt_\b__\bi_\bt_\be_\br_\ba_\bt_\bo_\br rend = iter->second.second;\n+1751 _\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\be_\bx remoteIndex;\n+1752 if(current != rend)\n+1753 remoteIndex = *current;\n+1754\n+1755 // Move to global index or bigger\n+1756 while(iter->second.first!=iter->second.second && iter->second.first-\n+>localIndexPair().global()second.first);\n+1758\n+1759 // move to attribute or bigger\n+1760 while(iter->second.first!=iter->second.second\n+1761 && iter->second.first->localIndexPair().global()==index\n+1762 && iter->second.first->localIndexPair().local().attribute()second.first);\n+1764\n+1765 // erase from the map if there are no more entries.\n+1766 if(iter->second.first == iter->second.second)\n+1767 map_.erase(iter++);\n+1768 else{\n+1769 ++iter;\n+1770 }\n+1771 }\n+1772 index_=index;\n+1773 attribute_=attribute;\n+1774 noattribute=false;\n+1775 }\n+1776\n+1777 template\n+_\b1_\b7_\b7_\b8 inline _\bC_\bo_\bl_\bl_\be_\bc_\bt_\bi_\bv_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b<_\bT_\b,_\bA_\b>& _\bC_\bo_\bl_\bl_\be_\bc_\bt_\bi_\bv_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b<_\bT_\b,_\bA_\b>_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b+_\b+()\n+1779 {\n+1780 const auto end = map_._\be_\bn_\bd();\n+1781\n+1782 for(auto iter = map_.begin(); iter != end;) {\n+1783 // Step the iterator until we are >= index\n+1784 auto current = iter->second.first;\n+1785 auto rend = iter->second.second;\n+1786\n+1787 // move all iterators pointing to the current global index to next value\n+1788 if(iter->second.first->localIndexPair().global()==index_ &&\n+1789 (noattribute || iter->second.first->localIndexPair().local().attribute()\n+== attribute_))\n+1790 ++(iter->second.first);\n+1791\n+1792 // erase from the map if there are no more entries.\n+1793 if(iter->second.first == iter->second.second)\n+1794 map_.erase(iter++);\n+1795 else{\n+1796 ++iter;\n+1797 }\n+1798 }\n+1799 return *this;\n+1800 }\n+1801\n+1802 template\n+_\b1_\b8_\b0_\b3 inline bool _\bC_\bo_\bl_\bl_\be_\bc_\bt_\bi_\bv_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b<_\bT_\b,_\bA_\b>_\b:_\b:_\be_\bm_\bp_\bt_\by() const\n+1804 {\n+1805 return map_.empty();\n+1806 }\n+1807\n+1808 template\n+1809 inline typename _\bC_\bo_\bl_\bl_\be_\bc_\bt_\bi_\bv_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b<_\bT_\b,_\bA_\b>_\b:_\b:_\bi_\bt_\be_\br_\ba_\bt_\bo_\br\n+_\b1_\b8_\b1_\b0 _\bC_\bo_\bl_\bl_\be_\bc_\bt_\bi_\bv_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b<_\bT_\b,_\bA_\b>_\b:_\b:_\bb_\be_\bg_\bi_\bn()\n+1811 {\n+1812 if(noattribute)\n+1813 return _\bi_\bt_\be_\br_\ba_\bt_\bo_\br(map_.begin(), map_.end(), index_);\n+1814 else\n+1815 return _\bi_\bt_\be_\br_\ba_\bt_\bo_\br(map_.begin(), map_.end(), index_,\n+1816 attribute_);\n+1817 }\n+1818\n+1819 template\n+1820 inline typename _\bC_\bo_\bl_\bl_\be_\bc_\bt_\bi_\bv_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b<_\bT_\b,_\bA_\b>_\b:_\b:_\bi_\bt_\be_\br_\ba_\bt_\bo_\br\n+_\b1_\b8_\b2_\b1 _\bC_\bo_\bl_\bl_\be_\bc_\bt_\bi_\bv_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b<_\bT_\b,_\bA_\b>_\b:_\b:_\be_\bn_\bd()\n+1822 {\n+1823 return _\bi_\bt_\be_\br_\ba_\bt_\bo_\br(map_.end(), map_.end(), index_);\n+1824 }\n+1825\n+1826 template\n+_\b1_\b8_\b2_\b7 inline std::ostream& _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b<_\b<(std::ostream& os, const\n+_\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\be_\bx_\b<_\bT_\bG_\b,_\bT_\bA_\b>& index)\n+1828 {\n+1829 os<<\"[global=\"<\n+_\b1_\b8_\b3_\b4 inline std::ostream& _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b<_\b<(std::ostream& os, const\n+_\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\bi_\bc_\be_\bs_\b<_\bT_\b,_\bA_\b>& indices)\n+1835 {\n+1836 int rank;\n+1837 MPI_Comm_rank(indices.comm_, &rank);\n+1838 const auto rend = indices.remoteIndices_.end();\n+1839\n+1840 for(auto rindex = indices.remoteIndices_.begin(); rindex!=rend; ++rindex)\n+{\n+1841 os<first<<\":\";\n+1842\n+1843 if(!rindex->second.first->empty()) {\n+1844 os<<\" send:\";\n+1845\n+1846 const auto send= rindex->second.first->end();\n+1847\n+1848 for(auto index = rindex->second.first->begin();\n+1849 index != send; ++index)\n+1850 os<<*index<<\" \";\n+1851 os<second.second->empty()) {\n+1854 os<first<<\": \"<<\"receive: \";\n+1855\n+1856 for(const auto& index : *(rindex->second.second))\n+1857 os << index << \" \";\n+1858 }\n+1859 os<_\b:_\b:_\bc_\bo_\bn_\bs_\bt_\b__\bi_\bt_\be_\br_\ba_\bt_\bo_\br\n+SLListConstIterator< RemoteIndex, Allocator > const_iterator\n+The constant iterator of the list.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn sllist.hh:74\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bL_\bL_\bi_\bs_\bt_\b<_\b _\bG_\bl_\bo_\bb_\ba_\bl_\bI_\bn_\bd_\be_\bx_\b,_\b _\bA_\bl_\bl_\bo_\bc_\ba_\bt_\bo_\br_\b _\b>_\b:_\b:_\bM_\bo_\bd_\bi_\bf_\by_\bI_\bt_\be_\br_\ba_\bt_\bo_\br\n+SLListModifyIterator< GlobalIndex, Allocator > ModifyIterator\n+The type of the iterator capable of deletion and insertion.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn sllist.hh:103\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bL_\bL_\bi_\bs_\bt_\b:_\b:_\bb_\be_\bg_\bi_\bn\n+iterator begin()\n+Get an iterator pointing to the first element in the list.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn sllist.hh:762\n+_\bD_\bu_\bn_\be_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b<_\b<\n+std::ostream & operator<<(std::ostream &s, const bigunsignedint< k > &x)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bigunsignedint.hh:278\n _\bD_\bU_\bN_\bE_\b__\bT_\bH_\bR_\bO_\bW\n #define DUNE_THROW(E, m)\n D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn exceptions.hh:218\n+_\bD_\bu_\bn_\be_\b:_\b:_\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\be_\bx_\bL_\bi_\bs_\bt_\bM_\bo_\bd_\bi_\bf_\bi_\be_\br_\b:_\b:_\br_\be_\bp_\ba_\bi_\br_\bL_\bo_\bc_\ba_\bl_\bI_\bn_\bd_\be_\bx_\bP_\bo_\bi_\bn_\bt_\be_\br_\bs\n+void repairLocalIndexPointers()\n+Repair the pointers to the local index pairs.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn remoteindices.hh:1574\n+_\bD_\bu_\bn_\be_\b:_\b:_\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\be_\bx_\b:_\b:_\ba_\bt_\bt_\br_\bi_\bb_\bu_\bt_\be\n+const Attribute attribute() const\n+Get the attribute of the index on the remote process.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn remoteindices.hh:945\n+_\bD_\bu_\bn_\be_\b:_\b:_\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\bi_\bc_\be_\bs_\b:_\b:_\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\bi_\bc_\be_\bs\n+RemoteIndices()\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn remoteindices.hh:976\n+_\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bl_\bl_\be_\bc_\bt_\bi_\bv_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b+_\b+\n+CollectiveIterator & operator++()\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn remoteindices.hh:1778\n+_\bD_\bu_\bn_\be_\b:_\b:_\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\bi_\bc_\be_\bs_\b:_\b:_\bs_\be_\bt_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt_\bs\n+void setIndexSets(const ParallelIndexSet &source, const ParallelIndexSet\n+&destination, const MPI_Comm &comm, const std::vector< int > &neighbours=std::\n+vector< int >())\n+Set the index sets and communicator we work with.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn remoteindices.hh:983\n+_\bD_\bu_\bn_\be_\b:_\b:_\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\bi_\bc_\be_\bs_\b:_\b:_\bf_\br_\be_\be\n+void free()\n+Free the index lists.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn remoteindices.hh:1428\n+_\bD_\bu_\bn_\be_\b:_\b:_\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\be_\bx_\bL_\bi_\bs_\bt_\bM_\bo_\bd_\bi_\bf_\bi_\be_\br_\b:_\b:_\bi_\bn_\bs_\be_\br_\bt\n+void insert(const RemoteIndex &index)\n+Insert an index to the list.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn remoteindices.hh:1604\n+_\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bl_\bl_\be_\bc_\bt_\bi_\bv_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\be_\bn_\bd\n+iterator end()\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn remoteindices.hh:1821\n+_\bD_\bu_\bn_\be_\b:_\b:_\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\bi_\bc_\be_\bs_\b:_\b:_\br_\be_\bb_\bu_\bi_\bl_\bd\n+void rebuild()\n+Rebuilds the set of remote indices.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn remoteindices.hh:1452\n+_\bD_\bu_\bn_\be_\b:_\b:_\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\be_\bx_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b=_\b=\n+bool operator==(const RemoteIndex &ri) const\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn remoteindices.hh:933\n+_\bD_\bu_\bn_\be_\b:_\b:_\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\bi_\bc_\be_\bs_\b:_\b:_\bc_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bo_\br\n+MPI_Comm communicator() const\n+Get the mpi communicator used.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn remoteindices.hh:1695\n+_\bD_\bu_\bn_\be_\b:_\b:_\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\bi_\bc_\be_\bs_\b:_\b:_\bi_\bt_\be_\br_\ba_\bt_\bo_\br\n+CollectiveIteratorT iterator() const\n+Get an iterator for collectively iterating over the remote indices of all\n+remote processes.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn remoteindices.hh:1689\n+_\bD_\bu_\bn_\be_\b:_\b:_\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\bi_\bc_\be_\bs_\b:_\b:_\bs_\be_\bt_\bI_\bn_\bc_\bl_\bu_\bd_\be_\bS_\be_\bl_\bf\n+void setIncludeSelf(bool includeSelf)\n+Tell whether sending from indices of the processor to other indices on the same\n+processor is enabled ...\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn remoteindices.hh:970\n+_\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bl_\bl_\be_\bc_\bt_\bi_\bv_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\bC_\bo_\bl_\bl_\be_\bc_\bt_\bi_\bv_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br\n+CollectiveIterator(const RemoteIndexMap &map_, bool send)\n+Constructor.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn remoteindices.hh:1702\n+_\bD_\bu_\bn_\be_\b:_\b:_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt_\b:_\b:_\bb_\be_\bg_\bi_\bn\n+iterator begin()\n+Get an iterator over the indices positioned at the first index.\n+_\bD_\bu_\bn_\be_\b:_\b:_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt_\b:_\b:_\be_\bn_\bd\n+iterator end()\n+Get an iterator over the indices positioned after the last index.\n+_\bD_\bu_\bn_\be_\b:_\b:_\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\bi_\bc_\be_\bs_\b:_\b:_\be_\bn_\bd\n+const_iterator end() const\n+Get an iterator over all remote index lists.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn remoteindices.hh:1528\n+_\bD_\bu_\bn_\be_\b:_\b:_\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\bi_\bc_\be_\bs_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b=_\b=\n+bool operator==(const RemoteIndices &ri) const\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn remoteindices.hh:1535\n+_\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bl_\bl_\be_\bc_\bt_\bi_\bv_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\be_\bm_\bp_\bt_\by\n+bool empty() const\n+Checks whether there are still iterators in the map.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn remoteindices.hh:1803\n+_\bD_\bu_\bn_\be_\b:_\b:_\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\bi_\bc_\be_\bs_\b:_\b:_\bg_\be_\bt_\bM_\bo_\bd_\bi_\bf_\bi_\be_\br\n+RemoteIndexListModifier< T, A, mode > getModifier(int process)\n+Get a modifier for a remote index list.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn remoteindices.hh:1479\n+_\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bl_\bl_\be_\bc_\bt_\bi_\bv_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\ba_\bd_\bv_\ba_\bn_\bc_\be\n+void advance(const GlobalIndex &global)\n+Advances all underlying iterators.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn remoteindices.hh:1715\n+_\bD_\bu_\bn_\be_\b:_\b:_\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\be_\bx_\b:_\b:_\bl_\bo_\bc_\ba_\bl_\bI_\bn_\bd_\be_\bx_\bP_\ba_\bi_\br\n+const PairType & localIndexPair() const\n+Get the corresponding local index pair.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn remoteindices.hh:951\n+_\bD_\bu_\bn_\be_\b:_\b:_\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\bi_\bc_\be_\bs_\b:_\b:_\bs_\bo_\bu_\br_\bc_\be_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt\n+const ParallelIndexSet & sourceIndexSet() const\n+Get the index set at the source.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn remoteindices.hh:998\n+_\bD_\bu_\bn_\be_\b:_\b:_\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\bi_\bc_\be_\bs_\b:_\b:_\b~_\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\bi_\bc_\be_\bs\n+~RemoteIndices()\n+Destructor.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn remoteindices.hh:1013\n+_\bD_\bu_\bn_\be_\b:_\b:_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt_\b:_\b:_\bL_\bo_\bc_\ba_\bl_\bI_\bn_\bd_\be_\bx\n+TL LocalIndex\n+The type of the local index, e.g. ParallelLocalIndex.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn indexset.hh:239\n+_\bD_\bu_\bn_\be_\b:_\b:_\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\be_\bx_\bL_\bi_\bs_\bt_\bM_\bo_\bd_\bi_\bf_\bi_\be_\br_\b:_\b:_\br_\be_\bm_\bo_\bv_\be\n+bool remove(const GlobalIndex &global)\n+Remove a remote index.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn remoteindices.hh:1652\n+_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bd_\be_\bx_\bP_\ba_\bi_\br_\b:_\b:_\bg_\bl_\bo_\bb_\ba_\bl\n+const GlobalIndex & global() const\n+Get the global index.\n+_\bD_\bu_\bn_\be_\b:_\b:_\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\be_\bx_\b:_\b:_\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\be_\bx\n+RemoteIndex()\n+Parameterless Constructor.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn remoteindices.hh:929\n+_\bD_\bu_\bn_\be_\b:_\b:_\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\bi_\bc_\be_\bs_\b:_\b:_\bn_\be_\bi_\bg_\bh_\bb_\bo_\bu_\br_\bs\n+int neighbours() const\n+Get the number of processors we share indices with.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn remoteindices.hh:1445\n+_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bd_\be_\bx_\bP_\ba_\bi_\br_\b:_\b:_\bl_\bo_\bc_\ba_\bl\n+LocalIndex & local()\n+Get the local index.\n+_\bD_\bu_\bn_\be_\b:_\b:_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt_\b:_\b:_\bG_\bl_\bo_\bb_\ba_\bl_\bI_\bn_\bd_\be_\bx\n+TG GlobalIndex\n+the type of the global index. This type has to provide at least a operator< for\n+sorting.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn indexset.hh:226\n+_\bD_\bu_\bn_\be_\b:_\b:_\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\bi_\bc_\be_\bs_\b:_\b:_\bd_\be_\bs_\bt_\bi_\bn_\ba_\bt_\bi_\bo_\bn_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt\n+const ParallelIndexSet & destinationIndexSet() const\n+Get the index set at destination.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn remoteindices.hh:1006\n+_\bD_\bu_\bn_\be_\b:_\b:_\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\bi_\bc_\be_\bs_\b:_\b:_\bf_\bi_\bn_\bd\n+const_iterator find(int proc) const\n+Find an iterator over the remote index lists of a specific process.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn remoteindices.hh:1514\n+_\bD_\bu_\bn_\be_\b:_\b:_\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\bi_\bc_\be_\bs_\b:_\b:_\bi_\bs_\bS_\by_\bn_\bc_\be_\bd\n+bool isSynced() const\n+Checks whether the remote indices are synced with the indexsets.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn remoteindices.hh:1472\n+_\bD_\bu_\bn_\be_\b:_\b:_\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\be_\bx_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b!_\b=\n+bool operator!=(const RemoteIndex &ri) const\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn remoteindices.hh:939\n+_\bD_\bu_\bn_\be_\b:_\b:_\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\bi_\bc_\be_\bs_\b:_\b:_\bb_\be_\bg_\bi_\bn\n+const_iterator begin() const\n+Get an iterator over all remote index lists.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn remoteindices.hh:1521\n+_\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bl_\bl_\be_\bc_\bt_\bi_\bv_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\bb_\be_\bg_\bi_\bn\n+iterator begin()\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn remoteindices.hh:1810\n+_\bD_\bu_\bn_\be_\b:_\b:_\bG_\bR_\bO_\bU_\bN_\bD\n+@ GROUND\n+The default mode. Indicates that the index set is ready to be used.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn indexset.hh:186\n+_\bD_\bu_\bn_\be_\b:_\b:_\bd_\bv_\bv_\be_\br_\bb\n+DVVerbType dvverb(std::cout)\n+stream for very verbose output.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn stdstreams.hh:96\n+_\bs_\bt_\bd\n+STL namespace.\n _\bD_\bu_\bn_\be\n Dune namespace.\n D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn alignedallocator.hh:13\n-_\bD_\bu_\bn_\be_\b:_\b:_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bE_\br_\br_\bo_\br\n-Default exception if an error in the parallel communication of the program\n-occurred.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn exceptions.hh:287\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\bP_\bI_\bG_\bu_\ba_\br_\bd_\bE_\br_\br_\bo_\br\n-This exception is thrown if the MPIGuard detects an error on a remote process.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mpiguard.hh:103\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\bP_\bI_\bG_\bu_\ba_\br_\bd\n-detects a thrown exception and communicates to all other processes\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mpiguard.hh:138\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\bP_\bI_\bG_\bu_\ba_\br_\bd_\b:_\b:_\br_\be_\ba_\bc_\bt_\bi_\bv_\ba_\bt_\be\n-void reactivate()\n-reactivate the guard.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mpiguard.hh:206\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\bP_\bI_\bG_\bu_\ba_\br_\bd_\b:_\b:_\bf_\bi_\bn_\ba_\bl_\bi_\bz_\be\n-void finalize(bool success=true)\n-stop the guard.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mpiguard.hh:222\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\bP_\bI_\bG_\bu_\ba_\br_\bd_\b:_\b:_\b~_\bM_\bP_\bI_\bG_\bu_\ba_\br_\bd\n-~MPIGuard()\n-destroy the guard and check for undetected exceptions\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mpiguard.hh:192\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\bP_\bI_\bG_\bu_\ba_\br_\bd_\b:_\b:_\bM_\bP_\bI_\bG_\bu_\ba_\br_\bd\n-MPIGuard(const C &comm, bool active=true)\n-create an MPIGuard operating on an arbitrary communicator.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mpiguard.hh:178\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\bP_\bI_\bG_\bu_\ba_\br_\bd_\b:_\b:_\bM_\bP_\bI_\bG_\bu_\ba_\br_\bd\n-MPIGuard(const MPI_Comm &comm, bool active=true)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mpiguard.hh:184\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\bP_\bI_\bG_\bu_\ba_\br_\bd_\b:_\b:_\bM_\bP_\bI_\bG_\bu_\ba_\br_\bd\n-MPIGuard(bool active=true)\n-create an MPIGuard operating on the Communicator of the global Dune::MPIHelper\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mpiguard.hh:150\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\bP_\bI_\bG_\bu_\ba_\br_\bd_\b:_\b:_\bM_\bP_\bI_\bG_\bu_\ba_\br_\bd\n-MPIGuard(MPIHelper &m, bool active=true)\n-create an MPIGuard operating on the Communicator of a special Dune::MPIHelper m\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mpiguard.hh:161\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\bP_\bI_\bH_\be_\bl_\bp_\be_\br\n-A real mpi helper.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mpihelper.hh:181\n+_\bD_\bu_\bn_\be_\b:_\b:_\bs_\bi_\bz_\be\n+constexpr std::integral_constant< std::size_t, sizeof...(II)> size(std::\n+integer_sequence< T, II... >)\n+Return the size of the sequence.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn integersequence.hh:75\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\bP_\bI_\bT_\br_\ba_\bi_\bt_\bs\n+A traits class describing the mapping of types onto MPI_Datatypes.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mpitraits.hh:41\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\bP_\bI_\bT_\br_\ba_\bi_\bt_\bs_\b:_\b:_\bg_\be_\bt_\bT_\by_\bp_\be\n+static MPI_Datatype getType()\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mpitraits.hh:48\n+_\bD_\bu_\bn_\be_\b:_\b:_\bR_\ba_\bn_\bg_\be_\bE_\br_\br_\bo_\br\n+Default exception class for range errors.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn exceptions.hh:254\n+_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bd_\be_\bx_\bP_\ba_\bi_\br\n+A pair consisting of a global and local index.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn indexset.hh:85\n+_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bv_\ba_\bl_\bi_\bd_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt_\bS_\bt_\ba_\bt_\be\n+Exception indicating that the index set is not in the expected state.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn indexset.hh:205\n+_\bD_\bu_\bn_\be_\b:_\b:_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt\n+Manager class for the mapping between local indices and globally unique\n+indices.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn indexset.hh:218\n+_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bd_\bi_\bc_\be_\bs_\bS_\by_\bn_\bc_\be_\br\n+Class for recomputing missing indices of a distributed index set.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn indicessyncer.hh:45\n+_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bt_\be_\br_\bf_\ba_\bc_\be_\bB_\bu_\bi_\bl_\bd_\be_\br\n+Base class of all classes representing a communication interface.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn parallel/interface.hh:44\n+_\bD_\bu_\bn_\be_\b:_\b:_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bL_\bo_\bc_\ba_\bl_\bI_\bn_\bd_\be_\bx\n+An index present on the local process with an additional attribute flag.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn plocalindex.hh:52\n+_\bD_\bu_\bn_\be_\b:_\b:_\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\bi_\bc_\be_\bs\n+The indices present on remote processes.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn remoteindices.hh:190\n+_\bD_\bu_\bn_\be_\b:_\b:_\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\bi_\bc_\be_\bs_\b:_\b:_\bg_\be_\bt_\bN_\be_\bi_\bg_\bh_\bb_\bo_\bu_\br_\bs\n+const std::set< int > & getNeighbours() const\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn remoteindices.hh:308\n+_\bD_\bu_\bn_\be_\b:_\b:_\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\bi_\bc_\be_\bs_\b:_\b:_\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\be_\bx\n+Dune::RemoteIndex< GlobalIndex, Attribute > RemoteIndex\n+Type of the remote indices we manage.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn remoteindices.hh:232\n+_\bD_\bu_\bn_\be_\b:_\b:_\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\bi_\bc_\be_\bs_\b:_\b:_\bf_\bi_\bl_\bl_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt_\bH_\bo_\bl_\be_\bs\n+friend void fillIndexSetHoles(const G &graph, Dune::\n+OwnerOverlapCopyCommunication< T1, T2 > &oocomm)\n+_\bD_\bu_\bn_\be_\b:_\b:_\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\bi_\bc_\be_\bs_\b:_\b:_\br_\be_\bp_\ba_\bi_\br_\bL_\bo_\bc_\ba_\bl_\bI_\bn_\bd_\be_\bx_\bP_\bo_\bi_\bn_\bt_\be_\br_\bs\n+friend void repairLocalIndexPointers(std::map< int, SLList< std::pair< typename\n+T1::GlobalIndex, typename T1::LocalIndex::Attribute >, A2 > > &, RemoteIndices<\n+T1, A1 > &, const T1 &)\n+_\bD_\bu_\bn_\be_\b:_\b:_\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\bi_\bc_\be_\bs_\b:_\b:_\bG_\bl_\bo_\bb_\ba_\bl_\bI_\bn_\bd_\be_\bx\n+ParallelIndexSet::GlobalIndex GlobalIndex\n+The type of the global index.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn remoteindices.hh:216\n+_\bD_\bu_\bn_\be_\b:_\b:_\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\bi_\bc_\be_\bs_\b:_\b:_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt\n+T ParallelIndexSet\n+Type of the index set we use, e.g. ParallelLocalIndexSet.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn remoteindices.hh:207\n+_\bD_\bu_\bn_\be_\b:_\b:_\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\bi_\bc_\be_\bs_\b:_\b:_\bA_\bt_\bt_\br_\bi_\bb_\bu_\bt_\be\n+LocalIndex::Attribute Attribute\n+The type of the attribute.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn remoteindices.hh:227\n+_\bD_\bu_\bn_\be_\b:_\b:_\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\bi_\bc_\be_\bs_\b:_\b:_\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\be_\bx_\bM_\ba_\bp\n+std::map< int, std::pair< RemoteIndexList *, RemoteIndexList * > >\n+RemoteIndexMap\n+The type of the map from rank to remote index list.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn remoteindices.hh:246\n+_\bD_\bu_\bn_\be_\b:_\b:_\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\bi_\bc_\be_\bs_\b:_\b:_\bs_\be_\bt_\bN_\be_\bi_\bg_\bh_\bb_\bo_\bu_\br_\bs\n+void setNeighbours(const C &neighbours)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn remoteindices.hh:301\n+_\bD_\bu_\bn_\be_\b:_\b:_\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\bi_\bc_\be_\bs_\b:_\b:_\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\be_\bx_\bL_\bi_\bs_\bt\n+Dune::SLList< RemoteIndex, Allocator > RemoteIndexList\n+The type of the remote index list.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn remoteindices.hh:242\n+_\bD_\bu_\bn_\be_\b:_\b:_\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\bi_\bc_\be_\bs_\b:_\b:_\bC_\bo_\bl_\bl_\be_\bc_\bt_\bi_\bv_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bT\n+CollectiveIterator< T, A > CollectiveIteratorT\n+The type of the collective iterator over all remote indices.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn remoteindices.hh:211\n+_\bD_\bu_\bn_\be_\b:_\b:_\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\bi_\bc_\be_\bs_\b:_\b:_\bA_\bl_\bl_\bo_\bc_\ba_\bt_\bo_\br\n+typename std::allocator_traits< A >::template rebind_alloc< RemoteIndex >\n+Allocator\n+The type of the allocator for the remote index list.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn remoteindices.hh:238\n+_\bD_\bu_\bn_\be_\b:_\b:_\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\bi_\bc_\be_\bs_\b:_\b:_\bL_\bo_\bc_\ba_\bl_\bI_\bn_\bd_\be_\bx\n+ParallelIndexSet::LocalIndex LocalIndex\n+The type of the local index.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn remoteindices.hh:222\n+_\bD_\bu_\bn_\be_\b:_\b:_\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\bi_\bc_\be_\bs_\b:_\b:_\bc_\bo_\bn_\bs_\bt_\b__\bi_\bt_\be_\br_\ba_\bt_\bo_\br\n+RemoteIndexMap::const_iterator const_iterator\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn remoteindices.hh:248\n+_\bD_\bu_\bn_\be_\b:_\b:_\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\be_\bx\n+Information about an index residing on another processor.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn remoteindices.hh:74\n+_\bD_\bu_\bn_\be_\b:_\b:_\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\be_\bx_\b:_\b:_\br_\be_\bp_\ba_\bi_\br_\bL_\bo_\bc_\ba_\bl_\bI_\bn_\bd_\be_\bx_\bP_\bo_\bi_\bn_\bt_\be_\br_\bs\n+friend void repairLocalIndexPointers(std::map< int, SLList< std::pair< typename\n+T::GlobalIndex, typename T::LocalIndex::Attribute >, A > > &, RemoteIndices< T,\n+A1 > &, const T &)\n+_\bD_\bu_\bn_\be_\b:_\b:_\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\be_\bx_\b:_\b:_\bG_\bl_\bo_\bb_\ba_\bl_\bI_\bn_\bd_\be_\bx\n+T1 GlobalIndex\n+the type of the global index. This type has to provide at least a operator< for\n+sorting.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn remoteindices.hh:91\n+_\bD_\bu_\bn_\be_\b:_\b:_\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\be_\bx_\b:_\b:_\bA_\bt_\bt_\br_\bi_\bb_\bu_\bt_\be\n+T2 Attribute\n+The type of the attributes. Normally this will be an enumeration like.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn remoteindices.hh:100\n+_\bD_\bu_\bn_\be_\b:_\b:_\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\be_\bx_\b:_\b:_\bP_\ba_\bi_\br_\bT_\by_\bp_\be\n+IndexPair< GlobalIndex, ParallelLocalIndex< Attribute > > PairType\n+The type of the index pair.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn remoteindices.hh:106\n+_\bD_\bu_\bn_\be_\b:_\b:_\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\be_\bx_\bL_\bi_\bs_\bt_\bM_\bo_\bd_\bi_\bf_\bi_\be_\br\n+Modifier for adding and/or deleting remote indices from the remote index list.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn remoteindices.hh:550\n+_\bD_\bu_\bn_\be_\b:_\b:_\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\be_\bx_\bL_\bi_\bs_\bt_\bM_\bo_\bd_\bi_\bf_\bi_\be_\br_\b:_\b:_\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\be_\bx_\bL_\bi_\bs_\bt\n+Dune::SLList< RemoteIndex, Allocator > RemoteIndexList\n+The type of the remote index list.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn remoteindices.hh:601\n+_\bD_\bu_\bn_\be_\b:_\b:_\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\be_\bx_\bL_\bi_\bs_\bt_\bM_\bo_\bd_\bi_\bf_\bi_\be_\br_\b:_\b:_\bA_\bl_\bl_\bo_\bc_\ba_\bt_\bo_\br\n+A Allocator\n+The type of the allocator for the remote index list.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn remoteindices.hh:597\n+_\bD_\bu_\bn_\be_\b:_\b:_\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\be_\bx_\bL_\bi_\bs_\bt_\bM_\bo_\bd_\bi_\bf_\bi_\be_\br_\b:_\b:_\bG_\bl_\bo_\bb_\ba_\bl_\bI_\bn_\bd_\be_\bx\n+ParallelIndexSet::GlobalIndex GlobalIndex\n+The type of the global index.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn remoteindices.hh:577\n+_\bD_\bu_\bn_\be_\b:_\b:_\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\be_\bx_\bL_\bi_\bs_\bt_\bM_\bo_\bd_\bi_\bf_\bi_\be_\br_\b:_\b:_\bL_\bo_\bc_\ba_\bl_\bI_\bn_\bd_\be_\bx\n+ParallelIndexSet::LocalIndex LocalIndex\n+The type of the local index.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn remoteindices.hh:582\n+_\bD_\bu_\bn_\be_\b:_\b:_\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\be_\bx_\bL_\bi_\bs_\bt_\bM_\bo_\bd_\bi_\bf_\bi_\be_\br_\b:_\b:_\bC_\bo_\bn_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br\n+RemoteIndexList::const_iterator ConstIterator\n+The type of the remote index list iterator.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn remoteindices.hh:611\n+_\bD_\bu_\bn_\be_\b:_\b:_\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\be_\bx_\bL_\bi_\bs_\bt_\bM_\bo_\bd_\bi_\bf_\bi_\be_\br_\b:_\b:_\bM_\bo_\bd_\bi_\bf_\by_\bI_\bt_\be_\br_\ba_\bt_\bo_\br\n+SLListModifyIterator< RemoteIndex, Allocator > ModifyIterator\n+The type of the modifying iterator of the remote index list.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn remoteindices.hh:606\n+_\bD_\bu_\bn_\be_\b:_\b:_\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\be_\bx_\bL_\bi_\bs_\bt_\bM_\bo_\bd_\bi_\bf_\bi_\be_\br_\b:_\b:_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt\n+T ParallelIndexSet\n+Type of the index set we use.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn remoteindices.hh:572\n+_\bD_\bu_\bn_\be_\b:_\b:_\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\be_\bx_\bL_\bi_\bs_\bt_\bM_\bo_\bd_\bi_\bf_\bi_\be_\br_\b:_\b:_\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\be_\bx_\bL_\bi_\bs_\bt_\bM_\bo_\bd_\bi_\bf_\bi_\be_\br\n+RemoteIndexListModifier()\n+Default constructor.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn remoteindices.hh:675\n+_\bD_\bu_\bn_\be_\b:_\b:_\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\be_\bx_\bL_\bi_\bs_\bt_\bM_\bo_\bd_\bi_\bf_\bi_\be_\br_\b:_\b:_\bA_\bt_\bt_\br_\bi_\bb_\bu_\bt_\be\n+LocalIndex::Attribute Attribute\n+The type of the attribute.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn remoteindices.hh:587\n+_\bD_\bu_\bn_\be_\b:_\b:_\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\be_\bx_\bL_\bi_\bs_\bt_\bM_\bo_\bd_\bi_\bf_\bi_\be_\br_\b:_\b:_\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\be_\bx\n+Dune::RemoteIndex< GlobalIndex, Attribute > RemoteIndex\n+Type of the remote indices we manage.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn remoteindices.hh:592\n+_\bD_\bu_\bn_\be_\b:_\b:_\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\be_\bx_\bL_\bi_\bs_\bt_\bM_\bo_\bd_\bi_\bf_\bi_\be_\br_\b:_\b:_\bM_\bO_\bD_\bI_\bF_\bY_\bI_\bN_\bD_\bE_\bX_\bS_\bE_\bT\n+static constexpr bool MODIFYINDEXSET\n+If true the index set corresponding to the remote indices might get modified.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn remoteindices.hh:567\n+_\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bl_\bl_\be_\bc_\bt_\bi_\bv_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br\n+A collective iterator for moving over the remote indices for all processes\n+collectively.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn remoteindices.hh:707\n+_\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bl_\bl_\be_\bc_\bt_\bi_\bv_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\be_\bx_\bM_\ba_\bp\n+std::map< int, std::pair< RemoteIndexList *, RemoteIndexList * > >\n+RemoteIndexMap\n+The type of the map from rank to remote index list.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn remoteindices.hh:747\n+_\bD_\bu_\bn_\be_\b:_\b:_\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn remoteindices.hh:168\n+_\bD_\bu_\bn_\be_\b:_\b:_\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\be_\bx_\bL_\bi_\bs_\bt_\bM_\bo_\bd_\bi_\bf_\bi_\be_\br_\b:_\b:_\bI_\bn_\bv_\ba_\bl_\bi_\bd_\bP_\bo_\bs_\bi_\bt_\bi_\bo_\bn\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn remoteindices.hh:557\n+_\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bl_\bl_\be_\bc_\bt_\bi_\bv_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\bi_\bt_\be_\br_\ba_\bt_\bo_\br\n+Iterator over the valid underlying iterators.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn remoteindices.hh:791\n+_\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bl_\bl_\be_\bc_\bt_\bi_\bv_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\bi_\bt_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\bi_\bt_\be_\br_\ba_\bt_\bo_\br\n+iterator(const RealIterator &iter, const ConstRealIterator &end, GlobalIndex\n+&index)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn remoteindices.hh:798\n+_\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bl_\bl_\be_\bc_\bt_\bi_\bv_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\bi_\bt_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\bi_\bt_\be_\br_\ba_\bt_\bo_\br\n+iterator(const iterator &other)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn remoteindices.hh:816\n+_\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bl_\bl_\be_\bc_\bt_\bi_\bv_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\bi_\bt_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b*\n+const RemoteIndex & operator*() const\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn remoteindices.hh:837\n+_\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bl_\bl_\be_\bc_\bt_\bi_\bv_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\bi_\bt_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\bC_\bo_\bn_\bs_\bt_\bR_\be_\ba_\bl_\bI_\bt_\be_\br_\ba_\bt_\bo_\br\n+Map::iterator ConstRealIterator\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn remoteindices.hh:794\n+_\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bl_\bl_\be_\bc_\bt_\bi_\bv_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\bi_\bt_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b+_\b+\n+iterator & operator++()\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn remoteindices.hh:821\n+_\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bl_\bl_\be_\bc_\bt_\bi_\bv_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\bi_\bt_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b-_\b>\n+const RemoteIndex * operator->() const\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn remoteindices.hh:849\n+_\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bl_\bl_\be_\bc_\bt_\bi_\bv_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\bi_\bt_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b=_\b=\n+bool operator==(const iterator &other) const\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn remoteindices.hh:855\n+_\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bl_\bl_\be_\bc_\bt_\bi_\bv_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\bi_\bt_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\bp_\br_\bo_\bc_\be_\bs_\bs\n+int process() const\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn remoteindices.hh:843\n+_\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bl_\bl_\be_\bc_\bt_\bi_\bv_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\bi_\bt_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\bi_\bt_\be_\br_\ba_\bt_\bo_\br\n+iterator(const RealIterator &iter, const ConstRealIterator &end, GlobalIndex\n+index, Attribute attribute)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn remoteindices.hh:806\n+_\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bl_\bl_\be_\bc_\bt_\bi_\bv_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\bi_\bt_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b!_\b=\n+bool operator!=(const iterator &other) const\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn remoteindices.hh:861\n+_\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bl_\bl_\be_\bc_\bt_\bi_\bv_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\bi_\bt_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\bR_\be_\ba_\bl_\bI_\bt_\be_\br_\ba_\bt_\bo_\br\n+Map::iterator RealIterator\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn remoteindices.hh:793\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bL_\bL_\bi_\bs_\bt_\bC_\bo_\bn_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br\n+A constant iterator for the SLList.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn sllist.hh:371\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bL_\bL_\bi_\bs_\bt_\bM_\bo_\bd_\bi_\bf_\by_\bI_\bt_\be_\br_\ba_\bt_\bo_\br\n+A mutable iterator for the SLList.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn sllist.hh:429\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bL_\bL_\bi_\bs_\bt\n+A single linked list.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn sllist.hh:44\n ===============================================================================\n Generated by\u00a0_\b[_\bd_\bo_\bx_\by_\bg_\be_\bn_\b] 1.9.8\n"}]}, {"source1": "./usr/share/doc/libdune-common-doc/doxygen/a00059.html", "source2": "./usr/share/doc/libdune-common-doc/doxygen/a00059.html", "unified_diff": "@@ -1,15 +1,15 @@\n \n \n \n \n \n \n \n-dune-common: mpipack.hh File Reference\n+dune-common: mpi_collective_benchmark.cc File Reference\n \n \n \n \n \n \n \n@@ -65,52 +65,336 @@\n
    \n
    \n \n \n \n \n \n
    \n \n-
    mpipack.hh File Reference
    \n+Functions |\n+Variables
    \n+
    mpi_collective_benchmark.cc File Reference
    \n \n
    \n-\n-

    See MPI_Pack. \n-More...

    \n-
    #include <type_traits>
    \n+
    #include <chrono>
    \n+#include <functional>
    \n+#include <iostream>
    \n+#include <iomanip>
    \n+#include <string>
    \n+#include <thread>
    \n+#include <tuple>
    \n #include <vector>
    \n-#include <mpi.h>
    \n-#include <dune/common/parallel/mpicommunication.hh>
    \n-#include <dune/common/parallel/mpidata.hh>
    \n-
    \n-

    Go to the source code of this file.

    \n-\n-\n-\n-\n-\n-\n+#include <dune/common/exceptions.hh>
    \n+#include <dune/common/timer.hh>
    \n+#include <dune/common/parametertree.hh>
    \n+#include <dune/common/parametertreeparser.hh>
    \n+#include <dune/common/parallel/future.hh>
    \n+#include <dune/common/parallel/mpihelper.hh>
    \n+

    \n-Classes

    class  Dune::MPIPack
     
    struct  Dune::MPIData< P, std::enable_if_t< std::is_same< std::remove_const_t< P >, MPIPack >::value > >
     
    \n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n

    \n+Functions

    template<class CC >
    void communicate (CC &cc)
     
    template<class CC >
    Dune::Future< void > startCommunication (CC &cc)
     
    template<class CC >
    double runBlocking (CC &cc)
     
    template<class CC >
    double runNonblockingWait (CC &cc)
     
    std::tuple< double, double > runNonblockingSleep (decltype(Dune::MPIHelper::getCommunication())&cc, std::chrono::duration< double > wait_time)
     
    std::tuple< double, double > runNonblockingActive (decltype(Dune::MPIHelper::getCommunication())&cc, std::chrono::duration< double > wait_time)
     
    std::tuple< double, double > determineOverlap (std::function< std::tuple< double, double >(std::chrono::duration< double >)> fun)
     
    void printHeader ()
     
    void run (int s)
     
    int main (int argc, char **argv)
     
    \n-\n-\n-\n-\n+\n+\n+\n+\n+\n+\n

    \n-Namespaces

    namespace  Dune
     Dune namespace.
     

    \n+Variables

    Dune::ParameterTree options
     Benchmark for measure the possible overlap of computation and communication at MPI collective communications.
     
    std::vector< std::string > all_methods
     
    \n-

    Detailed Description

    \n-

    See MPI_Pack.

    \n-

    This Wrapper class takes care of the memory management and provides methods to pack and unpack objects. All objects that can be used for MPI communication can also be packed and unpacked to/from MPIPack.

    \n-
    Author
    Nils-Arne Dreier
    \n-
    \n+

    Function Documentation

    \n+\n+

    ◆ communicate()

    \n+\n+
    \n+
    \n+
    \n+template<class CC >
    \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+
    void communicate (CC & cc)
    \n+
    \n+\n+
    \n+
    \n+\n+

    ◆ determineOverlap()

    \n+\n+
    \n+
    \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+
    std::tuple< double, double > determineOverlap (std::function< std::tuple< double, double >(std::chrono::duration< double >)> fun)
    \n+
    \n+\n+
    \n+
    \n+\n+

    ◆ main()

    \n+\n+
    \n+
    \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+
    int main (int argc,
    char ** argv 
    )
    \n+
    \n+\n+
    \n+
    \n+\n+

    ◆ printHeader()

    \n+\n+
    \n+
    \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+
    void printHeader ()
    \n+
    \n+\n+
    \n+
    \n+\n+

    ◆ run()

    \n+\n+
    \n+
    \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+
    void run (int s)
    \n+
    \n+\n+
    \n+
    \n+\n+

    ◆ runBlocking()

    \n+\n+
    \n+
    \n+
    \n+template<class CC >
    \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+
    double runBlocking (CC & cc)
    \n+
    \n+\n+
    \n+
    \n+\n+

    ◆ runNonblockingActive()

    \n+\n+
    \n+
    \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+
    std::tuple< double, double > runNonblockingActive (decltype(Dune::MPIHelper::getCommunication())& cc,
    std::chrono::duration< double > wait_time 
    )
    \n+
    \n+\n+
    \n+
    \n+\n+

    ◆ runNonblockingSleep()

    \n+\n+
    \n+
    \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+
    std::tuple< double, double > runNonblockingSleep (decltype(Dune::MPIHelper::getCommunication())& cc,
    std::chrono::duration< double > wait_time 
    )
    \n+
    \n+\n+
    \n+
    \n+\n+

    ◆ runNonblockingWait()

    \n+\n+
    \n+
    \n+
    \n+template<class CC >
    \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+
    double runNonblockingWait (CC & cc)
    \n+
    \n+\n+
    \n+
    \n+\n+

    ◆ startCommunication()

    \n+\n+
    \n+
    \n+
    \n+template<class CC >
    \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+
    Dune::Future< void > startCommunication (CC & cc)
    \n+
    \n+\n+
    \n+
    \n+

    Variable Documentation

    \n+\n+

    ◆ all_methods

    \n+\n+
    \n+
    \n+ \n+ \n+ \n+ \n+
    std::vector<std::string> all_methods
    \n+
    \n+Initial value:
    = {"allreduce",
    \n+
    "barrier",
    \n+
    "broadcast",
    \n+
    "gather",
    \n+
    "allgather",
    \n+
    "scatter"}
    \n+
    \n+
    \n+
    \n+\n+

    ◆ options

    \n+\n+
    \n+
    \n+ \n+ \n+ \n+ \n+
    Dune::ParameterTree options
    \n+
    \n+\n+

    Benchmark for measure the possible overlap of computation and communication at MPI collective communications.

    \n+

    This benchmark is inspired by the sandia micro benchmark: W. Lawry, C. Wilson, A. Maccabe, R. Brightwell. COMB: A Portable Benchmark Suite for Assessing MPI Overlap. In Proceedings of the IEEE International Conference on Cluster Computing (CLUSTER 2002), p. 472, 2002. http://www.cs.sandia.gov/smb/overhead.html

    \n+

    The following communication times are measured: Blocking: Blocking call. E.g. MPI_Allreduce Nonblocking_wait (NB_Wait): Nonblocking (e.g. MPI_Iallreduce) call directly followed by MPI_Wait. Nonblocking_sleep (NB_Sleep): Nonblocking call followed by a busy wait until the work time has passed. Then MPI_Wait. Nonblocking_active (NB_active): Nonblocking call followed by a basy wait where in every iteration MPI_Test is called until the work time has passed. The MPI_wait.

    \n+

    The overhead is computed as the time for the Nonblocking call plus the time for MPI_Wait. The iteration time is the time for the whole communication. The available part of the communication time(avail(%)) is computed as 1-(overhead/base_t), where base_t is the time for calling the method with wait time = 0. The overhead is determined by increasing the work time successive until it is the dominant factor in the iteration time. Then the overhead is computed as iter_t-work_t.

    \n+

    Usage: mpirun ./mpi_collective_benchmark [options]

    \n+

    options: -method: default: allreduce. possible methods: allreduce, barrier, broadcast, gather, allgather, scatter -iterations: default: 10000. Number of iterations for measure the time for one communication -allMethods: default:0. If 1 iterates over all available methods -startSize: default: n, where n is the size of MPI_COMM_WORLD. runs the benchmark for different communicator sizes, starting with startSize. After every run the size is doubled. Finally one run is made for the whole communicator. -verbose: default: 0. If 1 prints intermediate information while determining the overhead. -threshold: default: 2. The threshold when the work time is the dominant factor in the iteration time. (Similar to the threshold in the sandia benchmark) -nohdr: default: 0. Suppress output of the header.

    \n+

    options can be set either in the options.ini file or can be pass at the command-line (-key value).

    \n+

    To get a good 'available' value for the NB_sleep communication, some MPI implementation need to spawn an extra thread. With MPICH you can activate this by setting the environment variable MPI_ASYNC_PROGRESS to 1, with IntelMPI the variable is called I_MPI_ASYNC_PROGRESS. (https://software.intel.com/en-us/mpi-developer-reference-linux-asynchronous-progress-control)

    \n+\n+
    \n+
    \n+
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,36 +1,151 @@\n dune-common\u00a02.10\n Loading...\n Searching...\n No Matches\n * _\bd_\bu_\bn_\be\n * _\bc_\bo_\bm_\bm_\bo_\bn\n * _\bp_\ba_\br_\ba_\bl_\bl_\be_\bl\n-_\bC_\bl_\ba_\bs_\bs_\be_\bs | _\bN_\ba_\bm_\be_\bs_\bp_\ba_\bc_\be_\bs\n-mpipack.hh File Reference\n-_\bC_\bo_\bm_\bm_\bo_\bn \u00bb _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\b _\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn\n-See MPI_Pack. _\bM_\bo_\br_\be_\b._\b._\b.\n-#include \n+ * _\bb_\be_\bn_\bc_\bh_\bm_\ba_\br_\bk\n+_\bF_\bu_\bn_\bc_\bt_\bi_\bo_\bn_\bs | _\bV_\ba_\br_\bi_\ba_\bb_\bl_\be_\bs\n+mpi_collective_benchmark.cc File Reference\n+#include \n+#include \n+#include \n+#include \n+#include \n+#include \n+#include \n #include \n-#include \n-#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bp_\ba_\br_\ba_\bl_\bl_\be_\bl_\b/_\bm_\bp_\bi_\bc_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b._\bh_\bh>\n-#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bp_\ba_\br_\ba_\bl_\bl_\be_\bl_\b/_\bm_\bp_\bi_\bd_\ba_\bt_\ba_\b._\bh_\bh>\n-_\bG_\bo_\b _\bt_\bo_\b _\bt_\bh_\be_\b _\bs_\bo_\bu_\br_\bc_\be_\b _\bc_\bo_\bd_\be_\b _\bo_\bf_\b _\bt_\bh_\bi_\bs_\b _\bf_\bi_\bl_\be_\b.\n-C\bCl\bla\bas\bss\bse\bes\bs\n- class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bM_\bP_\bI_\bP_\ba_\bc_\bk\n-\u00a0\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bM_\bP_\bI_\bD_\ba_\bt_\ba_\b<_\b _\bP_\b,_\b _\bs_\bt_\bd_\b:_\b:_\be_\bn_\ba_\bb_\bl_\be_\b__\bi_\bf_\b__\bt_\b<_\b _\bs_\bt_\bd_\b:_\b:_\bi_\bs_\b__\bs_\ba_\bm_\be_\b<_\b _\bs_\bt_\bd_\b:_\b:_\br_\be_\bm_\bo_\bv_\be_\b__\bc_\bo_\bn_\bs_\bt_\b__\bt_\b<\n- _\bP_\b _\b>_\b,_\b _\bM_\bP_\bI_\bP_\ba_\bc_\bk_\b _\b>_\b:_\b:_\bv_\ba_\bl_\bu_\be_\b _\b>_\b _\b>\n-\u00a0\n-N\bNa\bam\bme\bes\bsp\bpa\bac\bce\bes\bs\n-namespace \u00a0 _\bD_\bu_\bn_\be\n-\u00a0 _\bD_\bu_\bn_\be namespace.\n-\u00a0\n-*\b**\b**\b**\b**\b* D\bDe\bet\bta\bai\bil\ble\bed\bd D\bDe\bes\bsc\bcr\bri\bip\bpt\bti\bio\bon\bn *\b**\b**\b**\b**\b*\n-See MPI_Pack.\n-This Wrapper class takes care of the memory management and provides methods to\n-pack and unpack objects. All objects that can be used for MPI communication can\n-also be packed and unpacked to/from MPIPack.\n- Author\n- Nils-Arne Dreier\n+#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\be_\bx_\bc_\be_\bp_\bt_\bi_\bo_\bn_\bs_\b._\bh_\bh>\n+#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bt_\bi_\bm_\be_\br_\b._\bh_\bh>\n+#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bp_\ba_\br_\ba_\bm_\be_\bt_\be_\br_\bt_\br_\be_\be_\b._\bh_\bh>\n+#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bp_\ba_\br_\ba_\bm_\be_\bt_\be_\br_\bt_\br_\be_\be_\bp_\ba_\br_\bs_\be_\br_\b._\bh_\bh>\n+#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bp_\ba_\br_\ba_\bl_\bl_\be_\bl_\b/_\bf_\bu_\bt_\bu_\br_\be_\b._\bh_\bh>\n+#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bp_\ba_\br_\ba_\bl_\bl_\be_\bl_\b/_\bm_\bp_\bi_\bh_\be_\bl_\bp_\be_\br_\b._\bh_\bh>\n+F\bFu\bun\bnc\bct\bti\bio\bon\bns\bs\n+template\n+ void\u00a0 _\bc_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\be (CC &cc)\n+\u00a0\n+template\n+ _\bD_\bu_\bn_\be_\b:_\b:_\bF_\bu_\bt_\bu_\br_\be< void >\u00a0 _\bs_\bt_\ba_\br_\bt_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn (CC &cc)\n+\u00a0\n+template\n+ double\u00a0 _\br_\bu_\bn_\bB_\bl_\bo_\bc_\bk_\bi_\bn_\bg (CC &cc)\n+\u00a0\n+template\n+ double\u00a0 _\br_\bu_\bn_\bN_\bo_\bn_\bb_\bl_\bo_\bc_\bk_\bi_\bn_\bg_\bW_\ba_\bi_\bt (CC &cc)\n+\u00a0\n+std::tuple< double, double >\u00a0 _\br_\bu_\bn_\bN_\bo_\bn_\bb_\bl_\bo_\bc_\bk_\bi_\bn_\bg_\bS_\bl_\be_\be_\bp (decltype(_\bD_\bu_\bn_\be_\b:_\b:_\bM_\bP_\bI_\bH_\be_\bl_\bp_\be_\br_\b:_\b:\n+ _\bg_\be_\bt_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn())&cc, std::chrono::duration<\n+ double > wait_time)\n+\u00a0\n+std::tuple< double, double >\u00a0 _\br_\bu_\bn_\bN_\bo_\bn_\bb_\bl_\bo_\bc_\bk_\bi_\bn_\bg_\bA_\bc_\bt_\bi_\bv_\be (decltype(_\bD_\bu_\bn_\be_\b:_\b:_\bM_\bP_\bI_\bH_\be_\bl_\bp_\be_\br_\b:_\b:\n+ _\bg_\be_\bt_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn())&cc, std::chrono::duration<\n+ double > wait_time)\n+\u00a0\n+std::tuple< double, double >\u00a0 _\bd_\be_\bt_\be_\br_\bm_\bi_\bn_\be_\bO_\bv_\be_\br_\bl_\ba_\bp (std::function< std::tuple<\n+ double, double >(std::chrono::duration< double\n+ >)> fun)\n+\u00a0\n+ void\u00a0 _\bp_\br_\bi_\bn_\bt_\bH_\be_\ba_\bd_\be_\br ()\n+\u00a0\n+ void\u00a0 _\br_\bu_\bn (int s)\n+\u00a0\n+ int\u00a0 _\bm_\ba_\bi_\bn (int argc, char **argv)\n+\u00a0\n+V\bVa\bar\bri\bia\bab\bbl\ble\bes\bs\n+ _\bD_\bu_\bn_\be_\b:_\b:_\bP_\ba_\br_\ba_\bm_\be_\bt_\be_\br_\bT_\br_\be_\be\u00a0 _\bo_\bp_\bt_\bi_\bo_\bn_\bs\n+ Benchmark for measure the possible overlap of\n+\u00a0 computation and communication at MPI collective\n+ communications.\n+\u00a0\n+std::vector< std::string >\u00a0 _\ba_\bl_\bl_\b__\bm_\be_\bt_\bh_\bo_\bd_\bs\n+\u00a0\n+*\b**\b**\b**\b**\b* F\bFu\bun\bnc\bct\bti\bio\bon\bn D\bDo\boc\bcu\bum\bme\ben\bnt\bta\bat\bti\bio\bon\bn *\b**\b**\b**\b**\b*\n+*\b**\b**\b**\b**\b* _\b?\b\u25c6_\b?\b\u00a0c\bco\bom\bmm\bmu\bun\bni\bic\bca\bat\bte\be(\b()\b) *\b**\b**\b**\b**\b*\n+template\n+void communicate ( CC &\u00a0 c\bcc\bc )\n+*\b**\b**\b**\b**\b* _\b?\b\u25c6_\b?\b\u00a0d\bde\bet\bte\ber\brm\bmi\bin\bne\beO\bOv\bve\ber\brl\bla\bap\bp(\b()\b) *\b**\b**\b**\b**\b*\n+std::tuple< double, double > ( std::function< std::tuple< double, double f\bfu\bun\bn )\n+determineOverlap >(std::chrono::duration< double >)>\u00a0\n+*\b**\b**\b**\b**\b* _\b?\b\u25c6_\b?\b\u00a0m\bma\bai\bin\bn(\b()\b) *\b**\b**\b**\b**\b*\n+int main ( int\u00a0 a\bar\brg\bgc\bc,\n+ char **\u00a0 a\bar\brg\bgv\bv\u00a0\n+ )\n+*\b**\b**\b**\b**\b* _\b?\b\u25c6_\b?\b\u00a0p\bpr\bri\bin\bnt\btH\bHe\bea\bad\bde\ber\br(\b()\b) *\b**\b**\b**\b**\b*\n+void printHeader ( )\n+*\b**\b**\b**\b**\b* _\b?\b\u25c6_\b?\b\u00a0r\bru\bun\bn(\b()\b) *\b**\b**\b**\b**\b*\n+void run ( int\u00a0 s\bs )\n+*\b**\b**\b**\b**\b* _\b?\b\u25c6_\b?\b\u00a0r\bru\bun\bnB\bBl\blo\boc\bck\bki\bin\bng\bg(\b()\b) *\b**\b**\b**\b**\b*\n+template\n+double runBlocking ( CC &\u00a0 c\bcc\bc )\n+*\b**\b**\b**\b**\b* _\b?\b\u25c6_\b?\b\u00a0r\bru\bun\bnN\bNo\bon\bnb\bbl\blo\boc\bck\bki\bin\bng\bgA\bAc\bct\bti\biv\bve\be(\b()\b) *\b**\b**\b**\b**\b*\n+std::tuple< double, double > ( decltype(_\bD_\bu_\bn_\be_\b:_\b:_\bM_\bP_\bI_\bH_\be_\bl_\bp_\be_\br_\b:_\b: c\bcc\bc,\n+runNonblockingActive _\bg_\be_\bt_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn())&\u00a0\n+ std::chrono::duration< double >\u00a0 w\bwa\bai\bit\bt_\b_t\bti\bim\bme\be\u00a0\n+ )\n+*\b**\b**\b**\b**\b* _\b?\b\u25c6_\b?\b\u00a0r\bru\bun\bnN\bNo\bon\bnb\bbl\blo\boc\bck\bki\bin\bng\bgS\bSl\ble\bee\bep\bp(\b()\b) *\b**\b**\b**\b**\b*\n+std::tuple< double, double > ( decltype(_\bD_\bu_\bn_\be_\b:_\b:_\bM_\bP_\bI_\bH_\be_\bl_\bp_\be_\br_\b:_\b: c\bcc\bc,\n+runNonblockingSleep _\bg_\be_\bt_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn())&\u00a0\n+ std::chrono::duration< double >\u00a0 w\bwa\bai\bit\bt_\b_t\bti\bim\bme\be\u00a0\n+ )\n+*\b**\b**\b**\b**\b* _\b?\b\u25c6_\b?\b\u00a0r\bru\bun\bnN\bNo\bon\bnb\bbl\blo\boc\bck\bki\bin\bng\bgW\bWa\bai\bit\bt(\b()\b) *\b**\b**\b**\b**\b*\n+template\n+double runNonblockingWait ( CC &\u00a0 c\bcc\bc )\n+*\b**\b**\b**\b**\b* _\b?\b\u25c6_\b?\b\u00a0s\bst\bta\bar\brt\btC\bCo\bom\bmm\bmu\bun\bni\bic\bca\bat\bti\bio\bon\bn(\b()\b) *\b**\b**\b**\b**\b*\n+template\n+_\bD_\bu_\bn_\be_\b:_\b:_\bF_\bu_\bt_\bu_\br_\be< void > startCommunication ( CC &\u00a0 c\bcc\bc )\n+*\b**\b**\b**\b**\b* V\bVa\bar\bri\bia\bab\bbl\ble\be D\bDo\boc\bcu\bum\bme\ben\bnt\bta\bat\bti\bio\bon\bn *\b**\b**\b**\b**\b*\n+*\b**\b**\b**\b**\b* _\b?\b\u25c6_\b?\b\u00a0a\bal\bll\bl_\b_m\bme\bet\bth\bho\bod\bds\bs *\b**\b**\b**\b**\b*\n+std::vector all_methods\n+I\bIn\bni\bit\bti\bia\bal\bl v\bva\bal\blu\bue\be:\b:\n+= {\"allreduce\",\n+\"barrier\",\n+\"broadcast\",\n+\"gather\",\n+\"allgather\",\n+\"scatter\"}\n+*\b**\b**\b**\b**\b* _\b?\b\u25c6_\b?\b\u00a0o\bop\bpt\bti\bio\bon\bns\bs *\b**\b**\b**\b**\b*\n+_\bD_\bu_\bn_\be_\b:_\b:_\bP_\ba_\br_\ba_\bm_\be_\bt_\be_\br_\bT_\br_\be_\be options\n+Benchmark for measure the possible overlap of computation and communication at\n+MPI collective communications.\n+This benchmark is inspired by the sandia micro benchmark: W. Lawry, C. Wilson,\n+A. Maccabe, R. Brightwell. COMB: A Portable Benchmark Suite for Assessing MPI\n+Overlap. In Proceedings of the IEEE International Conference on Cluster\n+Computing (CLUSTER 2002), p. 472, 2002. _\bh_\bt_\bt_\bp_\b:_\b/_\b/_\bw_\bw_\bw_\b._\bc_\bs_\b._\bs_\ba_\bn_\bd_\bi_\ba_\b._\bg_\bo_\bv_\b/_\bs_\bm_\bb_\b/\n+_\bo_\bv_\be_\br_\bh_\be_\ba_\bd_\b._\bh_\bt_\bm_\bl\n+The following communication times are measured: Blocking: Blocking call. E.g.\n+MPI_Allreduce Nonblocking_wait (NB_Wait): Nonblocking (e.g. MPI_Iallreduce)\n+call directly followed by MPI_Wait. Nonblocking_sleep (NB_Sleep): Nonblocking\n+call followed by a busy wait until the work time has passed. Then MPI_Wait.\n+Nonblocking_active (NB_active): Nonblocking call followed by a basy wait where\n+in every iteration MPI_Test is called until the work time has passed. The\n+MPI_wait.\n+The overhead is computed as the time for the Nonblocking call plus the time for\n+MPI_Wait. The iteration time is the time for the whole communication. The\n+available part of the communication time(avail(%)) is computed as 1-(overhead/\n+base_t), where base_t is the time for calling the method with wait time = 0.\n+The overhead is determined by increasing the work time successive until it is\n+the dominant factor in the iteration time. Then the overhead is computed as\n+iter_t-work_t.\n+Usage: mpirun ./mpi_collective_benchmark [options]\n+options: -method: default: allreduce. possible methods: allreduce, barrier,\n+broadcast, gather, allgather, scatter -iterations: default: 10000. Number of\n+iterations for measure the time for one communication -allMethods: default:0.\n+If 1 iterates over all available methods -startSize: default: n, where n is the\n+size of MPI_COMM_WORLD. runs the benchmark for different communicator sizes,\n+starting with startSize. After every run the size is doubled. Finally one run\n+is made for the whole communicator. -verbose: default: 0. If 1 prints\n+intermediate information while determining the overhead. -threshold: default:\n+2. The threshold when the work time is the dominant factor in the iteration\n+time. (Similar to the threshold in the sandia benchmark) -nohdr: default: 0.\n+Suppress output of the header.\n+options can be set either in the options.ini file or can be pass at the\n+command-line (-key value).\n+To get a good 'available' value for the NB_sleep communication, some MPI\n+implementation need to spawn an extra thread. With MPICH you can activate this\n+by setting the environment variable MPI_ASYNC_PROGRESS to 1, with IntelMPI the\n+variable is called I_MPI_ASYNC_PROGRESS. (_\bh_\bt_\bt_\bp_\bs_\b:_\b/_\b/_\bs_\bo_\bf_\bt_\bw_\ba_\br_\be_\b._\bi_\bn_\bt_\be_\bl_\b._\bc_\bo_\bm_\b/_\be_\bn_\b-_\bu_\bs_\b/_\bm_\bp_\bi_\b-\n+_\bd_\be_\bv_\be_\bl_\bo_\bp_\be_\br_\b-_\br_\be_\bf_\be_\br_\be_\bn_\bc_\be_\b-_\bl_\bi_\bn_\bu_\bx_\b-_\ba_\bs_\by_\bn_\bc_\bh_\br_\bo_\bn_\bo_\bu_\bs_\b-_\bp_\br_\bo_\bg_\br_\be_\bs_\bs_\b-_\bc_\bo_\bn_\bt_\br_\bo_\bl)\n ===============================================================================\n Generated by\u00a0_\b[_\bd_\bo_\bx_\by_\bg_\be_\bn_\b] 1.9.8\n"}]}, {"source1": "./usr/share/doc/libdune-common-doc/doxygen/a00062.html", "source2": "./usr/share/doc/libdune-common-doc/doxygen/a00062.html", "unified_diff": "@@ -1,15 +1,15 @@\n \n \n \n \n \n \n \n-dune-common: mpicommunication.hh File Reference\n+dune-common: communication.hh File Reference\n \n \n \n \n \n \n \n@@ -72,107 +72,64 @@\n
  • dune
  • common
  • parallel
  • \n \n \n
    \n \n-
    mpicommunication.hh File Reference
    \n+
    communication.hh File Reference
    \n
    \n
    \n \n-

    Implements an utility class that provides MPI's collective communication methods. \n+

    Implements an utility class that provides collective communication methods for sequential programs. \n More...

    \n-
    #include <algorithm>
    \n-#include <functional>
    \n-#include <memory>
    \n-#include <mpi.h>
    \n-#include <dune/common/binaryfunctions.hh>
    \n-#include <dune/common/exceptions.hh>
    \n-#include <dune/common/parallel/communication.hh>
    \n-#include <dune/common/parallel/mpitraits.hh>
    \n-#include <dune/common/parallel/mpifuture.hh>
    \n-#include <dune/common/parallel/mpidata.hh>
    \n+
    #include <iostream>
    \n+#include <complex>
    \n+#include <algorithm>
    \n+#include <vector>
    \n+#include <dune/common/binaryfunctions.hh>
    \n+#include <dune/common/exceptions.hh>
    \n+#include <dune/common/parallel/future.hh>
    \n
    \n

    Go to the source code of this file.

    \n \n \n-\n+\n \n-\n-\n+\n+\n \n

    \n Classes

    class  Dune::Generic_MPI_Op< Type, BinaryFunction, Enable >
    struct  Dune::No_Comm
     
    class  Dune::Communication< MPI_Comm >
     Specialization of Communication for MPI. More...
    class  Dune::Communication< Communicator >
     Collective communication interface and sequential default implementation. More...
     
    \n \n \n \n \n

    \n Namespaces

    namespace  Dune
     Dune namespace.
     
    \n-\n-\n-\n+\n+\n+\n+\n

    \n-Macros

    #define ComposeMPIOp(func, op)
     

    \n+Typedefs

    template<class T >
    using Dune::CollectiveCommunication = Communication< T >
     
    \n \n-\n-\n-\n-\n-\n-\n-\n-\n+\n+\n+\n+\n+\n+\n

    \n Functions

     Dune::ComposeMPIOp (std::plus, MPI_SUM)
     
     Dune::ComposeMPIOp (std::multiplies, MPI_PROD)
     
     Dune::ComposeMPIOp (Min, MPI_MIN)
     
     Dune::ComposeMPIOp (Max, MPI_MAX)
     
    bool Dune::operator== (const No_Comm &, const No_Comm &)
     Comparison operator for MPI compatibility.
     
    bool Dune::operator!= (const No_Comm &, const No_Comm &)
     Comparison operator for MPI compatibility.
     
    \n

    Detailed Description

    \n-

    Implements an utility class that provides MPI's collective communication methods.

    \n-

    Macro Definition Documentation

    \n-\n-

    ◆ ComposeMPIOp

    \n-\n-
    \n-
    \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n-
    #define ComposeMPIOp( func,
     op 
    )
    \n-
    \n-Value:
    template<class T, class S> \\
    \n-
    class Generic_MPI_Op<T, func<S>, std::enable_if_t<MPITraits<S>::is_intrinsic> >{ \\
    \n-
    public: \\
    \n-
    static MPI_Op get(){ \\
    \n-
    return op; \\
    \n-
    } \\
    \n-
    private: \\
    \n-
    Generic_MPI_Op () {} \\
    \n-
    Generic_MPI_Op (const Generic_MPI_Op & ) {} \\
    \n-
    }
    \n-
    STL namespace.
    \n-
    \n-
    \n-
    \n-
    \n+

    Implements an utility class that provides collective communication methods for sequential programs.

    \n+

    An abstraction to the basic methods of parallel communication, following the message-passing paradigm.

    \n+
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,69 +1,49 @@\n dune-common\u00a02.10\n Loading...\n Searching...\n No Matches\n * _\bd_\bu_\bn_\be\n * _\bc_\bo_\bm_\bm_\bo_\bn\n * _\bp_\ba_\br_\ba_\bl_\bl_\be_\bl\n-_\bC_\bl_\ba_\bs_\bs_\be_\bs | _\bN_\ba_\bm_\be_\bs_\bp_\ba_\bc_\be_\bs | _\bM_\ba_\bc_\br_\bo_\bs | _\bF_\bu_\bn_\bc_\bt_\bi_\bo_\bn_\bs\n-mpicommunication.hh File Reference\n+_\bC_\bl_\ba_\bs_\bs_\be_\bs | _\bN_\ba_\bm_\be_\bs_\bp_\ba_\bc_\be_\bs | _\bT_\by_\bp_\be_\bd_\be_\bf_\bs | _\bF_\bu_\bn_\bc_\bt_\bi_\bo_\bn_\bs\n+communication.hh File Reference\n _\bC_\bo_\bm_\bm_\bo_\bn \u00bb _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\b _\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn\n-Implements an utility class that provides MPI's collective communication\n-methods. _\bM_\bo_\br_\be_\b._\b._\b.\n+Implements an utility class that provides collective communication methods for\n+sequential programs. _\bM_\bo_\br_\be_\b._\b._\b.\n+#include \n+#include \n #include \n-#include \n-#include \n-#include \n+#include \n #include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bb_\bi_\bn_\ba_\br_\by_\bf_\bu_\bn_\bc_\bt_\bi_\bo_\bn_\bs_\b._\bh_\bh>\n #include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\be_\bx_\bc_\be_\bp_\bt_\bi_\bo_\bn_\bs_\b._\bh_\bh>\n-#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bp_\ba_\br_\ba_\bl_\bl_\be_\bl_\b/_\bc_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b._\bh_\bh>\n-#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bp_\ba_\br_\ba_\bl_\bl_\be_\bl_\b/_\bm_\bp_\bi_\bt_\br_\ba_\bi_\bt_\bs_\b._\bh_\bh>\n-#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bp_\ba_\br_\ba_\bl_\bl_\be_\bl_\b/_\bm_\bp_\bi_\bf_\bu_\bt_\bu_\br_\be_\b._\bh_\bh>\n-#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bp_\ba_\br_\ba_\bl_\bl_\be_\bl_\b/_\bm_\bp_\bi_\bd_\ba_\bt_\ba_\b._\bh_\bh>\n+#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bp_\ba_\br_\ba_\bl_\bl_\be_\bl_\b/_\bf_\bu_\bt_\bu_\br_\be_\b._\bh_\bh>\n _\bG_\bo_\b _\bt_\bo_\b _\bt_\bh_\be_\b _\bs_\bo_\bu_\br_\bc_\be_\b _\bc_\bo_\bd_\be_\b _\bo_\bf_\b _\bt_\bh_\bi_\bs_\b _\bf_\bi_\bl_\be_\b.\n C\bCl\bla\bas\bss\bse\bes\bs\n-class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bG_\be_\bn_\be_\br_\bi_\bc_\b__\bM_\bP_\bI_\b__\bO_\bp_\b<_\b _\bT_\by_\bp_\be_\b,_\b _\bB_\bi_\bn_\ba_\br_\by_\bF_\bu_\bn_\bc_\bt_\bi_\bo_\bn_\b,_\b _\bE_\bn_\ba_\bb_\bl_\be_\b _\b>\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bN_\bo_\b__\bC_\bo_\bm_\bm\n \u00a0\n-class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b<_\b _\bM_\bP_\bI_\b__\bC_\bo_\bm_\bm_\b _\b>\n-\u00a0 Specialization of _\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn for MPI. _\bM_\bo_\br_\be_\b._\b._\b.\n+ class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b<_\b _\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bo_\br_\b _\b>\n+\u00a0 Collective communication interface and sequential default\n+ implementation. _\bM_\bo_\br_\be_\b._\b._\b.\n \u00a0\n N\bNa\bam\bme\bes\bsp\bpa\bac\bce\bes\bs\n namespace \u00a0 _\bD_\bu_\bn_\be\n \u00a0 _\bD_\bu_\bn_\be namespace.\n \u00a0\n-M\bMa\bac\bcr\bro\bos\bs\n-#define\u00a0 _\bC_\bo_\bm_\bp_\bo_\bs_\be_\bM_\bP_\bI_\bO_\bp(func, op)\n+T\bTy\byp\bpe\bed\bde\bef\bfs\bs\n+template\n+using\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bl_\bl_\be_\bc_\bt_\bi_\bv_\be_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn = _\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn< T >\n \u00a0\n F\bFu\bun\bnc\bct\bti\bio\bon\bns\bs\n-\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bm_\bp_\bo_\bs_\be_\bM_\bP_\bI_\bO_\bp (std::plus, MPI_SUM)\n+bool\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b=_\b= (const _\bN_\bo_\b__\bC_\bo_\bm_\bm &, const _\bN_\bo_\b__\bC_\bo_\bm_\bm &)\n+\u00a0 Comparison operator for MPI compatibility.\n \u00a0\n-\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bm_\bp_\bo_\bs_\be_\bM_\bP_\bI_\bO_\bp (std::multiplies, MPI_PROD)\n-\u00a0\n-\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bm_\bp_\bo_\bs_\be_\bM_\bP_\bI_\bO_\bp (_\bM_\bi_\bn, MPI_MIN)\n-\u00a0\n-\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bm_\bp_\bo_\bs_\be_\bM_\bP_\bI_\bO_\bp (_\bM_\ba_\bx, MPI_MAX)\n+bool\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b!_\b= (const _\bN_\bo_\b__\bC_\bo_\bm_\bm &, const _\bN_\bo_\b__\bC_\bo_\bm_\bm &)\n+\u00a0 Comparison operator for MPI compatibility.\n \u00a0\n *\b**\b**\b**\b**\b* D\bDe\bet\bta\bai\bil\ble\bed\bd D\bDe\bes\bsc\bcr\bri\bip\bpt\bti\bio\bon\bn *\b**\b**\b**\b**\b*\n-Implements an utility class that provides MPI's collective communication\n-methods.\n-*\b**\b**\b**\b**\b* M\bMa\bac\bcr\bro\bo D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn D\bDo\boc\bcu\bum\bme\ben\bnt\bta\bat\bti\bio\bon\bn *\b**\b**\b**\b**\b*\n-*\b**\b**\b**\b**\b* _\b?\b\u25c6_\b?\b\u00a0C\bCo\bom\bmp\bpo\bos\bse\beM\bMP\bPI\bIO\bOp\bp *\b**\b**\b**\b**\b*\n-#define ComposeMPIOp ( \u00a0 func,\n- \u00a0 op\u00a0\n- )\n-V\bVa\bal\blu\bue\be:\b:\n-template \\\n-class Generic_MPI_Op, _\bs_\bt_\bd::enable_if_t::is_intrinsic> >\n-{ \\\n-public: \\\n-static MPI_Op get(){ \\\n-return op; \\\n-} \\\n-private: \\\n-Generic_MPI_Op () {} \\\n-Generic_MPI_Op (const Generic_MPI_Op & ) {} \\\n-}\n-_\bs_\bt_\bd\n-STL namespace.\n+Implements an utility class that provides collective communication methods for\n+sequential programs.\n+An abstraction to the basic methods of parallel communication, following the\n+message-passing paradigm.\n ===============================================================================\n Generated by\u00a0_\b[_\bd_\bo_\bx_\by_\bg_\be_\bn_\b] 1.9.8\n"}]}, {"source1": "./usr/share/doc/libdune-common-doc/doxygen/a00062_source.html", "source2": "./usr/share/doc/libdune-common-doc/doxygen/a00062_source.html", "unified_diff": "@@ -1,15 +1,15 @@\n \n \n \n \n \n \n \n-dune-common: mpicommunication.hh Source File\n+dune-common: communication.hh Source File\n \n \n \n \n \n \n \n@@ -74,584 +74,413 @@\n \n \n \n
    \n-
    mpicommunication.hh
    \n+
    communication.hh
    \n
    \n
    \n Go to the documentation of this file.
    1// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
    \n
    2// vi: set et ts=4 sw=2 sts=2:
    \n
    3// SPDX-FileCopyrightInfo: Copyright \u00a9 DUNE Project contributors, see file LICENSE.md in module root
    \n
    4// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception
    \n-
    5#ifndef DUNE_COMMON_PARALLEL_MPICOMMUNICATION_HH
    \n-
    6#define DUNE_COMMON_PARALLEL_MPICOMMUNICATION_HH
    \n-
    7
    \n-
    16#if HAVE_MPI
    \n-
    17
    \n-
    18#include <algorithm>
    \n-
    19#include <functional>
    \n-
    20#include <memory>
    \n-
    21
    \n-
    22#include <mpi.h>
    \n-
    23
    \n-\n-\n-\n-\n-\n-\n-
    30
    \n-
    31namespace Dune
    \n-
    32{
    \n-
    33
    \n-
    34 //=======================================================
    \n-
    35 // use singleton pattern and template specialization to
    \n-
    36 // generate MPI operations
    \n-
    37 //=======================================================
    \n-
    38
    \n-
    39 template<typename Type, typename BinaryFunction, typename Enable=void>
    \n-
    \n-\n-
    41 {
    \n-
    42
    \n-
    43 public:
    \n-
    \n-
    44 static MPI_Op get ()
    \n-
    45 {
    \n-
    46 if (!op)
    \n-
    47 {
    \n-
    48 op = std::make_unique<MPI_Op>();
    \n-
    49 // The following line leaks an MPI operation object, because the corresponding
    \n-
    50 //`MPI_Op_free` is never called. It is never called because there is no easy
    \n-
    51 // way to call it at the right moment: right before the call to MPI_Finalize.
    \n-
    52 // See https://gitlab.dune-project.org/core/dune-istl/issues/80
    \n-
    53 MPI_Op_create((void (*)(void*, void*, int*, MPI_Datatype*))&operation,true,op.get());
    \n-
    54 }
    \n-
    55 return *op;
    \n-
    56 }
    \n-
    \n-
    57 private:
    \n-
    58 static void operation (Type *in, Type *inout, int *len, MPI_Datatype*)
    \n-
    59 {
    \n-
    60 BinaryFunction func;
    \n-
    61
    \n-
    62 for (int i=0; i< *len; ++i, ++in, ++inout) {
    \n-
    63 Type temp;
    \n-
    64 temp = func(*in, *inout);
    \n-
    65 *inout = temp;
    \n-
    66 }
    \n-
    67 }
    \n-
    68 Generic_MPI_Op () {}
    \n-
    69 Generic_MPI_Op (const Generic_MPI_Op& ) {}
    \n-
    70 static std::unique_ptr<MPI_Op> op;
    \n-
    71 };
    \n-
    \n-
    72
    \n-
    73
    \n-
    74 template<typename Type, typename BinaryFunction, typename Enable>
    \n-
    75 std::unique_ptr<MPI_Op> Generic_MPI_Op<Type,BinaryFunction, Enable>::op;
    \n-
    76
    \n-
    \n-
    77#define ComposeMPIOp(func,op) \\
    \n-
    78 template<class T, class S> \\
    \n-
    79 class Generic_MPI_Op<T, func<S>, std::enable_if_t<MPITraits<S>::is_intrinsic> >{ \\
    \n-
    80 public: \\
    \n-
    81 static MPI_Op get(){ \\
    \n-
    82 return op; \\
    \n-
    83 } \\
    \n-
    84 private: \\
    \n-
    85 Generic_MPI_Op () {} \\
    \n-
    86 Generic_MPI_Op (const Generic_MPI_Op & ) {} \\
    \n-
    87 }
    \n-
    \n-
    88
    \n-
    89
    \n-
    90 ComposeMPIOp(std::plus, MPI_SUM);
    \n-
    91 ComposeMPIOp(std::multiplies, MPI_PROD);
    \n-
    92 ComposeMPIOp(Min, MPI_MIN);
    \n-
    93 ComposeMPIOp(Max, MPI_MAX);
    \n-
    94
    \n-
    95#undef ComposeMPIOp
    \n-
    96
    \n-
    97
    \n-
    98 //=======================================================
    \n-
    99 // use singleton pattern and template specialization to
    \n-
    100 // generate MPI operations
    \n-
    101 //=======================================================
    \n-
    102
    \n-
    106 template<>
    \n-
    \n-
    107 class Communication<MPI_Comm>
    \n-
    108 {
    \n-
    109 public:
    \n-
    \n-
    111 Communication (const MPI_Comm& c = MPI_COMM_WORLD)
    \n-
    112 : communicator(c)
    \n-
    113 {
    \n-
    114 if(communicator!=MPI_COMM_NULL) {
    \n-
    115 int initialized = 0;
    \n-
    116 MPI_Initialized(&initialized);
    \n-
    117 if (!initialized)
    \n-
    118 DUNE_THROW(ParallelError,"You must call MPIHelper::instance(argc,argv) in your main() function before using the MPI Communication!");
    \n-
    119 MPI_Comm_rank(communicator,&me);
    \n-
    120 MPI_Comm_size(communicator,&procs);
    \n-
    121 }else{
    \n-
    122 procs=0;
    \n-
    123 me=-1;
    \n-
    124 }
    \n-
    125 }
    \n-
    \n-
    126
    \n-
    \n-\n-
    129 : Communication(MPI_COMM_SELF)
    \n-
    130 {}
    \n-
    \n-
    131
    \n-
    \n-
    133 int rank () const
    \n-
    134 {
    \n-
    135 return me;
    \n-
    136 }
    \n-
    \n-
    137
    \n-
    \n-
    139 int size () const
    \n-
    140 {
    \n-
    141 return procs;
    \n-
    142 }
    \n+
    5#ifndef DUNE_COMMON_PARALLEL_COMMUNICATION_HH
    \n+
    6#define DUNE_COMMON_PARALLEL_COMMUNICATION_HH
    \n+
    14#include <iostream>
    \n+
    15#include <complex>
    \n+
    16#include <algorithm>
    \n+
    17#include <vector>
    \n+
    18
    \n+\n+\n+\n+
    22
    \n+
    42namespace Dune
    \n+
    43{
    \n+
    44
    \n+
    45 /* define some type that definitely differs from MPI_Comm */
    \n+
    46 struct No_Comm {};
    \n+
    47
    \n+
    \n+
    52 inline bool operator==(const No_Comm&, const No_Comm&)
    \n+
    53 {
    \n+
    54 return true;
    \n+
    55 }
    \n+
    \n+
    56
    \n+
    \n+
    61 inline bool operator!=(const No_Comm&, const No_Comm&)
    \n+
    62 {
    \n+
    63 return false;
    \n+
    64 }
    \n+
    \n+
    65
    \n+
    98 template<typename Communicator>
    \n+
    \n+\n+
    100 {
    \n+
    101 public:
    \n+
    \n+\n+
    104 {}
    \n+
    \n+
    105
    \n+
    \n+
    110 Communication (const Communicator&)
    \n+
    111 {}
    \n+
    \n+
    112
    \n+
    \n+
    114 int rank () const
    \n+
    115 {
    \n+
    116 return 0;
    \n+
    117 }
    \n+
    \n+
    118
    \n+
    \n+
    120 operator No_Comm() const
    \n+
    121 {
    \n+
    122 return {};
    \n+
    123 }
    \n+
    \n+
    124
    \n+
    \n+
    126 int size () const
    \n+
    127 {
    \n+
    128 return 1;
    \n+
    129 }
    \n+
    \n+
    130
    \n+
    134 template<class T>
    \n+
    \n+
    135 int send([[maybe_unused]] const T& data,
    \n+
    136 [[maybe_unused]] int dest_rank,
    \n+
    137 [[maybe_unused]] int tag)
    \n+
    138 {
    \n+
    139 DUNE_THROW(ParallelError, "This method is not supported in sequential programs");
    \n+
    140 }
    \n
    \n-
    143
    \n+
    141
    \n
    145 template<class T>
    \n
    \n-
    146 int send(const T& data, int dest_rank, int tag) const
    \n-
    147 {
    \n-
    148 auto mpi_data = getMPIData(data);
    \n-
    149 return MPI_Send(mpi_data.ptr(), mpi_data.size(), mpi_data.type(),
    \n-
    150 dest_rank, tag, communicator);
    \n+
    146 PseudoFuture<T> isend([[maybe_unused]] const T&& data,
    \n+
    147 [[maybe_unused]] int dest_rank,
    \n+
    148 [[maybe_unused]] int tag)
    \n+
    149 {
    \n+
    150 DUNE_THROW(ParallelError, "This method is not supported in sequential programs");
    \n
    151 }
    \n
    \n
    152
    \n-
    154 template<class T>
    \n-
    \n-
    155 MPIFuture<T> isend(T&& data, int dest_rank, int tag) const
    \n-
    156 {
    \n-
    157 MPIFuture<T> future(std::forward<T>(data));
    \n-
    158 auto mpidata = future.get_mpidata();
    \n-
    159 MPI_Isend(mpidata.ptr(), mpidata.size(), mpidata.type(),
    \n-
    160 dest_rank, tag, communicator, &future.req_);
    \n-
    161 return future;
    \n-
    162 }
    \n-
    \n-
    163
    \n-
    165 template<class T>
    \n-
    \n-
    166 T recv(T&& data, int source_rank, int tag, MPI_Status* status = MPI_STATUS_IGNORE) const
    \n-
    167 {
    \n-
    168 T lvalue_data(std::forward<T>(data));
    \n-
    169 auto mpi_data = getMPIData(lvalue_data);
    \n-
    170 MPI_Recv(mpi_data.ptr(), mpi_data.size(), mpi_data.type(),
    \n-
    171 source_rank, tag, communicator, status);
    \n-
    172 return lvalue_data;
    \n-
    173 }
    \n+
    156 template<class T>
    \n+
    \n+
    157 T recv([[maybe_unused]] T&& data,
    \n+
    158 [[maybe_unused]] int source_rank,
    \n+
    159 [[maybe_unused]] int tag,
    \n+
    160 [[maybe_unused]] void* status = 0)
    \n+
    161 {
    \n+
    162 DUNE_THROW(ParallelError, "This method is not supported in sequential programs");
    \n+
    163 }
    \n+
    \n+
    164
    \n+
    168 template<class T>
    \n+
    \n+
    169 PseudoFuture<T> irecv([[maybe_unused]] T&& data,
    \n+
    170 [[maybe_unused]] int source_rank,
    \n+
    171 [[maybe_unused]] int tag)
    \n+
    172 {
    \n+
    173 DUNE_THROW(ParallelError, "This method is not supported in sequential programs");
    \n+
    174 }
    \n
    \n-
    174
    \n+
    175
    \n
    176 template<class T>
    \n
    \n-
    177 MPIFuture<T> irecv(T&& data, int source_rank, int tag) const
    \n-
    178 {
    \n-
    179 MPIFuture<T> future(std::forward<T>(data));
    \n-
    180 auto mpidata = future.get_mpidata();
    \n-
    181 if (mpidata.size() == 0)
    \n-
    182 DUNE_THROW(ParallelError, "Size if irecv data object is zero. Reserve sufficient size for the whole message");
    \n-
    183 MPI_Irecv(mpidata.ptr(), mpidata.size(), mpidata.type(),
    \n-
    184 source_rank, tag, communicator, &future.req_);
    \n-
    185 return future;
    \n-
    186 }
    \n-
    \n-
    187
    \n-
    188 template<class T>
    \n-
    \n-
    189 T rrecv(T&& data, int source_rank, int tag, MPI_Status* status = MPI_STATUS_IGNORE) const
    \n-
    190 {
    \n-
    191 MPI_Status _status;
    \n-
    192 MPI_Message _message;
    \n-
    193 T lvalue_data(std::forward<T>(data));
    \n-
    194 auto mpi_data = getMPIData(lvalue_data);
    \n-
    195 static_assert(!mpi_data.static_size, "rrecv work only for non-static-sized types.");
    \n-
    196 if(status == MPI_STATUS_IGNORE)
    \n-
    197 status = &_status;
    \n-
    198 MPI_Mprobe(source_rank, tag, communicator, &_message, status);
    \n-
    199 int size;
    \n-
    200 MPI_Get_count(status, mpi_data.type(), &size);
    \n-
    201 mpi_data.resize(size);
    \n-
    202 MPI_Mrecv(mpi_data.ptr(), mpi_data.size(), mpi_data.type(), &_message, status);
    \n-
    203 return lvalue_data;
    \n-
    204 }
    \n+
    177 T rrecv([[maybe_unused]] T&& data,
    \n+
    178 [[maybe_unused]] int source_rank,
    \n+
    179 [[maybe_unused]] int tag,
    \n+
    180 [[maybe_unused]] void* status = 0) const
    \n+
    181 {
    \n+
    182 DUNE_THROW(ParallelError, "This method is not supported in sequential programs");
    \n+
    183 }
    \n+
    \n+
    187 template<typename T>
    \n+
    \n+
    188 T sum (const T& in) const
    \n+
    189 {
    \n+
    190 return in;
    \n+
    191 }
    \n+
    \n+
    192
    \n+
    198 template<typename T>
    \n+
    \n+
    199 int sum ([[maybe_unused]] T* inout, [[maybe_unused]] int len) const
    \n+
    200 {
    \n+
    201 return 0;
    \n+
    202 }
    \n
    \n-
    205
    \n+
    203
    \n
    207 template<typename T>
    \n
    \n-
    208 T sum (const T& in) const
    \n+
    208 T prod (const T& in) const
    \n
    209 {
    \n-
    210 T out;
    \n-
    211 allreduce<std::plus<T> >(&in,&out,1);
    \n-
    212 return out;
    \n-
    213 }
    \n-
    \n-
    214
    \n-
    216 template<typename T>
    \n-
    \n-
    217 int sum (T* inout, int len) const
    \n-
    218 {
    \n-
    219 return allreduce<std::plus<T> >(inout,len);
    \n-
    220 }
    \n-
    \n-
    221
    \n-
    223 template<typename T>
    \n-
    \n-
    224 T prod (const T& in) const
    \n-
    225 {
    \n-
    226 T out;
    \n-
    227 allreduce<std::multiplies<T> >(&in,&out,1);
    \n-
    228 return out;
    \n-
    229 }
    \n-
    \n-
    230
    \n-
    232 template<typename T>
    \n-
    \n-
    233 int prod (T* inout, int len) const
    \n-
    234 {
    \n-
    235 return allreduce<std::multiplies<T> >(inout,len);
    \n-
    236 }
    \n-
    \n-
    237
    \n-
    239 template<typename T>
    \n-
    \n-
    240 T min (const T& in) const
    \n-
    241 {
    \n-
    242 T out;
    \n-
    243 allreduce<Min<T> >(&in,&out,1);
    \n-
    244 return out;
    \n-
    245 }
    \n-
    \n-
    246
    \n-
    248 template<typename T>
    \n-
    \n-
    249 int min (T* inout, int len) const
    \n-
    250 {
    \n-
    251 return allreduce<Min<T> >(inout,len);
    \n-
    252 }
    \n-
    \n-
    253
    \n-
    254
    \n-
    256 template<typename T>
    \n-
    \n-
    257 T max (const T& in) const
    \n-
    258 {
    \n-
    259 T out;
    \n-
    260 allreduce<Max<T> >(&in,&out,1);
    \n-
    261 return out;
    \n+
    210 return in;
    \n+
    211 }
    \n+
    \n+
    212
    \n+
    218 template<typename T>
    \n+
    \n+
    219 int prod ([[maybe_unused]] T* inout, [[maybe_unused]] int len) const
    \n+
    220 {
    \n+
    221 return 0;
    \n+
    222 }
    \n+
    \n+
    223
    \n+
    227 template<typename T>
    \n+
    \n+
    228 T min (const T& in) const
    \n+
    229 {
    \n+
    230 return in;
    \n+
    231 }
    \n+
    \n+
    232
    \n+
    238 template<typename T>
    \n+
    \n+
    239 int min ([[maybe_unused]] T* inout, [[maybe_unused]] int len) const
    \n+
    240 {
    \n+
    241 return 0;
    \n+
    242 }
    \n+
    \n+
    243
    \n+
    247 template<typename T>
    \n+
    \n+
    248 T max (const T& in) const
    \n+
    249 {
    \n+
    250 return in;
    \n+
    251 }
    \n+
    \n+
    252
    \n+
    258 template<typename T>
    \n+
    \n+
    259 int max ([[maybe_unused]] T* inout, [[maybe_unused]] int len) const
    \n+
    260 {
    \n+
    261 return 0;
    \n
    262 }
    \n
    \n
    263
    \n-
    265 template<typename T>
    \n-
    \n-
    266 int max (T* inout, int len) const
    \n-
    267 {
    \n-
    268 return allreduce<Max<T> >(inout,len);
    \n-
    269 }
    \n-
    \n-
    270
    \n-
    \n-
    272 int barrier () const
    \n-
    273 {
    \n-
    274 return MPI_Barrier(communicator);
    \n-
    275 }
    \n-
    \n-
    276
    \n-
    \n-\n-
    279 {
    \n-
    280 MPIFuture<void> future(true); // make a valid MPIFuture<void>
    \n-
    281 MPI_Ibarrier(communicator, &future.req_);
    \n-
    282 return future;
    \n-
    283 }
    \n-
    \n-
    284
    \n-
    285
    \n-
    287 template<typename T>
    \n-
    \n-
    288 int broadcast (T* inout, int len, int root) const
    \n-
    289 {
    \n-
    290 return MPI_Bcast(inout,len,MPITraits<T>::getType(),root,communicator);
    \n-
    291 }
    \n+
    \n+
    267 int barrier () const
    \n+
    268 {
    \n+
    269 return 0;
    \n+
    270 }
    \n+
    \n+
    271
    \n+
    \n+\n+
    276 {
    \n+
    277 return {true}; // return a valid future
    \n+
    278 }
    \n+
    \n+
    279
    \n+
    283 template<typename T>
    \n+
    \n+
    284 int broadcast ([[maybe_unused]] T* inout,
    \n+
    285 [[maybe_unused]] int len,
    \n+
    286 [[maybe_unused]] int root) const
    \n+
    287 {
    \n+
    288 return 0;
    \n+
    289 }
    \n
    \n-
    292
    \n+
    290
    \n
    294 template<class T>
    \n
    \n-
    295 MPIFuture<T> ibroadcast(T&& data, int root) const{
    \n-
    296 MPIFuture<T> future(std::forward<T>(data));
    \n-
    297 auto mpidata = future.get_mpidata();
    \n-
    298 MPI_Ibcast(mpidata.ptr(),
    \n-
    299 mpidata.size(),
    \n-
    300 mpidata.type(),
    \n-
    301 root,
    \n-
    302 communicator,
    \n-
    303 &future.req_);
    \n-
    304 return future;
    \n-
    305 }
    \n-
    \n-
    306
    \n-
    309 template<typename T>
    \n-
    \n-
    310 int gather (const T* in, T* out, int len, int root) const
    \n-
    311 {
    \n-
    312 return MPI_Gather(const_cast<T*>(in),len,MPITraits<T>::getType(),
    \n-
    313 out,len,MPITraits<T>::getType(),
    \n-
    314 root,communicator);
    \n-
    315 }
    \n-
    \n-
    316
    \n-
    318 template<class TIN, class TOUT = std::vector<TIN>>
    \n-
    \n-
    319 MPIFuture<TOUT, TIN> igather(TIN&& data_in, TOUT&& data_out, int root) const{
    \n-
    320 MPIFuture<TOUT, TIN> future(std::forward<TOUT>(data_out), std::forward<TIN>(data_in));
    \n-
    321 auto mpidata_in = future.get_send_mpidata();
    \n-
    322 auto mpidata_out = future.get_mpidata();
    \n-
    323 assert(root != me || mpidata_in.size()*procs <= mpidata_out.size());
    \n-
    324 int outlen = (me==root) * mpidata_in.size();
    \n-
    325 MPI_Igather(mpidata_in.ptr(), mpidata_in.size(), mpidata_in.type(),
    \n-
    326 mpidata_out.ptr(), outlen, mpidata_out.type(),
    \n-
    327 root, communicator, &future.req_);
    \n-
    328 return future;
    \n-
    329 }
    \n-
    \n-
    330
    \n-
    332 template<typename T>
    \n-
    \n-
    333 int gatherv (const T* in, int sendDataLen, T* out, int* recvDataLen, int* displ, int root) const
    \n-
    334 {
    \n-
    335 return MPI_Gatherv(const_cast<T*>(in),sendDataLen,MPITraits<T>::getType(),
    \n-
    336 out,recvDataLen,displ,MPITraits<T>::getType(),
    \n-
    337 root,communicator);
    \n-
    338 }
    \n-
    \n-
    339
    \n-
    342 template<typename T>
    \n-
    \n-
    343 int scatter (const T* sendData, T* recvData, int len, int root) const
    \n-
    344 {
    \n-
    345 return MPI_Scatter(const_cast<T*>(sendData),len,MPITraits<T>::getType(),
    \n-
    346 recvData,len,MPITraits<T>::getType(),
    \n-
    347 root,communicator);
    \n-
    348 }
    \n-
    \n-
    349
    \n-
    351 template<class TIN, class TOUT = TIN>
    \n-
    \n-
    352 MPIFuture<TOUT, TIN> iscatter(TIN&& data_in, TOUT&& data_out, int root) const
    \n-
    353 {
    \n-
    354 MPIFuture<TOUT, TIN> future(std::forward<TOUT>(data_out), std::forward<TIN>(data_in));
    \n-
    355 auto mpidata_in = future.get_send_mpidata();
    \n-
    356 auto mpidata_out = future.get_mpidata();
    \n-
    357 int inlen = (me==root) * mpidata_in.size()/procs;
    \n-
    358 MPI_Iscatter(mpidata_in.ptr(), inlen, mpidata_in.type(),
    \n-
    359 mpidata_out.ptr(), mpidata_out.size(), mpidata_out.type(),
    \n-
    360 root, communicator, &future.req_);
    \n-
    361 return future;
    \n-
    362 }
    \n-
    \n-
    363
    \n-
    365 template<typename T>
    \n-
    \n-
    366 int scatterv (const T* sendData, int* sendDataLen, int* displ, T* recvData, int recvDataLen, int root) const
    \n-
    367 {
    \n-
    368 return MPI_Scatterv(const_cast<T*>(sendData),sendDataLen,displ,MPITraits<T>::getType(),
    \n-
    369 recvData,recvDataLen,MPITraits<T>::getType(),
    \n-
    370 root,communicator);
    \n-
    371 }
    \n-
    \n-
    372
    \n-
    373
    \n-
    \n-
    374 operator MPI_Comm () const
    \n-
    375 {
    \n-
    376 return communicator;
    \n-
    377 }
    \n-
    \n-
    378
    \n-
    380 template<typename T, typename T1>
    \n-
    \n-
    381 int allgather(const T* sbuf, int count, T1* rbuf) const
    \n-
    382 {
    \n-
    383 return MPI_Allgather(const_cast<T*>(sbuf), count, MPITraits<T>::getType(),
    \n-
    384 rbuf, count, MPITraits<T1>::getType(),
    \n-
    385 communicator);
    \n-
    386 }
    \n-
    \n-
    387
    \n-
    389 template<class TIN, class TOUT = TIN>
    \n-
    \n-
    390 MPIFuture<TOUT, TIN> iallgather(TIN&& data_in, TOUT&& data_out) const
    \n-
    391 {
    \n-
    392 MPIFuture<TOUT, TIN> future(std::forward<TOUT>(data_out), std::forward<TIN>(data_in));
    \n-
    393 auto mpidata_in = future.get_send_mpidata();
    \n-
    394 auto mpidata_out = future.get_mpidata();
    \n-
    395 assert(mpidata_in.size()*procs <= mpidata_out.size());
    \n-
    396 int outlen = mpidata_in.size();
    \n-
    397 MPI_Iallgather(mpidata_in.ptr(), mpidata_in.size(), mpidata_in.type(),
    \n-
    398 mpidata_out.ptr(), outlen, mpidata_out.type(),
    \n-
    399 communicator, &future.req_);
    \n-
    400 return future;
    \n-
    401 }
    \n-
    \n-
    402
    \n-
    404 template<typename T>
    \n-
    \n-
    405 int allgatherv (const T* in, int sendDataLen, T* out, int* recvDataLen, int* displ) const
    \n-
    406 {
    \n-
    407 return MPI_Allgatherv(const_cast<T*>(in),sendDataLen,MPITraits<T>::getType(),
    \n-
    408 out,recvDataLen,displ,MPITraits<T>::getType(),
    \n-
    409 communicator);
    \n-
    410 }
    \n-
    \n-
    411
    \n-
    413 template<typename BinaryFunction, typename Type>
    \n-
    \n-
    414 int allreduce(Type* inout, int len) const
    \n-
    415 {
    \n-
    416 Type* out = new Type[len];
    \n-
    417 int ret = allreduce<BinaryFunction>(inout,out,len);
    \n-
    418 std::copy(out, out+len, inout);
    \n-
    419 delete[] out;
    \n-
    420 return ret;
    \n-
    421 }
    \n-
    \n-
    422
    \n-
    423 template<typename BinaryFunction, typename Type>
    \n-
    \n-
    424 Type allreduce(Type&& in) const{
    \n-
    425 Type lvalue_data = std::forward<Type>(in);
    \n-
    426 auto data = getMPIData(lvalue_data);
    \n-
    427 MPI_Allreduce(MPI_IN_PLACE, data.ptr(), data.size(), data.type(),
    \n-\n-
    429 communicator);
    \n-
    430 return lvalue_data;
    \n-
    431 }
    \n-
    \n-
    432
    \n-
    434 template<class BinaryFunction, class TIN, class TOUT = TIN>
    \n-
    \n-
    435 MPIFuture<TOUT, TIN> iallreduce(TIN&& data_in, TOUT&& data_out) const {
    \n-
    436 MPIFuture<TOUT, TIN> future(std::forward<TOUT>(data_out), std::forward<TIN>(data_in));
    \n-
    437 auto mpidata_in = future.get_send_mpidata();
    \n-
    438 auto mpidata_out = future.get_mpidata();
    \n-
    439 assert(mpidata_out.size() == mpidata_in.size());
    \n-
    440 assert(mpidata_out.type() == mpidata_in.type());
    \n-
    441 MPI_Iallreduce(mpidata_in.ptr(), mpidata_out.ptr(),
    \n-
    442 mpidata_out.size(), mpidata_out.type(),
    \n-\n-
    444 communicator, &future.req_);
    \n-
    445 return future;
    \n-
    446 }
    \n-
    \n-
    447
    \n-
    449 template<class BinaryFunction, class T>
    \n-
    \n-
    450 MPIFuture<T> iallreduce(T&& data) const{
    \n-
    451 MPIFuture<T> future(std::forward<T>(data));
    \n-
    452 auto mpidata = future.get_mpidata();
    \n-
    453 MPI_Iallreduce(MPI_IN_PLACE, mpidata.ptr(),
    \n-
    454 mpidata.size(), mpidata.type(),
    \n-\n-
    456 communicator, &future.req_);
    \n-
    457 return future;
    \n-
    458 }
    \n-
    \n-
    459
    \n-
    461 template<typename BinaryFunction, typename Type>
    \n-
    \n-
    462 int allreduce(const Type* in, Type* out, int len) const
    \n-
    463 {
    \n-
    464 return MPI_Allreduce(const_cast<Type*>(in), out, len, MPITraits<Type>::getType(),
    \n-\n-
    466 }
    \n-
    \n-
    467
    \n-
    468 private:
    \n-
    469 MPI_Comm communicator;
    \n-
    470 int me;
    \n-
    471 int procs;
    \n-
    472 };
    \n-
    \n-
    473} // namespace dune
    \n-
    474
    \n-
    475#endif // HAVE_MPI
    \n-
    476
    \n-
    477#endif
    \n-
    Interface class to translate objects to a MPI_Datatype, void* and size used for MPI calls.
    \n-
    Implements an utility class that provides collective communication methods for sequential programs.
    \n-
    #define ComposeMPIOp(func, op)
    Definition mpicommunication.hh:77
    \n-
    Traits classes for mapping types onto MPI_Datatype.
    \n-\n-
    A few common exception classes.
    \n-
    helper classes to provide unique types for standard functions
    \n+
    295 PseudoFuture<T> ibroadcast(T&& data, int root) const{
    \n+
    296 return {std::forward<T>(data)};
    \n+
    297 }
    \n+
    \n+
    298
    \n+
    299
    \n+
    312 template<typename T>
    \n+
    \n+
    313 int gather (const T* in, T* out, int len, [[maybe_unused]] int root) const // note out must have same size as in
    \n+
    314 {
    \n+
    315 for (int i=0; i<len; i++)
    \n+
    316 out[i] = in[i];
    \n+
    317 return 0;
    \n+
    318 }
    \n+
    \n+
    319
    \n+
    323 template<class TIN, class TOUT = std::vector<TIN>>
    \n+
    \n+
    324 PseudoFuture<TOUT> igather(TIN&& data_in, TOUT&& data_out, int root){
    \n+
    325 *(data_out.begin()) = std::forward<TIN>(data_in);
    \n+
    326 return {std::forward<TOUT>(data_out)};
    \n+
    327 }
    \n+
    \n+
    328
    \n+
    329
    \n+
    349 template<typename T>
    \n+
    \n+
    350 int gatherv (const T* in,
    \n+
    351 int sendDataLen,
    \n+
    352 T* out,
    \n+
    353 [[maybe_unused]] int* recvDataLen,
    \n+
    354 int* displ,
    \n+
    355 [[maybe_unused]] int root) const
    \n+
    356 {
    \n+
    357 for (int i=*displ; i<sendDataLen; i++)
    \n+
    358 out[i] = in[i];
    \n+
    359 return 0;
    \n+
    360 }
    \n+
    \n+
    361
    \n+
    375 template<typename T>
    \n+
    \n+
    376 int scatter (const T* sendData, T* recvData, int len, [[maybe_unused]] int root) const // note out must have same size as in
    \n+
    377 {
    \n+
    378 for (int i=0; i<len; i++)
    \n+
    379 recvData[i] = sendData[i];
    \n+
    380 return 0;
    \n+
    381 }
    \n+
    \n+
    382
    \n+
    386 template<class TIN, class TOUT = TIN>
    \n+
    \n+
    387 PseudoFuture<TOUT> iscatter(TIN&& data_in, TOUT&& data_out, int root){
    \n+
    388 data_out = *(std::forward<TIN>(data_in).begin());
    \n+
    389 return {std::forward<TOUT>(data_out)};
    \n+
    390 }
    \n+
    \n+
    391
    \n+
    410 template<typename T>
    \n+
    \n+
    411 int scatterv (const T* sendData,int* sendDataLen, int* displ, T* recvData,
    \n+
    412 [[maybe_unused]] int recvDataLen, [[maybe_unused]] int root) const
    \n+
    413 {
    \n+
    414 for (int i=*displ; i<*sendDataLen; i++)
    \n+
    415 recvData[i] = sendData[i];
    \n+
    416 return 0;
    \n+
    417 }
    \n+
    \n+
    418
    \n+
    432 template<typename T>
    \n+
    \n+
    433 int allgather(const T* sbuf, int count, T* rbuf) const
    \n+
    434 {
    \n+
    435 for(const T* end=sbuf+count; sbuf < end; ++sbuf, ++rbuf)
    \n+
    436 *rbuf=*sbuf;
    \n+
    437 return 0;
    \n+
    438 }
    \n+
    \n+
    439
    \n+
    444 template<class TIN, class TOUT = TIN>
    \n+
    \n+
    445 PseudoFuture<TOUT> iallgather(TIN&& data_in, TOUT&& data_out){
    \n+
    446 return {std::forward<TOUT>(data_out)};
    \n+
    447 }
    \n+
    \n+
    448
    \n+
    465 template<typename T>
    \n+
    \n+
    466 int allgatherv (const T* in, int sendDataLen, T* out, [[maybe_unused]] int* recvDataLen, int* displ) const
    \n+
    467 {
    \n+
    468 for (int i=*displ; i<sendDataLen; i++)
    \n+
    469 out[i] = in[i];
    \n+
    470 return 0;
    \n+
    471 }
    \n+
    \n+
    472
    \n+
    485 template<typename BinaryFunction, typename Type>
    \n+
    \n+
    486 int allreduce([[maybe_unused]] Type* inout, [[maybe_unused]] int len) const
    \n+
    487 {
    \n+
    488 return 0;
    \n+
    489 }
    \n+
    \n+
    490
    \n+
    495 template<class BinaryFunction, class TIN, class TOUT = TIN>
    \n+
    \n+
    496 PseudoFuture<TOUT> iallreduce(TIN&& data_in, TOUT&& data_out){
    \n+
    497 data_out = std::forward<TIN>(data_in);
    \n+
    498 return {std::forward<TOUT>(data_out)};
    \n+
    499 }
    \n+
    \n+
    500
    \n+
    505 template<class BinaryFunction, class T>
    \n+
    \n+\n+
    507 return {std::forward<T>(data)};
    \n+
    508 }
    \n+
    \n+
    509
    \n+
    510
    \n+
    524 template<typename BinaryFunction, typename Type>
    \n+
    \n+
    525 int allreduce(const Type* in, Type* out, int len) const
    \n+
    526 {
    \n+
    527 std::copy(in, in+len, out);
    \n+
    528 return 0;
    \n+
    529 }
    \n+
    \n+
    530
    \n+
    531 };
    \n+
    \n+
    532
    \n+
    538 template<class T>
    \n+\n+
    540 [[deprecated("CollectiveCommunication is deprecated. Use Communication instead.")]]
    \n+\n+
    542}
    \n+
    543
    \n+
    544#endif // DUNE_COMMON_PARALLEL_COMMUNICATION_HH
    \n+\n+
    helper classes to provide unique types for standard functions
    \n+
    A few common exception classes.
    \n
    #define DUNE_THROW(E, m)
    Definition exceptions.hh:218
    \n+
    EnableIfInterOperable< T1, T2, bool >::type operator==(const ForwardIteratorFacade< T1, V1, R1, D > &lhs, const ForwardIteratorFacade< T2, V2, R2, D > &rhs)
    Checks for equality.
    Definition iteratorfacades.hh:238
    \n+
    EnableIfInterOperable< T1, T2, bool >::type operator!=(const ForwardIteratorFacade< T1, V1, R1, D > &lhs, const ForwardIteratorFacade< T2, V2, R2, D > &rhs)
    Checks for inequality.
    Definition iteratorfacades.hh:260
    \n
    Dune namespace.
    Definition alignedallocator.hh:13
    \n-
    auto getMPIData(T &t)
    Definition mpidata.hh:44
    \n-
    A traits class describing the mapping of types onto MPI_Datatypes.
    Definition mpitraits.hh:41
    \n-
    Definition binaryfunctions.hh:18
    \n-
    Definition binaryfunctions.hh:34
    \n
    Default exception if an error in the parallel communication of the program occurred.
    Definition exceptions.hh:287
    \n+
    Definition communication.hh:46
    \n
    Collective communication interface and sequential default implementation.
    Definition communication.hh:100
    \n+
    PseudoFuture< TOUT > iallreduce(TIN &&data_in, TOUT &&data_out)
    Compute something over all processes nonblocking.
    Definition communication.hh:496
    \n+
    int send(const T &data, int dest_rank, int tag)
    Sends the data to the dest_rank.
    Definition communication.hh:135
    \n+
    int allreduce(const Type *in, Type *out, int len) const
    Compute something over all processes for each component of an array and return the result in every pr...
    Definition communication.hh:525
    \n+
    T max(const T &in) const
    Compute the maximum of the argument over all processes and return the result in every process....
    Definition communication.hh:248
    \n+
    int rank() const
    Return rank, is between 0 and size()-1.
    Definition communication.hh:114
    \n+
    T sum(const T &in) const
    Compute the sum of the argument over all processes and return the result in every process....
    Definition communication.hh:188
    \n+
    int scatterv(const T *sendData, int *sendDataLen, int *displ, T *recvData, int recvDataLen, int root) const
    Scatter arrays of variable length from a root to all other tasks.
    Definition communication.hh:411
    \n+
    int prod(T *inout, int len) const
    Compute the product over all processes for each component of an array and return the result in every ...
    Definition communication.hh:219
    \n+
    T recv(T &&data, int source_rank, int tag, void *status=0)
    Receives the data from the source_rank.
    Definition communication.hh:157
    \n+
    PseudoFuture< T > isend(const T &&data, int dest_rank, int tag)
    Sends the data to the dest_rank nonblocking.
    Definition communication.hh:146
    \n+
    PseudoFuture< void > ibarrier() const
    Nonblocking barrier.
    Definition communication.hh:275
    \n+
    int allreduce(Type *inout, int len) const
    Compute something over all processes for each component of an array and return the result in every pr...
    Definition communication.hh:486
    \n
    int size() const
    Number of processes in set, is greater than 0.
    Definition communication.hh:126
    \n-
    Definition mpicommunication.hh:41
    \n-
    static MPI_Op get()
    Definition mpicommunication.hh:44
    \n-
    int max(T *inout, int len) const
    Compute the maximum of the argument over all processes and return the result in every process....
    Definition mpicommunication.hh:266
    \n-
    int allgatherv(const T *in, int sendDataLen, T *out, int *recvDataLen, int *displ) const
    Gathers data of variable length from all tasks and distribute it to all.
    Definition mpicommunication.hh:405
    \n-
    T max(const T &in) const
    Compute the maximum of the argument over all processes and return the result in every process....
    Definition mpicommunication.hh:257
    \n-
    MPIFuture< T > ibroadcast(T &&data, int root) const
    Distribute an array from the process with rank root to all other processes nonblocking.
    Definition mpicommunication.hh:295
    \n-
    MPIFuture< void > ibarrier() const
    Nonblocking barrier.
    Definition mpicommunication.hh:278
    \n-
    T recv(T &&data, int source_rank, int tag, MPI_Status *status=MPI_STATUS_IGNORE) const
    Receives the data from the source_rank.
    Definition mpicommunication.hh:166
    \n-
    int barrier() const
    Wait until all processes have arrived at this point in the program.
    Definition mpicommunication.hh:272
    \n-
    int rank() const
    Return rank, is between 0 and size()-1.
    Definition mpicommunication.hh:133
    \n-
    int scatterv(const T *sendData, int *sendDataLen, int *displ, T *recvData, int recvDataLen, int root) const
    Scatter arrays of variable length from a root to all other tasks.
    Definition mpicommunication.hh:366
    \n-
    MPIFuture< T > isend(T &&data, int dest_rank, int tag) const
    Sends the data to the dest_rank nonblocking.
    Definition mpicommunication.hh:155
    \n-
    MPIFuture< TOUT, TIN > iallgather(TIN &&data_in, TOUT &&data_out) const
    Gathers data from all tasks and distribute it to all nonblocking.
    Definition mpicommunication.hh:390
    \n-
    Type allreduce(Type &&in) const
    Definition mpicommunication.hh:424
    \n-
    int sum(T *inout, int len) const
    Compute the sum of the argument over all processes and return the result in every process....
    Definition mpicommunication.hh:217
    \n-
    int broadcast(T *inout, int len, int root) const
    Distribute an array from the process with rank root to all other processes.
    Definition mpicommunication.hh:288
    \n-
    MPIFuture< T > iallreduce(T &&data) const
    Compute something over all processes nonblocking.
    Definition mpicommunication.hh:450
    \n-
    T sum(const T &in) const
    Compute the sum of the argument over all processes and return the result in every process....
    Definition mpicommunication.hh:208
    \n-
    int allreduce(const Type *in, Type *out, int len) const
    Definition mpicommunication.hh:462
    \n-
    MPIFuture< TOUT, TIN > iallreduce(TIN &&data_in, TOUT &&data_out) const
    Compute something over all processes nonblocking.
    Definition mpicommunication.hh:435
    \n-
    int size() const
    Number of processes in set, is greater than 0.
    Definition mpicommunication.hh:139
    \n-
    int gather(const T *in, T *out, int len, int root) const
    Gather arrays on root task.
    Definition mpicommunication.hh:310
    \n-
    int allreduce(Type *inout, int len) const
    Compute something over all processes for each component of an array and return the result in every pr...
    Definition mpicommunication.hh:414
    \n-
    T rrecv(T &&data, int source_rank, int tag, MPI_Status *status=MPI_STATUS_IGNORE) const
    Definition mpicommunication.hh:189
    \n-
    int scatter(const T *sendData, T *recvData, int len, int root) const
    Scatter array from a root to all other task.
    Definition mpicommunication.hh:343
    \n-
    MPIFuture< T > irecv(T &&data, int source_rank, int tag) const
    Receives the data from the source_rank nonblocking.
    Definition mpicommunication.hh:177
    \n-
    int prod(T *inout, int len) const
    Compute the product of the argument over all processes and return the result in every process....
    Definition mpicommunication.hh:233
    \n-
    MPIFuture< TOUT, TIN > igather(TIN &&data_in, TOUT &&data_out, int root) const
    Gather arrays on root task nonblocking.
    Definition mpicommunication.hh:319
    \n-
    T min(const T &in) const
    Compute the minimum of the argument over all processes and return the result in every process....
    Definition mpicommunication.hh:240
    \n-
    Communication(const MPI_Comm &c=MPI_COMM_WORLD)
    Instantiation using a MPI communicator.
    Definition mpicommunication.hh:111
    \n-
    MPIFuture< TOUT, TIN > iscatter(TIN &&data_in, TOUT &&data_out, int root) const
    Scatter array from a root to all other task nonblocking.
    Definition mpicommunication.hh:352
    \n-
    int gatherv(const T *in, int sendDataLen, T *out, int *recvDataLen, int *displ, int root) const
    Gather arrays of variable size on root task.
    Definition mpicommunication.hh:333
    \n-
    int min(T *inout, int len) const
    Compute the minimum of the argument over all processes and return the result in every process....
    Definition mpicommunication.hh:249
    \n-
    int allgather(const T *sbuf, int count, T1 *rbuf) const
    Gathers data from all tasks and distribute it to all.
    Definition mpicommunication.hh:381
    \n-
    int send(const T &data, int dest_rank, int tag) const
    Sends the data to the dest_rank.
    Definition mpicommunication.hh:146
    \n-
    Communication(const Communication< No_Comm > &)
    Converting constructor for no-communication that is interpreted as MPI_COMM_SELF.
    Definition mpicommunication.hh:128
    \n-
    T prod(const T &in) const
    Compute the product of the argument over all processes and return the result in every process....
    Definition mpicommunication.hh:224
    \n-
    Provides a future-like object for MPI communication. It contains the object that will be received and...
    Definition mpifuture.hh:93
    \n-
    auto get_send_mpidata()
    Definition mpifuture.hh:177
    \n-
    auto get_mpidata()
    Definition mpifuture.hh:173
    \n+
    int sum(T *inout, int len) const
    Compute the sum over all processes for each component of an array and return the result in every proc...
    Definition communication.hh:199
    \n+
    int allgatherv(const T *in, int sendDataLen, T *out, int *recvDataLen, int *displ) const
    Gathers data of variable length from all tasks and distribute it to all.
    Definition communication.hh:466
    \n+
    T min(const T &in) const
    Compute the minimum of the argument over all processes and return the result in every process....
    Definition communication.hh:228
    \n+
    PseudoFuture< T > irecv(T &&data, int source_rank, int tag)
    Receives the data from the source_rank nonblocking.
    Definition communication.hh:169
    \n+
    int gatherv(const T *in, int sendDataLen, T *out, int *recvDataLen, int *displ, int root) const
    Gather arrays of variable size on root task.
    Definition communication.hh:350
    \n+
    PseudoFuture< T > ibroadcast(T &&data, int root) const
    Distribute an array from the process with rank root to all other processes nonblocking.
    Definition communication.hh:295
    \n+
    int allgather(const T *sbuf, int count, T *rbuf) const
    Gathers data from all tasks and distribute it to all.
    Definition communication.hh:433
    \n+
    int scatter(const T *sendData, T *recvData, int len, int root) const
    Scatter array from a root to all other task.
    Definition communication.hh:376
    \n+
    int gather(const T *in, T *out, int len, int root) const
    Gather arrays on root task.
    Definition communication.hh:313
    \n+
    PseudoFuture< T > iallreduce(T &&data)
    Compute something over all processes nonblocking and in-place.
    Definition communication.hh:506
    \n+
    Communication(const Communicator &)
    Constructor with a given communicator.
    Definition communication.hh:110
    \n+
    int max(T *inout, int len) const
    Compute the maximum over all processes for each component of an array and return the result in every ...
    Definition communication.hh:259
    \n+
    T prod(const T &in) const
    Compute the product of the argument over all processes and return the result in every process....
    Definition communication.hh:208
    \n+
    int broadcast(T *inout, int len, int root) const
    Distribute an array from the process with rank root to all other processes.
    Definition communication.hh:284
    \n+
    T rrecv(T &&data, int source_rank, int tag, void *status=0) const
    Definition communication.hh:177
    \n+
    PseudoFuture< TOUT > iscatter(TIN &&data_in, TOUT &&data_out, int root)
    Scatter array from a root to all other task nonblocking.
    Definition communication.hh:387
    \n+
    int min(T *inout, int len) const
    Compute the minimum over all processes for each component of an array and return the result in every ...
    Definition communication.hh:239
    \n+
    int barrier() const
    Wait until all processes have arrived at this point in the program.
    Definition communication.hh:267
    \n+
    PseudoFuture< TOUT > igather(TIN &&data_in, TOUT &&data_out, int root)
    Gather arrays on root task nonblocking.
    Definition communication.hh:324
    \n+
    PseudoFuture< TOUT > iallgather(TIN &&data_in, TOUT &&data_out)
    Gathers data from all tasks and distribute it to all nonblocking.
    Definition communication.hh:445
    \n+
    Communication()
    Construct default object.
    Definition communication.hh:103
    \n+
    A wrapper-class for a object which is ready immediately.
    Definition future.hh:124
    \n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,676 +1,480 @@\n dune-common\u00a02.10\n Loading...\n Searching...\n No Matches\n * _\bd_\bu_\bn_\be\n * _\bc_\bo_\bm_\bm_\bo_\bn\n * _\bp_\ba_\br_\ba_\bl_\bl_\be_\bl\n-mpicommunication.hh\n+communication.hh\n _\bG_\bo_\b _\bt_\bo_\b _\bt_\bh_\be_\b _\bd_\bo_\bc_\bu_\bm_\be_\bn_\bt_\ba_\bt_\bi_\bo_\bn_\b _\bo_\bf_\b _\bt_\bh_\bi_\bs_\b _\bf_\bi_\bl_\be_\b.\n 1// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-\n 2// vi: set et ts=4 sw=2 sts=2:\n 3// SPDX-FileCopyrightInfo: Copyright \u00c2\u00a9 DUNE Project contributors, see file\n LICENSE.md in module root\n 4// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception\n-5#ifndef DUNE_COMMON_PARALLEL_MPICOMMUNICATION_HH\n-6#define DUNE_COMMON_PARALLEL_MPICOMMUNICATION_HH\n-7\n-16#if HAVE_MPI\n-17\n-18#include \n-19#include \n-20#include \n-21\n-22#include \n-23\n-24#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bb_\bi_\bn_\ba_\br_\by_\bf_\bu_\bn_\bc_\bt_\bi_\bo_\bn_\bs_\b._\bh_\bh>\n-25#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\be_\bx_\bc_\be_\bp_\bt_\bi_\bo_\bn_\bs_\b._\bh_\bh>\n-26#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bp_\ba_\br_\ba_\bl_\bl_\be_\bl_\b/_\bc_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b._\bh_\bh>\n-27#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bp_\ba_\br_\ba_\bl_\bl_\be_\bl_\b/_\bm_\bp_\bi_\bt_\br_\ba_\bi_\bt_\bs_\b._\bh_\bh>\n-28#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bp_\ba_\br_\ba_\bl_\bl_\be_\bl_\b/_\bm_\bp_\bi_\bf_\bu_\bt_\bu_\br_\be_\b._\bh_\bh>\n-29#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bp_\ba_\br_\ba_\bl_\bl_\be_\bl_\b/_\bm_\bp_\bi_\bd_\ba_\bt_\ba_\b._\bh_\bh>\n-30\n-31namespace _\bD_\bu_\bn_\be\n-32{\n-33\n-34 //=======================================================\n-35 // use singleton pattern and template specialization to\n-36 // generate MPI operations\n-37 //=======================================================\n-38\n-39 template\n-_\b4_\b0 class _\bG_\be_\bn_\be_\br_\bi_\bc_\b__\bM_\bP_\bI_\b__\bO_\bp\n-41 {\n-42\n-43 public:\n-_\b4_\b4 static MPI_Op _\bg_\be_\bt ()\n-45 {\n-46 if (!op)\n-47 {\n-48 op = std::make_unique();\n-49 // The following line leaks an MPI operation object, because the\n-corresponding\n-50 //`MPI_Op_free` is never called. It is never called because there is no easy\n-51 // way to call it at the right moment: right before the call to\n-MPI_Finalize.\n-52 // See https://gitlab.dune-project.org/core/dune-istl/issues/80\n-53 MPI_Op_create((void (*)(void*, void*, int*,\n-MPI_Datatype*))&operation,true,op.get());\n-54 }\n-55 return *op;\n-56 }\n-57 private:\n-58 static void operation (Type *in, Type *inout, int *len, MPI_Datatype*)\n-59 {\n-60 BinaryFunction func;\n-61\n-62 for (int i=0; i< *len; ++i, ++in, ++inout) {\n-63 Type temp;\n-64 temp = func(*in, *inout);\n-65 *inout = temp;\n-66 }\n-67 }\n-68 Generic_MPI_Op () {}\n-69 Generic_MPI_Op (const Generic_MPI_Op& ) {}\n-70 static std::unique_ptr op;\n-71 };\n-72\n-73\n-74 template\n-75 std::unique_ptr Generic_MPI_Op::op;\n-76\n-_\b7_\b7#define ComposeMPIOp(func,op) \\\n-78 template \\\n-79 class Generic_MPI_Op, std::enable_if_t::\n-is_intrinsic> >{ \\\n-80 public: \\\n-81 static MPI_Op get(){ \\\n-82 return op; \\\n-83 } \\\n-84 private: \\\n-85 Generic_MPI_Op () {} \\\n-86 Generic_MPI_Op (const Generic_MPI_Op & ) {} \\\n-87 }\n-88\n-89\n-_\b9_\b0 _\bC_\bo_\bm_\bp_\bo_\bs_\be_\bM_\bP_\bI_\bO_\bp(std::plus, MPI_SUM);\n-_\b9_\b1 _\bC_\bo_\bm_\bp_\bo_\bs_\be_\bM_\bP_\bI_\bO_\bp(std::multiplies, MPI_PROD);\n-_\b9_\b2 _\bC_\bo_\bm_\bp_\bo_\bs_\be_\bM_\bP_\bI_\bO_\bp(_\bM_\bi_\bn, MPI_MIN);\n-_\b9_\b3 _\bC_\bo_\bm_\bp_\bo_\bs_\be_\bM_\bP_\bI_\bO_\bp(_\bM_\ba_\bx, MPI_MAX);\n-94\n-95#undef ComposeMPIOp\n-96\n-97\n-98 //=======================================================\n-99 // use singleton pattern and template specialization to\n-100 // generate MPI operations\n-101 //=======================================================\n-102\n-106 template<>\n-_\b1_\b0_\b7 class _\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn\n-108 {\n-109 public:\n-_\b1_\b1_\b1 _\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn (const MPI_Comm& c = MPI_COMM_WORLD)\n-112 : communicator(c)\n-113 {\n-114 if(communicator!=MPI_COMM_NULL) {\n-115 int initialized = 0;\n-116 MPI_Initialized(&initialized);\n-117 if (!initialized)\n-118 _\bD_\bU_\bN_\bE_\b__\bT_\bH_\bR_\bO_\bW(_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bE_\br_\br_\bo_\br,\"You must call MPIHelper::instance(argc,argv) in\n-your main() function before using the MPI Communication!\");\n-119 MPI_Comm_rank(communicator,&me);\n-120 MPI_Comm_size(communicator,&procs);\n-121 }else{\n-122 procs=0;\n-123 me=-1;\n-124 }\n-125 }\n-126\n-_\b1_\b2_\b8 _\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn (const _\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b<_\bN_\bo_\b__\bC_\bo_\bm_\bm_\b>&)\n-129 : _\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn(MPI_COMM_SELF)\n-130 {}\n-131\n-_\b1_\b3_\b3 int _\br_\ba_\bn_\bk () const\n-134 {\n-135 return me;\n-136 }\n-137\n-_\b1_\b3_\b9 int _\bs_\bi_\bz_\be () const\n-140 {\n-141 return procs;\n-142 }\n-143\n+5#ifndef DUNE_COMMON_PARALLEL_COMMUNICATION_HH\n+6#define DUNE_COMMON_PARALLEL_COMMUNICATION_HH\n+14#include \n+15#include \n+16#include \n+17#include \n+18\n+19#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bb_\bi_\bn_\ba_\br_\by_\bf_\bu_\bn_\bc_\bt_\bi_\bo_\bn_\bs_\b._\bh_\bh>\n+20#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\be_\bx_\bc_\be_\bp_\bt_\bi_\bo_\bn_\bs_\b._\bh_\bh>\n+21#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bp_\ba_\br_\ba_\bl_\bl_\be_\bl_\b/_\bf_\bu_\bt_\bu_\br_\be_\b._\bh_\bh>\n+22\n+42namespace _\bD_\bu_\bn_\be\n+43{\n+44\n+45 /* define some type that definitely differs from MPI_Comm */\n+_\b4_\b6 struct _\bN_\bo_\b__\bC_\bo_\bm_\bm {};\n+47\n+_\b5_\b2 inline bool _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b=_\b=(const _\bN_\bo_\b__\bC_\bo_\bm_\bm&, const _\bN_\bo_\b__\bC_\bo_\bm_\bm&)\n+53 {\n+54 return true;\n+55 }\n+56\n+_\b6_\b1 inline bool _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b!_\b=(const _\bN_\bo_\b__\bC_\bo_\bm_\bm&, const _\bN_\bo_\b__\bC_\bo_\bm_\bm&)\n+62 {\n+63 return false;\n+64 }\n+65\n+98 template\n+_\b9_\b9 class _\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn\n+100 {\n+101 public:\n+_\b1_\b0_\b3 _\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn()\n+104 {}\n+105\n+_\b1_\b1_\b0 _\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn (const Communicator&)\n+111 {}\n+112\n+_\b1_\b1_\b4 int _\br_\ba_\bn_\bk () const\n+115 {\n+116 return 0;\n+117 }\n+118\n+_\b1_\b2_\b0 operator _\bN_\bo_\b__\bC_\bo_\bm_\bm() const\n+121 {\n+122 return {};\n+123 }\n+124\n+_\b1_\b2_\b6 int _\bs_\bi_\bz_\be () const\n+127 {\n+128 return 1;\n+129 }\n+130\n+134 template\n+_\b1_\b3_\b5 int _\bs_\be_\bn_\bd([[maybe_unused]] const T& data,\n+136 [[maybe_unused]] int dest_rank,\n+137 [[maybe_unused]] int tag)\n+138 {\n+139 _\bD_\bU_\bN_\bE_\b__\bT_\bH_\bR_\bO_\bW(_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bE_\br_\br_\bo_\br, \"This method is not supported in sequential\n+programs\");\n+140 }\n+141\n 145 template\n-_\b1_\b4_\b6 int _\bs_\be_\bn_\bd(const T& data, int dest_rank, int tag) const\n-147 {\n-148 auto mpi_data = _\bg_\be_\bt_\bM_\bP_\bI_\bD_\ba_\bt_\ba(data);\n-149 return MPI_Send(mpi_data.ptr(), mpi_data.size(), mpi_data.type(),\n-150 dest_rank, tag, communicator);\n+_\b1_\b4_\b6 _\bP_\bs_\be_\bu_\bd_\bo_\bF_\bu_\bt_\bu_\br_\be_\b<_\bT_\b> _\bi_\bs_\be_\bn_\bd([[maybe_unused]] const T&& data,\n+147 [[maybe_unused]] int dest_rank,\n+148 [[maybe_unused]] int tag)\n+149 {\n+150 _\bD_\bU_\bN_\bE_\b__\bT_\bH_\bR_\bO_\bW(_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bE_\br_\br_\bo_\br, \"This method is not supported in sequential\n+programs\");\n 151 }\n 152\n-154 template\n-_\b1_\b5_\b5 _\bM_\bP_\bI_\bF_\bu_\bt_\bu_\br_\be_\b<_\bT_\b> _\bi_\bs_\be_\bn_\bd(T&& data, int dest_rank, int tag) const\n-156 {\n-157 _\bM_\bP_\bI_\bF_\bu_\bt_\bu_\br_\be_\b<_\bT_\b> future(std::forward(data));\n-158 auto mpidata = future._\bg_\be_\bt_\b__\bm_\bp_\bi_\bd_\ba_\bt_\ba();\n-159 MPI_Isend(mpidata.ptr(), mpidata.size(), mpidata.type(),\n-160 dest_rank, tag, communicator, &future.req_);\n-161 return future;\n-162 }\n-163\n-165 template\n-_\b1_\b6_\b6 T _\br_\be_\bc_\bv(T&& data, int source_rank, int tag, MPI_Status* status =\n-MPI_STATUS_IGNORE) const\n-167 {\n-168 T lvalue_data(std::forward(data));\n-169 auto mpi_data = _\bg_\be_\bt_\bM_\bP_\bI_\bD_\ba_\bt_\ba(lvalue_data);\n-170 MPI_Recv(mpi_data.ptr(), mpi_data.size(), mpi_data.type(),\n-171 source_rank, tag, communicator, status);\n-172 return lvalue_data;\n-173 }\n-174\n+156 template\n+_\b1_\b5_\b7 T _\br_\be_\bc_\bv([[maybe_unused]] T&& data,\n+158 [[maybe_unused]] int source_rank,\n+159 [[maybe_unused]] int tag,\n+160 [[maybe_unused]] void* status = 0)\n+161 {\n+162 _\bD_\bU_\bN_\bE_\b__\bT_\bH_\bR_\bO_\bW(_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bE_\br_\br_\bo_\br, \"This method is not supported in sequential\n+programs\");\n+163 }\n+164\n+168 template\n+_\b1_\b6_\b9 _\bP_\bs_\be_\bu_\bd_\bo_\bF_\bu_\bt_\bu_\br_\be_\b<_\bT_\b> _\bi_\br_\be_\bc_\bv([[maybe_unused]] T&& data,\n+170 [[maybe_unused]] int source_rank,\n+171 [[maybe_unused]] int tag)\n+172 {\n+173 _\bD_\bU_\bN_\bE_\b__\bT_\bH_\bR_\bO_\bW(_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bE_\br_\br_\bo_\br, \"This method is not supported in sequential\n+programs\");\n+174 }\n+175\n 176 template\n-_\b1_\b7_\b7 _\bM_\bP_\bI_\bF_\bu_\bt_\bu_\br_\be_\b<_\bT_\b> _\bi_\br_\be_\bc_\bv(T&& data, int source_rank, int tag) const\n-178 {\n-179 _\bM_\bP_\bI_\bF_\bu_\bt_\bu_\br_\be_\b<_\bT_\b> future(std::forward(data));\n-180 auto mpidata = future._\bg_\be_\bt_\b__\bm_\bp_\bi_\bd_\ba_\bt_\ba();\n-181 if (mpidata.size() == 0)\n-182 _\bD_\bU_\bN_\bE_\b__\bT_\bH_\bR_\bO_\bW(_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bE_\br_\br_\bo_\br, \"Size if irecv data object is zero. Reserve\n-sufficient size for the whole message\");\n-183 MPI_Irecv(mpidata.ptr(), mpidata.size(), mpidata.type(),\n-184 source_rank, tag, communicator, &future.req_);\n-185 return future;\n-186 }\n-187\n-188 template\n-_\b1_\b8_\b9 T _\br_\br_\be_\bc_\bv(T&& data, int source_rank, int tag, MPI_Status* status =\n-MPI_STATUS_IGNORE) const\n-190 {\n-191 MPI_Status _status;\n-192 MPI_Message _message;\n-193 T lvalue_data(std::forward(data));\n-194 auto mpi_data = _\bg_\be_\bt_\bM_\bP_\bI_\bD_\ba_\bt_\ba(lvalue_data);\n-195 static_assert(!mpi_data.static_size, \"rrecv work only for non-static-sized\n-types.\");\n-196 if(status == MPI_STATUS_IGNORE)\n-197 status = &_status;\n-198 MPI_Mprobe(source_rank, tag, communicator, &_message, status);\n-199 int _\bs_\bi_\bz_\be;\n-200 MPI_Get_count(status, mpi_data.type(), &_\bs_\bi_\bz_\be);\n-201 mpi_data.resize(_\bs_\bi_\bz_\be);\n-202 MPI_Mrecv(mpi_data.ptr(), mpi_data.size(), mpi_data.type(), &_message,\n-status);\n-203 return lvalue_data;\n-204 }\n-205\n+_\b1_\b7_\b7 T _\br_\br_\be_\bc_\bv([[maybe_unused]] T&& data,\n+178 [[maybe_unused]] int source_rank,\n+179 [[maybe_unused]] int tag,\n+180 [[maybe_unused]] void* status = 0) const\n+181 {\n+182 _\bD_\bU_\bN_\bE_\b__\bT_\bH_\bR_\bO_\bW(_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bE_\br_\br_\bo_\br, \"This method is not supported in sequential\n+programs\");\n+183 }\n+187 template\n+_\b1_\b8_\b8 T _\bs_\bu_\bm (const T& in) const\n+189 {\n+190 return in;\n+191 }\n+192\n+198 template\n+_\b1_\b9_\b9 int _\bs_\bu_\bm ([[maybe_unused]] T* inout, [[maybe_unused]] int len) const\n+200 {\n+201 return 0;\n+202 }\n+203\n 207 template\n-_\b2_\b0_\b8 T _\bs_\bu_\bm (const T& in) const\n+_\b2_\b0_\b8 T _\bp_\br_\bo_\bd (const T& in) const\n 209 {\n-210 T out;\n-211 allreduce >(&in,&out,1);\n-212 return out;\n-213 }\n-214\n-216 template\n-_\b2_\b1_\b7 int _\bs_\bu_\bm (T* inout, int len) const\n-218 {\n-219 return allreduce >(inout,len);\n-220 }\n-221\n-223 template\n-_\b2_\b2_\b4 T _\bp_\br_\bo_\bd (const T& in) const\n-225 {\n-226 T out;\n-227 allreduce >(&in,&out,1);\n-228 return out;\n-229 }\n-230\n-232 template\n-_\b2_\b3_\b3 int _\bp_\br_\bo_\bd (T* inout, int len) const\n-234 {\n-235 return allreduce >(inout,len);\n-236 }\n-237\n-239 template\n-_\b2_\b4_\b0 T _\bm_\bi_\bn (const T& in) const\n-241 {\n-242 T out;\n-243 allreduce >(&in,&out,1);\n-244 return out;\n-245 }\n-246\n-248 template\n-_\b2_\b4_\b9 int _\bm_\bi_\bn (T* inout, int len) const\n-250 {\n-251 return allreduce >(inout,len);\n-252 }\n-253\n-254\n-256 template\n-_\b2_\b5_\b7 T _\bm_\ba_\bx (const T& in) const\n-258 {\n-259 T out;\n-260 allreduce >(&in,&out,1);\n-261 return out;\n+210 return in;\n+211 }\n+212\n+218 template\n+_\b2_\b1_\b9 int _\bp_\br_\bo_\bd ([[maybe_unused]] T* inout, [[maybe_unused]] int len) const\n+220 {\n+221 return 0;\n+222 }\n+223\n+227 template\n+_\b2_\b2_\b8 T _\bm_\bi_\bn (const T& in) const\n+229 {\n+230 return in;\n+231 }\n+232\n+238 template\n+_\b2_\b3_\b9 int _\bm_\bi_\bn ([[maybe_unused]] T* inout, [[maybe_unused]] int len) const\n+240 {\n+241 return 0;\n+242 }\n+243\n+247 template\n+_\b2_\b4_\b8 T _\bm_\ba_\bx (const T& in) const\n+249 {\n+250 return in;\n+251 }\n+252\n+258 template\n+_\b2_\b5_\b9 int _\bm_\ba_\bx ([[maybe_unused]] T* inout, [[maybe_unused]] int len) const\n+260 {\n+261 return 0;\n 262 }\n 263\n-265 template\n-_\b2_\b6_\b6 int _\bm_\ba_\bx (T* inout, int len) const\n-267 {\n-268 return allreduce >(inout,len);\n-269 }\n-270\n-_\b2_\b7_\b2 int _\bb_\ba_\br_\br_\bi_\be_\br () const\n-273 {\n-274 return MPI_Barrier(communicator);\n-275 }\n-276\n-_\b2_\b7_\b8 _\bM_\bP_\bI_\bF_\bu_\bt_\bu_\br_\be_\b<_\bv_\bo_\bi_\bd_\b> _\bi_\bb_\ba_\br_\br_\bi_\be_\br () const\n-279 {\n-280 _\bM_\bP_\bI_\bF_\bu_\bt_\bu_\br_\be_\b<_\bv_\bo_\bi_\bd_\b> future(true); // make a valid MPIFuture\n-281 MPI_Ibarrier(communicator, &future.req_);\n-282 return future;\n-283 }\n-284\n-285\n-287 template\n-_\b2_\b8_\b8 int _\bb_\br_\bo_\ba_\bd_\bc_\ba_\bs_\bt (T* inout, int len, int root) const\n-289 {\n-290 return MPI_Bcast(inout,len,_\bM_\bP_\bI_\bT_\br_\ba_\bi_\bt_\bs_\b<_\bT_\b>_\b:_\b:_\bg_\be_\bt_\bT_\by_\bp_\be(),root,communicator);\n-291 }\n-292\n+_\b2_\b6_\b7 int _\bb_\ba_\br_\br_\bi_\be_\br () const\n+268 {\n+269 return 0;\n+270 }\n+271\n+_\b2_\b7_\b5 _\bP_\bs_\be_\bu_\bd_\bo_\bF_\bu_\bt_\bu_\br_\be_\b<_\bv_\bo_\bi_\bd_\b> _\bi_\bb_\ba_\br_\br_\bi_\be_\br () const\n+276 {\n+277 return {true}; // return a valid future\n+278 }\n+279\n+283 template\n+_\b2_\b8_\b4 int _\bb_\br_\bo_\ba_\bd_\bc_\ba_\bs_\bt ([[maybe_unused]] T* inout,\n+285 [[maybe_unused]] int len,\n+286 [[maybe_unused]] int root) const\n+287 {\n+288 return 0;\n+289 }\n+290\n 294 template\n-_\b2_\b9_\b5 _\bM_\bP_\bI_\bF_\bu_\bt_\bu_\br_\be_\b<_\bT_\b> _\bi_\bb_\br_\bo_\ba_\bd_\bc_\ba_\bs_\bt(T&& data, int root) const{\n-296 _\bM_\bP_\bI_\bF_\bu_\bt_\bu_\br_\be_\b<_\bT_\b> future(std::forward(data));\n-297 auto mpidata = future._\bg_\be_\bt_\b__\bm_\bp_\bi_\bd_\ba_\bt_\ba();\n-298 MPI_Ibcast(mpidata.ptr(),\n-299 mpidata.size(),\n-300 mpidata.type(),\n-301 root,\n-302 communicator,\n-303 &future.req_);\n-304 return future;\n-305 }\n-306\n-309 template\n-_\b3_\b1_\b0 int _\bg_\ba_\bt_\bh_\be_\br (const T* in, T* out, int len, int root) const\n-311 {\n-312 return MPI_Gather(const_cast(in),len,_\bM_\bP_\bI_\bT_\br_\ba_\bi_\bt_\bs_\b<_\bT_\b>_\b:_\b:_\bg_\be_\bt_\bT_\by_\bp_\be(),\n-313 out,len,_\bM_\bP_\bI_\bT_\br_\ba_\bi_\bt_\bs_\b<_\bT_\b>_\b:_\b:_\bg_\be_\bt_\bT_\by_\bp_\be(),\n-314 root,communicator);\n-315 }\n-316\n-318 template>\n-_\b3_\b1_\b9 _\bM_\bP_\bI_\bF_\bu_\bt_\bu_\br_\be_\b<_\bT_\bO_\bU_\bT_\b,_\b _\bT_\bI_\bN_\b> _\bi_\bg_\ba_\bt_\bh_\be_\br(TIN&& data_in, TOUT&& data_out, int root)\n-const{\n-320 _\bM_\bP_\bI_\bF_\bu_\bt_\bu_\br_\be_\b<_\bT_\bO_\bU_\bT_\b,_\b _\bT_\bI_\bN_\b> future(std::forward(data_out), std::forward\n-(data_in));\n-321 auto mpidata_in = future._\bg_\be_\bt_\b__\bs_\be_\bn_\bd_\b__\bm_\bp_\bi_\bd_\ba_\bt_\ba();\n-322 auto mpidata_out = future._\bg_\be_\bt_\b__\bm_\bp_\bi_\bd_\ba_\bt_\ba();\n-323 assert(root != me || mpidata_in.size()*procs <= mpidata_out.size());\n-324 int outlen = (me==root) * mpidata_in.size();\n-325 MPI_Igather(mpidata_in.ptr(), mpidata_in.size(), mpidata_in.type(),\n-326 mpidata_out.ptr(), outlen, mpidata_out.type(),\n-327 root, communicator, &future.req_);\n-328 return future;\n-329 }\n-330\n-332 template\n-_\b3_\b3_\b3 int _\bg_\ba_\bt_\bh_\be_\br_\bv (const T* in, int sendDataLen, T* out, int* recvDataLen, int*\n-displ, int root) const\n-334 {\n-335 return MPI_Gatherv(const_cast(in),sendDataLen,_\bM_\bP_\bI_\bT_\br_\ba_\bi_\bt_\bs_\b<_\bT_\b>_\b:_\b:_\bg_\be_\bt_\bT_\by_\bp_\be(),\n-336 out,recvDataLen,displ,_\bM_\bP_\bI_\bT_\br_\ba_\bi_\bt_\bs_\b<_\bT_\b>_\b:_\b:_\bg_\be_\bt_\bT_\by_\bp_\be(),\n-337 root,communicator);\n-338 }\n-339\n-342 template\n-_\b3_\b4_\b3 int _\bs_\bc_\ba_\bt_\bt_\be_\br (const T* sendData, T* recvData, int len, int root) const\n-344 {\n-345 return MPI_Scatter(const_cast(sendData),len,_\bM_\bP_\bI_\bT_\br_\ba_\bi_\bt_\bs_\b<_\bT_\b>_\b:_\b:_\bg_\be_\bt_\bT_\by_\bp_\be(),\n-346 recvData,len,_\bM_\bP_\bI_\bT_\br_\ba_\bi_\bt_\bs_\b<_\bT_\b>_\b:_\b:_\bg_\be_\bt_\bT_\by_\bp_\be(),\n-347 root,communicator);\n-348 }\n-349\n-351 template\n-_\b3_\b5_\b2 _\bM_\bP_\bI_\bF_\bu_\bt_\bu_\br_\be_\b<_\bT_\bO_\bU_\bT_\b,_\b _\bT_\bI_\bN_\b> _\bi_\bs_\bc_\ba_\bt_\bt_\be_\br(TIN&& data_in, TOUT&& data_out, int root)\n-const\n-353 {\n-354 _\bM_\bP_\bI_\bF_\bu_\bt_\bu_\br_\be_\b<_\bT_\bO_\bU_\bT_\b,_\b _\bT_\bI_\bN_\b> future(std::forward(data_out), std::forward\n-(data_in));\n-355 auto mpidata_in = future._\bg_\be_\bt_\b__\bs_\be_\bn_\bd_\b__\bm_\bp_\bi_\bd_\ba_\bt_\ba();\n-356 auto mpidata_out = future._\bg_\be_\bt_\b__\bm_\bp_\bi_\bd_\ba_\bt_\ba();\n-357 int inlen = (me==root) * mpidata_in.size()/procs;\n-358 MPI_Iscatter(mpidata_in.ptr(), inlen, mpidata_in.type(),\n-359 mpidata_out.ptr(), mpidata_out.size(), mpidata_out.type(),\n-360 root, communicator, &future.req_);\n-361 return future;\n-362 }\n-363\n-365 template\n-_\b3_\b6_\b6 int _\bs_\bc_\ba_\bt_\bt_\be_\br_\bv (const T* sendData, int* sendDataLen, int* displ, T* recvData,\n-int recvDataLen, int root) const\n-367 {\n-368 return MPI_Scatterv(const_cast\n-(sendData),sendDataLen,displ,_\bM_\bP_\bI_\bT_\br_\ba_\bi_\bt_\bs_\b<_\bT_\b>_\b:_\b:_\bg_\be_\bt_\bT_\by_\bp_\be(),\n-369 recvData,recvDataLen,_\bM_\bP_\bI_\bT_\br_\ba_\bi_\bt_\bs_\b<_\bT_\b>_\b:_\b:_\bg_\be_\bt_\bT_\by_\bp_\be(),\n-370 root,communicator);\n-371 }\n-372\n-373\n-_\b3_\b7_\b4 operator MPI_Comm () const\n-375 {\n-376 return communicator;\n-377 }\n-378\n-380 template\n-_\b3_\b8_\b1 int _\ba_\bl_\bl_\bg_\ba_\bt_\bh_\be_\br(const T* sbuf, int count, T1* rbuf) const\n-382 {\n-383 return MPI_Allgather(const_cast(sbuf), count, _\bM_\bP_\bI_\bT_\br_\ba_\bi_\bt_\bs_\b<_\bT_\b>_\b:_\b:_\bg_\be_\bt_\bT_\by_\bp_\be(),\n-384 rbuf, count, _\bM_\bP_\bI_\bT_\br_\ba_\bi_\bt_\bs_\b<_\bT_\b1_\b>_\b:_\b:_\bg_\be_\bt_\bT_\by_\bp_\be(),\n-385 communicator);\n-386 }\n-387\n-389 template\n-_\b3_\b9_\b0 _\bM_\bP_\bI_\bF_\bu_\bt_\bu_\br_\be_\b<_\bT_\bO_\bU_\bT_\b,_\b _\bT_\bI_\bN_\b> _\bi_\ba_\bl_\bl_\bg_\ba_\bt_\bh_\be_\br(TIN&& data_in, TOUT&& data_out) const\n-391 {\n-392 _\bM_\bP_\bI_\bF_\bu_\bt_\bu_\br_\be_\b<_\bT_\bO_\bU_\bT_\b,_\b _\bT_\bI_\bN_\b> future(std::forward(data_out), std::forward\n-(data_in));\n-393 auto mpidata_in = future._\bg_\be_\bt_\b__\bs_\be_\bn_\bd_\b__\bm_\bp_\bi_\bd_\ba_\bt_\ba();\n-394 auto mpidata_out = future._\bg_\be_\bt_\b__\bm_\bp_\bi_\bd_\ba_\bt_\ba();\n-395 assert(mpidata_in.size()*procs <= mpidata_out.size());\n-396 int outlen = mpidata_in.size();\n-397 MPI_Iallgather(mpidata_in.ptr(), mpidata_in.size(), mpidata_in.type(),\n-398 mpidata_out.ptr(), outlen, mpidata_out.type(),\n-399 communicator, &future.req_);\n-400 return future;\n-401 }\n-402\n-404 template\n-_\b4_\b0_\b5 int _\ba_\bl_\bl_\bg_\ba_\bt_\bh_\be_\br_\bv (const T* in, int sendDataLen, T* out, int* recvDataLen,\n-int* displ) const\n-406 {\n-407 return MPI_Allgatherv(const_cast(in),sendDataLen,_\bM_\bP_\bI_\bT_\br_\ba_\bi_\bt_\bs_\b<_\bT_\b>_\b:_\b:_\bg_\be_\bt_\bT_\by_\bp_\be\n-(),\n-408 out,recvDataLen,displ,_\bM_\bP_\bI_\bT_\br_\ba_\bi_\bt_\bs_\b<_\bT_\b>_\b:_\b:_\bg_\be_\bt_\bT_\by_\bp_\be(),\n-409 communicator);\n-410 }\n-411\n-413 template\n-_\b4_\b1_\b4 int _\ba_\bl_\bl_\br_\be_\bd_\bu_\bc_\be(Type* inout, int len) const\n-415 {\n-416 Type* out = new Type[len];\n-417 int ret = allreduce(inout,out,len);\n-418 std::copy(out, out+len, inout);\n-419 delete[] out;\n-420 return ret;\n-421 }\n-422\n-423 template\n-_\b4_\b2_\b4 Type _\ba_\bl_\bl_\br_\be_\bd_\bu_\bc_\be(Type&& in) const{\n-425 Type lvalue_data = std::forward(in);\n-426 auto data = _\bg_\be_\bt_\bM_\bP_\bI_\bD_\ba_\bt_\ba(lvalue_data);\n-427 MPI_Allreduce(MPI_IN_PLACE, data.ptr(), data.size(), data.type(),\n-428 (_\bG_\be_\bn_\be_\br_\bi_\bc_\b__\bM_\bP_\bI_\b__\bO_\bp_\b<_\bT_\by_\bp_\be_\b,_\b _\bB_\bi_\bn_\ba_\br_\by_\bF_\bu_\bn_\bc_\bt_\bi_\bo_\bn_\b>_\b:_\b:_\bg_\be_\bt()),\n-429 communicator);\n-430 return lvalue_data;\n-431 }\n-432\n-434 template\n-_\b4_\b3_\b5 _\bM_\bP_\bI_\bF_\bu_\bt_\bu_\br_\be_\b<_\bT_\bO_\bU_\bT_\b,_\b _\bT_\bI_\bN_\b> _\bi_\ba_\bl_\bl_\br_\be_\bd_\bu_\bc_\be(TIN&& data_in, TOUT&& data_out) const {\n-436 _\bM_\bP_\bI_\bF_\bu_\bt_\bu_\br_\be_\b<_\bT_\bO_\bU_\bT_\b,_\b _\bT_\bI_\bN_\b> future(std::forward(data_out), std::forward\n-(data_in));\n-437 auto mpidata_in = future._\bg_\be_\bt_\b__\bs_\be_\bn_\bd_\b__\bm_\bp_\bi_\bd_\ba_\bt_\ba();\n-438 auto mpidata_out = future._\bg_\be_\bt_\b__\bm_\bp_\bi_\bd_\ba_\bt_\ba();\n-439 assert(mpidata_out.size() == mpidata_in.size());\n-440 assert(mpidata_out.type() == mpidata_in.type());\n-441 MPI_Iallreduce(mpidata_in.ptr(), mpidata_out.ptr(),\n-442 mpidata_out.size(), mpidata_out.type(),\n-443 (_\bG_\be_\bn_\be_\br_\bi_\bc_\b__\bM_\bP_\bI_\b__\bO_\bp_\b<_\bT_\bI_\bN_\b,_\b _\bB_\bi_\bn_\ba_\br_\by_\bF_\bu_\bn_\bc_\bt_\bi_\bo_\bn_\b>_\b:_\b:_\bg_\be_\bt()),\n-444 communicator, &future.req_);\n-445 return future;\n-446 }\n-447\n-449 template\n-_\b4_\b5_\b0 _\bM_\bP_\bI_\bF_\bu_\bt_\bu_\br_\be_\b<_\bT_\b> _\bi_\ba_\bl_\bl_\br_\be_\bd_\bu_\bc_\be(T&& data) const{\n-451 _\bM_\bP_\bI_\bF_\bu_\bt_\bu_\br_\be_\b<_\bT_\b> future(std::forward(data));\n-452 auto mpidata = future._\bg_\be_\bt_\b__\bm_\bp_\bi_\bd_\ba_\bt_\ba();\n-453 MPI_Iallreduce(MPI_IN_PLACE, mpidata.ptr(),\n-454 mpidata.size(), mpidata.type(),\n-455 (_\bG_\be_\bn_\be_\br_\bi_\bc_\b__\bM_\bP_\bI_\b__\bO_\bp_\b<_\bT_\b,_\b _\bB_\bi_\bn_\ba_\br_\by_\bF_\bu_\bn_\bc_\bt_\bi_\bo_\bn_\b>_\b:_\b:_\bg_\be_\bt()),\n-456 communicator, &future.req_);\n-457 return future;\n-458 }\n-459\n-461 template\n-_\b4_\b6_\b2 int _\ba_\bl_\bl_\br_\be_\bd_\bu_\bc_\be(const Type* in, Type* out, int len) const\n-463 {\n-464 return MPI_Allreduce(const_cast(in), out, len, _\bM_\bP_\bI_\bT_\br_\ba_\bi_\bt_\bs_\b<_\bT_\by_\bp_\be_\b>_\b:_\b:\n-_\bg_\be_\bt_\bT_\by_\bp_\be(),\n-465 (_\bG_\be_\bn_\be_\br_\bi_\bc_\b__\bM_\bP_\bI_\b__\bO_\bp_\b<_\bT_\by_\bp_\be_\b,_\b _\bB_\bi_\bn_\ba_\br_\by_\bF_\bu_\bn_\bc_\bt_\bi_\bo_\bn_\b>_\b:_\b:_\bg_\be_\bt()),communicator);\n-466 }\n-467\n-468 private:\n-469 MPI_Comm communicator;\n-470 int me;\n-471 int procs;\n-472 };\n-473} // namespace dune\n-474\n-475#endif // HAVE_MPI\n-476\n-477#endif\n-_\bm_\bp_\bi_\bd_\ba_\bt_\ba_\b._\bh_\bh\n-Interface class to translate objects to a MPI_Datatype, void* and size used for\n-MPI calls.\n-_\bc_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b._\bh_\bh\n-Implements an utility class that provides collective communication methods for\n-sequential programs.\n-_\bC_\bo_\bm_\bp_\bo_\bs_\be_\bM_\bP_\bI_\bO_\bp\n-#define ComposeMPIOp(func, op)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mpicommunication.hh:77\n-_\bm_\bp_\bi_\bt_\br_\ba_\bi_\bt_\bs_\b._\bh_\bh\n-Traits classes for mapping types onto MPI_Datatype.\n-_\bm_\bp_\bi_\bf_\bu_\bt_\bu_\br_\be_\b._\bh_\bh\n-_\be_\bx_\bc_\be_\bp_\bt_\bi_\bo_\bn_\bs_\b._\bh_\bh\n-A few common exception classes.\n+_\b2_\b9_\b5 _\bP_\bs_\be_\bu_\bd_\bo_\bF_\bu_\bt_\bu_\br_\be_\b<_\bT_\b> _\bi_\bb_\br_\bo_\ba_\bd_\bc_\ba_\bs_\bt(T&& data, int root) const{\n+296 return {std::forward(data)};\n+297 }\n+298\n+299\n+312 template\n+_\b3_\b1_\b3 int _\bg_\ba_\bt_\bh_\be_\br (const T* in, T* out, int len, [[maybe_unused]] int root) const\n+// note out must have same size as in\n+314 {\n+315 for (int i=0; i>\n+_\b3_\b2_\b4 _\bP_\bs_\be_\bu_\bd_\bo_\bF_\bu_\bt_\bu_\br_\be_\b<_\bT_\bO_\bU_\bT_\b> _\bi_\bg_\ba_\bt_\bh_\be_\br(TIN&& data_in, TOUT&& data_out, int root){\n+325 *(data_out.begin()) = std::forward(data_in);\n+326 return {std::forward(data_out)};\n+327 }\n+328\n+329\n+349 template\n+_\b3_\b5_\b0 int _\bg_\ba_\bt_\bh_\be_\br_\bv (const T* in,\n+351 int sendDataLen,\n+352 T* out,\n+353 [[maybe_unused]] int* recvDataLen,\n+354 int* displ,\n+355 [[maybe_unused]] int root) const\n+356 {\n+357 for (int i=*displ; i\n+_\b3_\b7_\b6 int _\bs_\bc_\ba_\bt_\bt_\be_\br (const T* sendData, T* recvData, int len, [[maybe_unused]] int\n+root) const // note out must have same size as in\n+377 {\n+378 for (int i=0; i\n+_\b3_\b8_\b7 _\bP_\bs_\be_\bu_\bd_\bo_\bF_\bu_\bt_\bu_\br_\be_\b<_\bT_\bO_\bU_\bT_\b> _\bi_\bs_\bc_\ba_\bt_\bt_\be_\br(TIN&& data_in, TOUT&& data_out, int root){\n+388 data_out = *(std::forward(data_in).begin());\n+389 return {std::forward(data_out)};\n+390 }\n+391\n+410 template\n+_\b4_\b1_\b1 int _\bs_\bc_\ba_\bt_\bt_\be_\br_\bv (const T* sendData,int* sendDataLen, int* displ, T* recvData,\n+412 [[maybe_unused]] int recvDataLen, [[maybe_unused]] int root) const\n+413 {\n+414 for (int i=*displ; i<*sendDataLen; i++)\n+415 recvData[i] = sendData[i];\n+416 return 0;\n+417 }\n+418\n+432 template\n+_\b4_\b3_\b3 int _\ba_\bl_\bl_\bg_\ba_\bt_\bh_\be_\br(const T* sbuf, int count, T* rbuf) const\n+434 {\n+435 for(const T* end=sbuf+count; sbuf < end; ++sbuf, ++rbuf)\n+436 *rbuf=*sbuf;\n+437 return 0;\n+438 }\n+439\n+444 template\n+_\b4_\b4_\b5 _\bP_\bs_\be_\bu_\bd_\bo_\bF_\bu_\bt_\bu_\br_\be_\b<_\bT_\bO_\bU_\bT_\b> _\bi_\ba_\bl_\bl_\bg_\ba_\bt_\bh_\be_\br(TIN&& data_in, TOUT&& data_out){\n+446 return {std::forward(data_out)};\n+447 }\n+448\n+465 template\n+_\b4_\b6_\b6 int _\ba_\bl_\bl_\bg_\ba_\bt_\bh_\be_\br_\bv (const T* in, int sendDataLen, T* out, [[maybe_unused]] int*\n+recvDataLen, int* displ) const\n+467 {\n+468 for (int i=*displ; i\n+_\b4_\b8_\b6 int _\ba_\bl_\bl_\br_\be_\bd_\bu_\bc_\be([[maybe_unused]] Type* inout, [[maybe_unused]] int len) const\n+487 {\n+488 return 0;\n+489 }\n+490\n+495 template\n+_\b4_\b9_\b6 _\bP_\bs_\be_\bu_\bd_\bo_\bF_\bu_\bt_\bu_\br_\be_\b<_\bT_\bO_\bU_\bT_\b> _\bi_\ba_\bl_\bl_\br_\be_\bd_\bu_\bc_\be(TIN&& data_in, TOUT&& data_out){\n+497 data_out = std::forward(data_in);\n+498 return {std::forward(data_out)};\n+499 }\n+500\n+505 template\n+_\b5_\b0_\b6 _\bP_\bs_\be_\bu_\bd_\bo_\bF_\bu_\bt_\bu_\br_\be_\b<_\bT_\b> _\bi_\ba_\bl_\bl_\br_\be_\bd_\bu_\bc_\be(T&& data){\n+507 return {std::forward(data)};\n+508 }\n+509\n+510\n+524 template\n+_\b5_\b2_\b5 int _\ba_\bl_\bl_\br_\be_\bd_\bu_\bc_\be(const Type* in, Type* out, int len) const\n+526 {\n+527 std::copy(in, in+len, out);\n+528 return 0;\n+529 }\n+530\n+531 };\n+532\n+538 template\n+_\b5_\b3_\b9 using _\bC_\bo_\bl_\bl_\be_\bc_\bt_\bi_\bv_\be_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn\n+540 [[deprecated(\"CollectiveCommunication is deprecated. Use Communication\n+instead.\")]]\n+541 = _\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b<_\bT_\b>;\n+542}\n+543\n+544#endif // DUNE_COMMON_PARALLEL_COMMUNICATION_HH\n+_\bf_\bu_\bt_\bu_\br_\be_\b._\bh_\bh\n _\bb_\bi_\bn_\ba_\br_\by_\bf_\bu_\bn_\bc_\bt_\bi_\bo_\bn_\bs_\b._\bh_\bh\n helper classes to provide unique types for standard functions\n+_\be_\bx_\bc_\be_\bp_\bt_\bi_\bo_\bn_\bs_\b._\bh_\bh\n+A few common exception classes.\n _\bD_\bU_\bN_\bE_\b__\bT_\bH_\bR_\bO_\bW\n #define DUNE_THROW(E, m)\n D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn exceptions.hh:218\n+_\bD_\bu_\bn_\be_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b=_\b=\n+EnableIfInterOperable< T1, T2, bool >::type operator==(const\n+ForwardIteratorFacade< T1, V1, R1, D > &lhs, const ForwardIteratorFacade< T2,\n+V2, R2, D > &rhs)\n+Checks for equality.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn iteratorfacades.hh:238\n+_\bD_\bu_\bn_\be_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b!_\b=\n+EnableIfInterOperable< T1, T2, bool >::type operator!=(const\n+ForwardIteratorFacade< T1, V1, R1, D > &lhs, const ForwardIteratorFacade< T2,\n+V2, R2, D > &rhs)\n+Checks for inequality.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn iteratorfacades.hh:260\n _\bD_\bu_\bn_\be\n Dune namespace.\n D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn alignedallocator.hh:13\n-_\bD_\bu_\bn_\be_\b:_\b:_\bg_\be_\bt_\bM_\bP_\bI_\bD_\ba_\bt_\ba\n-auto getMPIData(T &t)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mpidata.hh:44\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\bP_\bI_\bT_\br_\ba_\bi_\bt_\bs\n-A traits class describing the mapping of types onto MPI_Datatypes.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mpitraits.hh:41\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\bi_\bn\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn binaryfunctions.hh:18\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bx\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn binaryfunctions.hh:34\n _\bD_\bu_\bn_\be_\b:_\b:_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bE_\br_\br_\bo_\br\n Default exception if an error in the parallel communication of the program\n occurred.\n D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn exceptions.hh:287\n+_\bD_\bu_\bn_\be_\b:_\b:_\bN_\bo_\b__\bC_\bo_\bm_\bm\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn communication.hh:46\n _\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn\n Collective communication interface and sequential default implementation.\n D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn communication.hh:100\n-_\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\bs_\bi_\bz_\be\n-int size() const\n-Number of processes in set, is greater than 0.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn communication.hh:126\n-_\bD_\bu_\bn_\be_\b:_\b:_\bG_\be_\bn_\be_\br_\bi_\bc_\b__\bM_\bP_\bI_\b__\bO_\bp\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mpicommunication.hh:41\n-_\bD_\bu_\bn_\be_\b:_\b:_\bG_\be_\bn_\be_\br_\bi_\bc_\b__\bM_\bP_\bI_\b__\bO_\bp_\b:_\b:_\bg_\be_\bt\n-static MPI_Op get()\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mpicommunication.hh:44\n-_\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b<_\b _\bM_\bP_\bI_\b__\bC_\bo_\bm_\bm_\b _\b>_\b:_\b:_\bm_\ba_\bx\n-int max(T *inout, int len) const\n-Compute the maximum of the argument over all processes and return the result in\n-every process....\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mpicommunication.hh:266\n-_\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b<_\b _\bM_\bP_\bI_\b__\bC_\bo_\bm_\bm_\b _\b>_\b:_\b:_\ba_\bl_\bl_\bg_\ba_\bt_\bh_\be_\br_\bv\n-int allgatherv(const T *in, int sendDataLen, T *out, int *recvDataLen, int\n-*displ) const\n-Gathers data of variable length from all tasks and distribute it to all.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mpicommunication.hh:405\n-_\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b<_\b _\bM_\bP_\bI_\b__\bC_\bo_\bm_\bm_\b _\b>_\b:_\b:_\bm_\ba_\bx\n+_\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\bi_\ba_\bl_\bl_\br_\be_\bd_\bu_\bc_\be\n+PseudoFuture< TOUT > iallreduce(TIN &&data_in, TOUT &&data_out)\n+Compute something over all processes nonblocking.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn communication.hh:496\n+_\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\bs_\be_\bn_\bd\n+int send(const T &data, int dest_rank, int tag)\n+Sends the data to the dest_rank.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn communication.hh:135\n+_\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\ba_\bl_\bl_\br_\be_\bd_\bu_\bc_\be\n+int allreduce(const Type *in, Type *out, int len) const\n+Compute something over all processes for each component of an array and return\n+the result in every pr...\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn communication.hh:525\n+_\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\bm_\ba_\bx\n T max(const T &in) const\n Compute the maximum of the argument over all processes and return the result in\n every process....\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mpicommunication.hh:257\n-_\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b<_\b _\bM_\bP_\bI_\b__\bC_\bo_\bm_\bm_\b _\b>_\b:_\b:_\bi_\bb_\br_\bo_\ba_\bd_\bc_\ba_\bs_\bt\n-MPIFuture< T > ibroadcast(T &&data, int root) const\n-Distribute an array from the process with rank root to all other processes\n-nonblocking.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mpicommunication.hh:295\n-_\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b<_\b _\bM_\bP_\bI_\b__\bC_\bo_\bm_\bm_\b _\b>_\b:_\b:_\bi_\bb_\ba_\br_\br_\bi_\be_\br\n-MPIFuture< void > ibarrier() const\n-Nonblocking barrier.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mpicommunication.hh:278\n-_\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b<_\b _\bM_\bP_\bI_\b__\bC_\bo_\bm_\bm_\b _\b>_\b:_\b:_\br_\be_\bc_\bv\n-T recv(T &&data, int source_rank, int tag, MPI_Status\n-*status=MPI_STATUS_IGNORE) const\n-Receives the data from the source_rank.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mpicommunication.hh:166\n-_\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b<_\b _\bM_\bP_\bI_\b__\bC_\bo_\bm_\bm_\b _\b>_\b:_\b:_\bb_\ba_\br_\br_\bi_\be_\br\n-int barrier() const\n-Wait until all processes have arrived at this point in the program.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mpicommunication.hh:272\n-_\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b<_\b _\bM_\bP_\bI_\b__\bC_\bo_\bm_\bm_\b _\b>_\b:_\b:_\br_\ba_\bn_\bk\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn communication.hh:248\n+_\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\br_\ba_\bn_\bk\n int rank() const\n Return rank, is between 0 and size()-1.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mpicommunication.hh:133\n-_\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b<_\b _\bM_\bP_\bI_\b__\bC_\bo_\bm_\bm_\b _\b>_\b:_\b:_\bs_\bc_\ba_\bt_\bt_\be_\br_\bv\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn communication.hh:114\n+_\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\bs_\bu_\bm\n+T sum(const T &in) const\n+Compute the sum of the argument over all processes and return the result in\n+every process....\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn communication.hh:188\n+_\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\bs_\bc_\ba_\bt_\bt_\be_\br_\bv\n int scatterv(const T *sendData, int *sendDataLen, int *displ, T *recvData, int\n recvDataLen, int root) const\n Scatter arrays of variable length from a root to all other tasks.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mpicommunication.hh:366\n-_\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b<_\b _\bM_\bP_\bI_\b__\bC_\bo_\bm_\bm_\b _\b>_\b:_\b:_\bi_\bs_\be_\bn_\bd\n-MPIFuture< T > isend(T &&data, int dest_rank, int tag) const\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn communication.hh:411\n+_\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\bp_\br_\bo_\bd\n+int prod(T *inout, int len) const\n+Compute the product over all processes for each component of an array and\n+return the result in every ...\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn communication.hh:219\n+_\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\br_\be_\bc_\bv\n+T recv(T &&data, int source_rank, int tag, void *status=0)\n+Receives the data from the source_rank.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn communication.hh:157\n+_\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\bi_\bs_\be_\bn_\bd\n+PseudoFuture< T > isend(const T &&data, int dest_rank, int tag)\n Sends the data to the dest_rank nonblocking.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mpicommunication.hh:155\n-_\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b<_\b _\bM_\bP_\bI_\b__\bC_\bo_\bm_\bm_\b _\b>_\b:_\b:_\bi_\ba_\bl_\bl_\bg_\ba_\bt_\bh_\be_\br\n-MPIFuture< TOUT, TIN > iallgather(TIN &&data_in, TOUT &&data_out) const\n-Gathers data from all tasks and distribute it to all nonblocking.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mpicommunication.hh:390\n-_\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b<_\b _\bM_\bP_\bI_\b__\bC_\bo_\bm_\bm_\b _\b>_\b:_\b:_\ba_\bl_\bl_\br_\be_\bd_\bu_\bc_\be\n-Type allreduce(Type &&in) const\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mpicommunication.hh:424\n-_\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b<_\b _\bM_\bP_\bI_\b__\bC_\bo_\bm_\bm_\b _\b>_\b:_\b:_\bs_\bu_\bm\n-int sum(T *inout, int len) const\n-Compute the sum of the argument over all processes and return the result in\n-every process....\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mpicommunication.hh:217\n-_\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b<_\b _\bM_\bP_\bI_\b__\bC_\bo_\bm_\bm_\b _\b>_\b:_\b:_\bb_\br_\bo_\ba_\bd_\bc_\ba_\bs_\bt\n-int broadcast(T *inout, int len, int root) const\n-Distribute an array from the process with rank root to all other processes.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mpicommunication.hh:288\n-_\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b<_\b _\bM_\bP_\bI_\b__\bC_\bo_\bm_\bm_\b _\b>_\b:_\b:_\bi_\ba_\bl_\bl_\br_\be_\bd_\bu_\bc_\be\n-MPIFuture< T > iallreduce(T &&data) const\n-Compute something over all processes nonblocking.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mpicommunication.hh:450\n-_\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b<_\b _\bM_\bP_\bI_\b__\bC_\bo_\bm_\bm_\b _\b>_\b:_\b:_\bs_\bu_\bm\n-T sum(const T &in) const\n-Compute the sum of the argument over all processes and return the result in\n-every process....\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mpicommunication.hh:208\n-_\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b<_\b _\bM_\bP_\bI_\b__\bC_\bo_\bm_\bm_\b _\b>_\b:_\b:_\ba_\bl_\bl_\br_\be_\bd_\bu_\bc_\be\n-int allreduce(const Type *in, Type *out, int len) const\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mpicommunication.hh:462\n-_\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b<_\b _\bM_\bP_\bI_\b__\bC_\bo_\bm_\bm_\b _\b>_\b:_\b:_\bi_\ba_\bl_\bl_\br_\be_\bd_\bu_\bc_\be\n-MPIFuture< TOUT, TIN > iallreduce(TIN &&data_in, TOUT &&data_out) const\n-Compute something over all processes nonblocking.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mpicommunication.hh:435\n-_\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b<_\b _\bM_\bP_\bI_\b__\bC_\bo_\bm_\bm_\b _\b>_\b:_\b:_\bs_\bi_\bz_\be\n-int size() const\n-Number of processes in set, is greater than 0.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mpicommunication.hh:139\n-_\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b<_\b _\bM_\bP_\bI_\b__\bC_\bo_\bm_\bm_\b _\b>_\b:_\b:_\bg_\ba_\bt_\bh_\be_\br\n-int gather(const T *in, T *out, int len, int root) const\n-Gather arrays on root task.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mpicommunication.hh:310\n-_\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b<_\b _\bM_\bP_\bI_\b__\bC_\bo_\bm_\bm_\b _\b>_\b:_\b:_\ba_\bl_\bl_\br_\be_\bd_\bu_\bc_\be\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn communication.hh:146\n+_\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\bi_\bb_\ba_\br_\br_\bi_\be_\br\n+PseudoFuture< void > ibarrier() const\n+Nonblocking barrier.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn communication.hh:275\n+_\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\ba_\bl_\bl_\br_\be_\bd_\bu_\bc_\be\n int allreduce(Type *inout, int len) const\n Compute something over all processes for each component of an array and return\n the result in every pr...\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mpicommunication.hh:414\n-_\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b<_\b _\bM_\bP_\bI_\b__\bC_\bo_\bm_\bm_\b _\b>_\b:_\b:_\br_\br_\be_\bc_\bv\n-T rrecv(T &&data, int source_rank, int tag, MPI_Status\n-*status=MPI_STATUS_IGNORE) const\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mpicommunication.hh:189\n-_\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b<_\b _\bM_\bP_\bI_\b__\bC_\bo_\bm_\bm_\b _\b>_\b:_\b:_\bs_\bc_\ba_\bt_\bt_\be_\br\n-int scatter(const T *sendData, T *recvData, int len, int root) const\n-Scatter array from a root to all other task.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mpicommunication.hh:343\n-_\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b<_\b _\bM_\bP_\bI_\b__\bC_\bo_\bm_\bm_\b _\b>_\b:_\b:_\bi_\br_\be_\bc_\bv\n-MPIFuture< T > irecv(T &&data, int source_rank, int tag) const\n-Receives the data from the source_rank nonblocking.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mpicommunication.hh:177\n-_\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b<_\b _\bM_\bP_\bI_\b__\bC_\bo_\bm_\bm_\b _\b>_\b:_\b:_\bp_\br_\bo_\bd\n-int prod(T *inout, int len) const\n-Compute the product of the argument over all processes and return the result in\n-every process....\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mpicommunication.hh:233\n-_\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b<_\b _\bM_\bP_\bI_\b__\bC_\bo_\bm_\bm_\b _\b>_\b:_\b:_\bi_\bg_\ba_\bt_\bh_\be_\br\n-MPIFuture< TOUT, TIN > igather(TIN &&data_in, TOUT &&data_out, int root) const\n-Gather arrays on root task nonblocking.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mpicommunication.hh:319\n-_\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b<_\b _\bM_\bP_\bI_\b__\bC_\bo_\bm_\bm_\b _\b>_\b:_\b:_\bm_\bi_\bn\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn communication.hh:486\n+_\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\bs_\bi_\bz_\be\n+int size() const\n+Number of processes in set, is greater than 0.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn communication.hh:126\n+_\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\bs_\bu_\bm\n+int sum(T *inout, int len) const\n+Compute the sum over all processes for each component of an array and return\n+the result in every proc...\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn communication.hh:199\n+_\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\ba_\bl_\bl_\bg_\ba_\bt_\bh_\be_\br_\bv\n+int allgatherv(const T *in, int sendDataLen, T *out, int *recvDataLen, int\n+*displ) const\n+Gathers data of variable length from all tasks and distribute it to all.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn communication.hh:466\n+_\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\bm_\bi_\bn\n T min(const T &in) const\n Compute the minimum of the argument over all processes and return the result in\n every process....\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mpicommunication.hh:240\n-_\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b<_\b _\bM_\bP_\bI_\b__\bC_\bo_\bm_\bm_\b _\b>_\b:_\b:_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn\n-Communication(const MPI_Comm &c=MPI_COMM_WORLD)\n-Instantiation using a MPI communicator.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mpicommunication.hh:111\n-_\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b<_\b _\bM_\bP_\bI_\b__\bC_\bo_\bm_\bm_\b _\b>_\b:_\b:_\bi_\bs_\bc_\ba_\bt_\bt_\be_\br\n-MPIFuture< TOUT, TIN > iscatter(TIN &&data_in, TOUT &&data_out, int root) const\n-Scatter array from a root to all other task nonblocking.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mpicommunication.hh:352\n-_\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b<_\b _\bM_\bP_\bI_\b__\bC_\bo_\bm_\bm_\b _\b>_\b:_\b:_\bg_\ba_\bt_\bh_\be_\br_\bv\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn communication.hh:228\n+_\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\bi_\br_\be_\bc_\bv\n+PseudoFuture< T > irecv(T &&data, int source_rank, int tag)\n+Receives the data from the source_rank nonblocking.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn communication.hh:169\n+_\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\bg_\ba_\bt_\bh_\be_\br_\bv\n int gatherv(const T *in, int sendDataLen, T *out, int *recvDataLen, int *displ,\n int root) const\n Gather arrays of variable size on root task.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mpicommunication.hh:333\n-_\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b<_\b _\bM_\bP_\bI_\b__\bC_\bo_\bm_\bm_\b _\b>_\b:_\b:_\bm_\bi_\bn\n-int min(T *inout, int len) const\n-Compute the minimum of the argument over all processes and return the result in\n-every process....\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mpicommunication.hh:249\n-_\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b<_\b _\bM_\bP_\bI_\b__\bC_\bo_\bm_\bm_\b _\b>_\b:_\b:_\ba_\bl_\bl_\bg_\ba_\bt_\bh_\be_\br\n-int allgather(const T *sbuf, int count, T1 *rbuf) const\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn communication.hh:350\n+_\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\bi_\bb_\br_\bo_\ba_\bd_\bc_\ba_\bs_\bt\n+PseudoFuture< T > ibroadcast(T &&data, int root) const\n+Distribute an array from the process with rank root to all other processes\n+nonblocking.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn communication.hh:295\n+_\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\ba_\bl_\bl_\bg_\ba_\bt_\bh_\be_\br\n+int allgather(const T *sbuf, int count, T *rbuf) const\n Gathers data from all tasks and distribute it to all.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mpicommunication.hh:381\n-_\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b<_\b _\bM_\bP_\bI_\b__\bC_\bo_\bm_\bm_\b _\b>_\b:_\b:_\bs_\be_\bn_\bd\n-int send(const T &data, int dest_rank, int tag) const\n-Sends the data to the dest_rank.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mpicommunication.hh:146\n-_\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b<_\b _\bM_\bP_\bI_\b__\bC_\bo_\bm_\bm_\b _\b>_\b:_\b:_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn\n-Communication(const Communication< No_Comm > &)\n-Converting constructor for no-communication that is interpreted as\n-MPI_COMM_SELF.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mpicommunication.hh:128\n-_\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b<_\b _\bM_\bP_\bI_\b__\bC_\bo_\bm_\bm_\b _\b>_\b:_\b:_\bp_\br_\bo_\bd\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn communication.hh:433\n+_\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\bs_\bc_\ba_\bt_\bt_\be_\br\n+int scatter(const T *sendData, T *recvData, int len, int root) const\n+Scatter array from a root to all other task.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn communication.hh:376\n+_\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\bg_\ba_\bt_\bh_\be_\br\n+int gather(const T *in, T *out, int len, int root) const\n+Gather arrays on root task.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn communication.hh:313\n+_\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\bi_\ba_\bl_\bl_\br_\be_\bd_\bu_\bc_\be\n+PseudoFuture< T > iallreduce(T &&data)\n+Compute something over all processes nonblocking and in-place.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn communication.hh:506\n+_\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn\n+Communication(const Communicator &)\n+Constructor with a given communicator.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn communication.hh:110\n+_\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\bm_\ba_\bx\n+int max(T *inout, int len) const\n+Compute the maximum over all processes for each component of an array and\n+return the result in every ...\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn communication.hh:259\n+_\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\bp_\br_\bo_\bd\n T prod(const T &in) const\n Compute the product of the argument over all processes and return the result in\n every process....\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mpicommunication.hh:224\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\bP_\bI_\bF_\bu_\bt_\bu_\br_\be\n-Provides a future-like object for MPI communication. It contains the object\n-that will be received and...\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mpifuture.hh:93\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\bP_\bI_\bF_\bu_\bt_\bu_\br_\be_\b:_\b:_\bg_\be_\bt_\b__\bs_\be_\bn_\bd_\b__\bm_\bp_\bi_\bd_\ba_\bt_\ba\n-auto get_send_mpidata()\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mpifuture.hh:177\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\bP_\bI_\bF_\bu_\bt_\bu_\br_\be_\b:_\b:_\bg_\be_\bt_\b__\bm_\bp_\bi_\bd_\ba_\bt_\ba\n-auto get_mpidata()\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mpifuture.hh:173\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn communication.hh:208\n+_\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\bb_\br_\bo_\ba_\bd_\bc_\ba_\bs_\bt\n+int broadcast(T *inout, int len, int root) const\n+Distribute an array from the process with rank root to all other processes.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn communication.hh:284\n+_\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\br_\br_\be_\bc_\bv\n+T rrecv(T &&data, int source_rank, int tag, void *status=0) const\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn communication.hh:177\n+_\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\bi_\bs_\bc_\ba_\bt_\bt_\be_\br\n+PseudoFuture< TOUT > iscatter(TIN &&data_in, TOUT &&data_out, int root)\n+Scatter array from a root to all other task nonblocking.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn communication.hh:387\n+_\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\bm_\bi_\bn\n+int min(T *inout, int len) const\n+Compute the minimum over all processes for each component of an array and\n+return the result in every ...\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn communication.hh:239\n+_\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\bb_\ba_\br_\br_\bi_\be_\br\n+int barrier() const\n+Wait until all processes have arrived at this point in the program.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn communication.hh:267\n+_\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\bi_\bg_\ba_\bt_\bh_\be_\br\n+PseudoFuture< TOUT > igather(TIN &&data_in, TOUT &&data_out, int root)\n+Gather arrays on root task nonblocking.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn communication.hh:324\n+_\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\bi_\ba_\bl_\bl_\bg_\ba_\bt_\bh_\be_\br\n+PseudoFuture< TOUT > iallgather(TIN &&data_in, TOUT &&data_out)\n+Gathers data from all tasks and distribute it to all nonblocking.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn communication.hh:445\n+_\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn\n+Communication()\n+Construct default object.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn communication.hh:103\n+_\bD_\bu_\bn_\be_\b:_\b:_\bP_\bs_\be_\bu_\bd_\bo_\bF_\bu_\bt_\bu_\br_\be\n+A wrapper-class for a object which is ready immediately.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn future.hh:124\n ===============================================================================\n Generated by\u00a0_\b[_\bd_\bo_\bx_\by_\bg_\be_\bn_\b] 1.9.8\n"}]}, {"source1": "./usr/share/doc/libdune-common-doc/doxygen/a00065.html", "source2": "./usr/share/doc/libdune-common-doc/doxygen/a00065.html", "unified_diff": "@@ -1,15 +1,15 @@\n \n \n \n \n \n \n \n-dune-common: future.hh File Reference\n+dune-common: plocalindex.hh File Reference\n \n \n \n \n \n \n \n@@ -71,44 +71,62 @@\n \n
    \n
    \n
    \n \n-
    future.hh File Reference
    \n+Namespaces |\n+Functions
    \n+ \n \n
    \n-
    #include <memory>
    \n-#include <type_traits>
    \n-#include <dune/common/exceptions.hh>
    \n+\n+

    Provides classes for use as the local index in ParallelIndexSet for distributed computing. \n+More...

    \n+
    #include <iostream>
    \n+#include <mpi.h>
    \n+#include <dune/common/parallel/indexset.hh>
    \n+#include <dune/common/parallel/localindex.hh>
    \n+#include <dune/common/parallel/mpitraits.hh>
    \n
    \n

    Go to the source code of this file.

    \n \n \n-\n-\n-\n-\n-\n+\n+\n \n-\n-\n+\n \n-\n+\n \n

    \n Classes

    class  Dune::InvalidFutureException
     This exception is thrown when ready(), wait() or get() is called on an invalid future. A future is valid until get() is called and if it is not default-constructed and it was not moved from. More...
     
    class  Dune::Future< T >
     Type-erasure for future-like objects. A future-like object is a object satisfying the interface of FutureBase. More...
    class  Dune::ParallelLocalIndex< T >
     An index present on the local process with an additional attribute flag. More...
     
    class  Dune::PseudoFuture< T >
     A wrapper-class for a object which is ready immediately. More...
    struct  Dune::LocalIndexComparator< ParallelLocalIndex< T > >
     
    class  Dune::PseudoFuture< void >
    class  Dune::MPITraits< ParallelLocalIndex< T > >
     
    \n \n \n \n \n+

    \n Namespaces

    namespace  Dune
     Dune namespace.
     
    \n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n

    \n+Functions

    template<class T >
    std::ostream & Dune::operator<< (std::ostream &os, const ParallelLocalIndex< T > &index)
     Print the local index to a stream.
     
    template<typename T >
    bool Dune::operator== (const ParallelLocalIndex< T > &p1, const ParallelLocalIndex< T > &p2)
     
    template<typename T >
    bool Dune::operator!= (const ParallelLocalIndex< T > &p1, const ParallelLocalIndex< T > &p2)
     
    \n-
    \n+

    Detailed Description

    \n+

    Provides classes for use as the local index in ParallelIndexSet for distributed computing.

    \n+
    Author
    Markus Blatt
    \n+
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,34 +1,52 @@\n dune-common\u00a02.10\n Loading...\n Searching...\n No Matches\n * _\bd_\bu_\bn_\be\n * _\bc_\bo_\bm_\bm_\bo_\bn\n * _\bp_\ba_\br_\ba_\bl_\bl_\be_\bl\n-_\bC_\bl_\ba_\bs_\bs_\be_\bs | _\bN_\ba_\bm_\be_\bs_\bp_\ba_\bc_\be_\bs\n-future.hh File Reference\n-#include \n-#include \n-#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\be_\bx_\bc_\be_\bp_\bt_\bi_\bo_\bn_\bs_\b._\bh_\bh>\n+_\bC_\bl_\ba_\bs_\bs_\be_\bs | _\bN_\ba_\bm_\be_\bs_\bp_\ba_\bc_\be_\bs | _\bF_\bu_\bn_\bc_\bt_\bi_\bo_\bn_\bs\n+plocalindex.hh File Reference\n+_\bC_\bo_\bm_\bm_\bo_\bn \u00bb _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\b _\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn \u00bb _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\b _\bC_\bo_\bm_\bp_\bu_\bt_\bi_\bn_\bg_\b _\bb_\ba_\bs_\be_\bd_\b _\bo_\bn_\b _\bI_\bn_\bd_\be_\bx_\bs_\be_\bt_\bs\n+Provides classes for use as the local index in ParallelIndexSet for distributed\n+computing. _\bM_\bo_\br_\be_\b._\b._\b.\n+#include \n+#include \n+#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bp_\ba_\br_\ba_\bl_\bl_\be_\bl_\b/_\bi_\bn_\bd_\be_\bx_\bs_\be_\bt_\b._\bh_\bh>\n+#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bp_\ba_\br_\ba_\bl_\bl_\be_\bl_\b/_\bl_\bo_\bc_\ba_\bl_\bi_\bn_\bd_\be_\bx_\b._\bh_\bh>\n+#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bp_\ba_\br_\ba_\bl_\bl_\be_\bl_\b/_\bm_\bp_\bi_\bt_\br_\ba_\bi_\bt_\bs_\b._\bh_\bh>\n _\bG_\bo_\b _\bt_\bo_\b _\bt_\bh_\be_\b _\bs_\bo_\bu_\br_\bc_\be_\b _\bc_\bo_\bd_\be_\b _\bo_\bf_\b _\bt_\bh_\bi_\bs_\b _\bf_\bi_\bl_\be_\b.\n C\bCl\bla\bas\bss\bse\bes\bs\n-class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bv_\ba_\bl_\bi_\bd_\bF_\bu_\bt_\bu_\br_\be_\bE_\bx_\bc_\be_\bp_\bt_\bi_\bo_\bn\n- This exception is thrown when ready(), wait() or _\bg_\be_\bt_\b(_\b) is called on an\n-\u00a0 invalid future. A future is valid until _\bg_\be_\bt_\b(_\b) is called and if it is\n- not default-constructed and it was not moved from. _\bM_\bo_\br_\be_\b._\b._\b.\n-\u00a0\n-class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bF_\bu_\bt_\bu_\br_\be_\b<_\b _\bT_\b _\b>\n-\u00a0 Type-erasure for future-like objects. A future-like object is a object\n- satisfying the interface of FutureBase. _\bM_\bo_\br_\be_\b._\b._\b.\n+ class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bL_\bo_\bc_\ba_\bl_\bI_\bn_\bd_\be_\bx_\b<_\b _\bT_\b _\b>\n+\u00a0 An index present on the local process with an additional attribute\n+ flag. _\bM_\bo_\br_\be_\b._\b._\b.\n \u00a0\n-class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bP_\bs_\be_\bu_\bd_\bo_\bF_\bu_\bt_\bu_\br_\be_\b<_\b _\bT_\b _\b>\n-\u00a0 A wrapper-class for a object which is ready immediately. _\bM_\bo_\br_\be_\b._\b._\b.\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bL_\bo_\bc_\ba_\bl_\bI_\bn_\bd_\be_\bx_\bC_\bo_\bm_\bp_\ba_\br_\ba_\bt_\bo_\br_\b<_\b _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bL_\bo_\bc_\ba_\bl_\bI_\bn_\bd_\be_\bx_\b<_\b _\bT_\b _\b>_\b _\b>\n \u00a0\n-class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bP_\bs_\be_\bu_\bd_\bo_\bF_\bu_\bt_\bu_\br_\be_\b<_\b _\bv_\bo_\bi_\bd_\b _\b>\n+ class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bM_\bP_\bI_\bT_\br_\ba_\bi_\bt_\bs_\b<_\b _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bL_\bo_\bc_\ba_\bl_\bI_\bn_\bd_\be_\bx_\b<_\b _\bT_\b _\b>_\b _\b>\n \u00a0\n N\bNa\bam\bme\bes\bsp\bpa\bac\bce\bes\bs\n namespace \u00a0 _\bD_\bu_\bn_\be\n \u00a0 _\bD_\bu_\bn_\be namespace.\n \u00a0\n+F\bFu\bun\bnc\bct\bti\bio\bon\bns\bs\n+template\n+std::ostream &\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b<_\b< (std::ostream &os, const _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bL_\bo_\bc_\ba_\bl_\bI_\bn_\bd_\be_\bx< T\n+ > &index)\n+\u00a0 Print the local index to a stream.\n+\u00a0\n+template\n+ bool\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b=_\b= (const _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bL_\bo_\bc_\ba_\bl_\bI_\bn_\bd_\be_\bx< T > &p1, const\n+ _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bL_\bo_\bc_\ba_\bl_\bI_\bn_\bd_\be_\bx< T > &p2)\n+\u00a0\n+template\n+ bool\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b!_\b= (const _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bL_\bo_\bc_\ba_\bl_\bI_\bn_\bd_\be_\bx< T > &p1, const\n+ _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bL_\bo_\bc_\ba_\bl_\bI_\bn_\bd_\be_\bx< T > &p2)\n+\u00a0\n+*\b**\b**\b**\b**\b* D\bDe\bet\bta\bai\bil\ble\bed\bd D\bDe\bes\bsc\bcr\bri\bip\bpt\bti\bio\bon\bn *\b**\b**\b**\b**\b*\n+Provides classes for use as the local index in ParallelIndexSet for distributed\n+computing.\n+ Author\n+ Markus Blatt\n ===============================================================================\n Generated by\u00a0_\b[_\bd_\bo_\bx_\by_\bg_\be_\bn_\b] 1.9.8\n"}]}, {"source1": "./usr/share/doc/libdune-common-doc/doxygen/a00065_source.html", "source2": "./usr/share/doc/libdune-common-doc/doxygen/a00065_source.html", "unified_diff": "@@ -1,15 +1,15 @@\n \n \n \n \n \n \n \n-dune-common: future.hh Source File\n+dune-common: plocalindex.hh Source File\n \n \n \n \n \n \n \n@@ -74,252 +74,305 @@\n \n \n \n
    \n-
    future.hh
    \n+
    plocalindex.hh
    \n
    \n
    \n Go to the documentation of this file.
    1// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
    \n
    2// vi: set et ts=4 sw=2 sts=2:
    \n
    3// SPDX-FileCopyrightInfo: Copyright \u00a9 DUNE Project contributors, see file LICENSE.md in module root
    \n
    4// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception
    \n-
    5#ifndef DUNE_COMMON_PARALLEL_FUTURE_HH
    \n-
    6#define DUNE_COMMON_PARALLEL_FUTURE_HH
    \n+
    5#ifndef DUNE_COMMON_PARALLEL_PLOCALINDEX_HH
    \n+
    6#define DUNE_COMMON_PARALLEL_PLOCALINDEX_HH
    \n
    7
    \n-
    8#include <memory>
    \n-
    9#include <type_traits>
    \n-
    10
    \n-\n-
    12
    \n-
    13namespace Dune{
    \n-
    14
    \n-
    \n-\n-
    20 {};
    \n-
    \n+
    8#include <iostream>
    \n+
    9
    \n+
    10#if HAVE_MPI
    \n+
    11#include <mpi.h>
    \n+
    12#endif
    \n+
    13
    \n+\n+\n+\n+
    17
    \n+
    18namespace Dune
    \n+
    19{
    \n+
    20
    \n
    21
    \n-
    22 // forward declaration
    \n-
    23 template<class T>
    \n-
    24 class PseudoFuture;
    \n-
    25
    \n-
    29 template<class T>
    \n-
    \n-
    30 class Future{
    \n-
    31 // Future interface:
    \n-
    32 class FutureBase{
    \n-
    33 public:
    \n-
    34 virtual ~FutureBase() = default;
    \n-
    35 virtual void wait() = 0;
    \n-
    36 virtual bool ready() const = 0;
    \n-
    37 virtual bool valid() const = 0;
    \n-
    38 virtual T get() = 0;
    \n-
    39 };
    \n-
    40
    \n-
    41 // model class
    \n-
    42 template<class F>
    \n-
    43 class FutureModel
    \n-
    44 : public FutureBase
    \n-
    45 {
    \n-
    46 F _future;
    \n-
    47 public:
    \n-
    48 FutureModel(F&& f)
    \n-
    49 : _future(std::forward<F>(f))
    \n-
    50 {}
    \n-
    51
    \n-
    52 virtual void wait() override
    \n-
    53 {
    \n-
    54 _future.wait();
    \n-
    55 }
    \n-
    56
    \n-
    57 virtual bool ready() const override
    \n-
    58 {
    \n-
    59 return _future.ready();
    \n-
    60 }
    \n-
    61
    \n-
    62 virtual bool valid() const override
    \n-
    63 {
    \n-
    64 return _future.valid();
    \n-
    65 }
    \n-
    66
    \n-
    67 virtual T get() override{
    \n-
    68 return (T)_future.get();
    \n-
    69 }
    \n-
    70 };
    \n-
    71
    \n-
    72 std::unique_ptr<FutureBase> _future;
    \n-
    73 public:
    \n-
    74 template<class F>
    \n-
    \n-
    75 Future(F&& f)
    \n-
    76 : _future(std::make_unique<FutureModel<F>>(std::forward<F>(f)))
    \n-
    77 {}
    \n-
    \n-
    78
    \n-
    79 template<class U, std::enable_if_t<std::is_same<U,T>::value && !std::is_same<T,void>::value>>
    \n-
    \n-
    80 Future(U&& data)
    \n-
    81 : _future(std::make_unique<FutureModel<PseudoFuture<T>>>(PseudoFuture<T>(std::forward<U>(data))))
    \n-
    82 {}
    \n-
    \n-
    83
    \n-
    84 Future() = default;
    \n-
    85
    \n-
    \n-
    89 void wait(){
    \n-
    90 _future->wait();
    \n-
    91 }
    \n-
    \n-
    92
    \n-
    \n-
    97 T get() {
    \n-
    98 return _future->get();
    \n-
    99 }
    \n-
    \n-
    100
    \n-
    \n-
    105 bool ready() const {
    \n-
    106 return _future->ready();
    \n-
    107 }
    \n-
    \n-
    108
    \n-
    \n-
    114 bool valid() const {
    \n-
    115 if(_future)
    \n-
    116 return _future->valid();
    \n-
    117 return false;
    \n-
    118 }
    \n-
    \n-
    119 };
    \n-
    \n-
    120
    \n-
    123 template<class T>
    \n-
    \n-\n-
    125 bool valid_;
    \n-
    126 T data_;
    \n-
    127 public:
    \n-
    \n-\n-
    129 valid_(false)
    \n-
    130 {}
    \n-
    \n-
    131
    \n-
    132 template<class U>
    \n-
    \n-\n-
    134 valid_(true),
    \n-
    135 data_(std::forward<U>(u))
    \n-
    136 {}
    \n-
    \n-
    137
    \n-
    \n-
    138 void wait() {
    \n-
    139 if(!valid_)
    \n-
    140 DUNE_THROW(InvalidFutureException, "The PseudoFuture is not valid");
    \n-
    141 }
    \n-
    \n+
    32 template<class T> class ParallelLocalIndex;
    \n+
    33
    \n+
    39 template<class T>
    \n+
    \n+
    40 std::ostream& operator<<(std::ostream& os, const ParallelLocalIndex<T>& index)
    \n+
    41 {
    \n+
    42 os<<"{local="<<index.localIndex_<<", attr="<<T(index.attribute_)<<", public="
    \n+
    43 <<(index.public_ ? true : false)<<"}";
    \n+
    44 return os;
    \n+
    45 }
    \n+
    \n+
    46
    \n+
    50 template<typename T>
    \n+
    \n+\n+
    52 {
    \n+
    53#if HAVE_MPI
    \n+
    54 // friend declaration needed for MPITraits
    \n+
    55 friend struct MPITraits<ParallelLocalIndex<T> >;
    \n+
    56#endif
    \n+
    57 friend std::ostream& operator<< <>(std::ostream& os, const ParallelLocalIndex<T>& index);
    \n+
    58
    \n+
    59 public:
    \n+
    67 typedef T Attribute;
    \n+\n+
    77
    \n+
    86 ParallelLocalIndex(size_t localIndex, const Attribute& attribute, bool isPublic=true);
    \n+\n+
    93
    \n+
    94#if 0
    \n+\n+
    105#endif
    \n+
    106
    \n+
    111 inline const Attribute attribute() const;
    \n+
    112
    \n+
    117 inline void setAttribute(const Attribute& attribute);
    \n+
    118
    \n+
    123 inline size_t local() const;
    \n+
    124
    \n+
    128 inline operator size_t() const;
    \n+
    129
    \n+
    135 inline ParallelLocalIndex<Attribute>& operator=(size_t index);
    \n+
    136
    \n+
    141 inline bool isPublic() const;
    \n
    142
    \n-
    \n-
    143 bool ready() const {
    \n-
    144 if(!valid_)
    \n-
    145 DUNE_THROW(InvalidFutureException, "The PseudoFuture is not valid");
    \n-
    146 return true;
    \n-
    147 }
    \n-
    \n+
    147 inline LocalIndexState state() const;
    \n
    148
    \n-
    \n-
    149 T get() {
    \n-
    150 if(!valid_)
    \n-
    151 DUNE_THROW(InvalidFutureException, "The PseudoFuture is not valid");
    \n-
    152 valid_ = false;
    \n-
    153 return std::forward<T>(data_);
    \n-
    154 }
    \n-
    \n-
    155
    \n-
    \n-
    156 bool valid() const {
    \n-
    157 return valid_;
    \n-
    158 }
    \n-
    \n-
    159 };
    \n-
    \n-
    160
    \n-
    161 template<>
    \n-
    \n-
    162 class PseudoFuture<void>{
    \n-
    163 bool valid_;
    \n-
    164 public:
    \n-
    \n-
    165 PseudoFuture(bool valid = false) :
    \n-
    166 valid_(valid)
    \n-
    167 {}
    \n-
    \n-
    168
    \n-
    \n-
    169 void wait(){
    \n-
    170 if(!valid_)
    \n-
    171 DUNE_THROW(InvalidFutureException, "The PseudoFuture is not valid");
    \n-
    172 }
    \n-
    \n-
    \n-
    173 bool ready() const{
    \n-
    174 if(!valid_)
    \n-
    175 DUNE_THROW(InvalidFutureException, "The PseudoFuture is not valid");
    \n-
    176 return true;
    \n-
    177 }
    \n-
    \n-
    178
    \n-
    \n-
    179 void get(){
    \n-
    180 if(!valid_)
    \n-
    181 DUNE_THROW(InvalidFutureException, "The PseudoFuture is not valid");
    \n-
    182 valid_ = false;
    \n-
    183 }
    \n-
    \n-
    184
    \n-
    \n-
    185 bool valid() const{
    \n-
    186 return valid_;
    \n-
    187 }
    \n-
    \n-
    188 };
    \n-
    \n-
    189}
    \n-
    190
    \n-
    191#endif // DUNE_COMMON_PARALLEL_FUTURE_HH
    \n-
    A few common exception classes.
    \n-
    #define DUNE_THROW(E, m)
    Definition exceptions.hh:218
    \n-
    STL namespace.
    \n+
    153 inline void setState(const LocalIndexState& state);
    \n+
    154
    \n+
    155 private:
    \n+
    157 size_t localIndex_;
    \n+
    158
    \n+
    160 char attribute_;
    \n+
    161
    \n+
    163 char public_;
    \n+
    164
    \n+
    171 char state_;
    \n+
    172
    \n+
    173 };
    \n+
    \n+
    174
    \n+
    175 template<typename T>
    \n+
    \n+\n+
    177 const ParallelLocalIndex<T>& p2)
    \n+
    178 {
    \n+
    179 if(p1.local()!=p2.local())
    \n+
    180 return false;
    \n+
    181 if(p1.attribute()!=p2.attribute())
    \n+
    182 return false;
    \n+
    183 if(p1.isPublic()!=p2.isPublic())
    \n+
    184 return false;
    \n+
    185 return true;
    \n+
    186 }
    \n+
    \n+
    187 template<typename T>
    \n+
    \n+\n+
    189 const ParallelLocalIndex<T>& p2)
    \n+
    190 {
    \n+
    191 return !(p1==p2);
    \n+
    192 }
    \n+
    \n+
    193
    \n+
    194
    \n+
    195 template<typename T>
    \n+
    \n+\n+
    197 {
    \n+
    \n+
    198 static bool compare(const ParallelLocalIndex<T>& t1,
    \n+
    199 const ParallelLocalIndex<T>& t2){
    \n+
    200 return t1.attribute()<t2.attribute();
    \n+
    201 }
    \n+
    \n+
    202 };
    \n+
    \n+
    203
    \n+
    204
    \n+
    205#if HAVE_MPI
    \n+
    206
    \n+
    208 template<typename T>
    \n+
    \n+\n+
    210 {
    \n+
    211 public:
    \n+
    212 static MPI_Datatype getType();
    \n+
    213 private:
    \n+
    214 static MPI_Datatype type;
    \n+
    215
    \n+
    216 };
    \n+
    \n+
    217
    \n+
    218#endif
    \n+
    219
    \n+
    220 template<class T>
    \n+
    \n+
    221 ParallelLocalIndex<T>::ParallelLocalIndex(const T& attribute, bool isPublic)
    \n+
    222 : localIndex_(0), attribute_(static_cast<char>(attribute)),
    \n+
    223 public_(static_cast<char>(isPublic)), state_(static_cast<char>(VALID))
    \n+
    224 {}
    \n+
    \n+
    225
    \n+
    226
    \n+
    227 template<class T>
    \n+
    \n+
    228 ParallelLocalIndex<T>::ParallelLocalIndex(size_t local, const T& attribute, bool isPublic)
    \n+
    229 : localIndex_(local), attribute_(static_cast<char>(attribute)),
    \n+
    230 public_(static_cast<char>(isPublic)), state_(static_cast<char>(VALID))
    \n+
    231 {}
    \n+
    \n+
    232
    \n+
    233 template<class T>
    \n+
    \n+\n+
    235 : localIndex_(0), attribute_(), public_(static_cast<char>(false)),
    \n+
    236 state_(static_cast<char>(VALID))
    \n+
    237 {}
    \n+
    \n+
    238
    \n+
    239 template<class T>
    \n+
    \n+
    240 inline const T ParallelLocalIndex<T>::attribute() const
    \n+
    241 {
    \n+
    242 return T(attribute_);
    \n+
    243 }
    \n+
    \n+
    244
    \n+
    245 template<class T>
    \n+
    246 inline void
    \n+
    \n+\n+
    248 {
    \n+
    249 attribute_ = attribute;
    \n+
    250 }
    \n+
    \n+
    251
    \n+
    252 template<class T>
    \n+
    \n+
    253 inline size_t ParallelLocalIndex<T>::local() const
    \n+
    254 {
    \n+
    255 return localIndex_;
    \n+
    256 }
    \n+
    \n+
    257
    \n+
    258 template<class T>
    \n+
    \n+\n+
    260 {
    \n+
    261 return localIndex_;
    \n+
    262 }
    \n+
    \n+
    263
    \n+
    264 template<class T>
    \n+\n+
    \n+\n+
    267 {
    \n+
    268 localIndex_=index;
    \n+
    269 return *this;
    \n+
    270 }
    \n+
    \n+
    271
    \n+
    272 template<class T>
    \n+
    \n+\n+
    274 {
    \n+
    275 return static_cast<bool>(public_);
    \n+
    276 }
    \n+
    \n+
    277
    \n+
    278 template<class T>
    \n+
    \n+\n+
    280 {
    \n+
    281 return LocalIndexState(state_);
    \n+
    282 }
    \n+
    \n+
    283
    \n+
    284 template<class T>
    \n+
    \n+\n+
    286 {
    \n+
    287 state_=static_cast<char>(state);
    \n+
    288 }
    \n+
    \n+
    289
    \n+
    290#if HAVE_MPI
    \n+
    291
    \n+
    292 template<typename T>
    \n+
    \n+
    293 MPI_Datatype MPITraits<ParallelLocalIndex<T> >::getType()
    \n+
    294 {
    \n+
    295
    \n+
    296 if(type==MPI_DATATYPE_NULL) {
    \n+
    297 int length = 1;
    \n+
    298 MPI_Aint base, disp;
    \n+
    299 MPI_Datatype types[1] = {MPITraits<char>::getType()};
    \n+\n+
    301 MPI_Get_address(&rep, &base);
    \n+
    302 MPI_Get_address(&(rep.attribute_), &disp);
    \n+
    303 disp -= base;
    \n+
    304
    \n+
    305 MPI_Datatype tmp;
    \n+
    306 MPI_Type_create_struct(1, &length, &disp, types, &tmp);
    \n+
    307
    \n+
    308 MPI_Type_create_resized(tmp, 0, sizeof(ParallelLocalIndex<T>), &type);
    \n+
    309 MPI_Type_commit(&type);
    \n+
    310
    \n+
    311 MPI_Type_free(&tmp);
    \n+
    312 }
    \n+
    313 return type;
    \n+
    314 }
    \n+
    \n+
    315
    \n+
    316 template<typename T>
    \n+
    317 MPI_Datatype MPITraits<ParallelLocalIndex<T> >::type = MPI_DATATYPE_NULL;
    \n+
    318
    \n+
    319#endif // HAVE_MPI
    \n+
    320
    \n+
    321
    \n+
    323} // namespace Dune
    \n+
    324
    \n+
    325#endif // DUNE_COMMON_PARALLEL_PLOCALINDEX_HH
    \n+
    Provides a map between global and local indices.
    \n+
    Provides classes for use as the local index in ParallelIndexSet.
    \n+
    Traits classes for mapping types onto MPI_Datatype.
    \n+
    std::ostream & operator<<(std::ostream &s, const bigunsignedint< k > &x)
    Definition bigunsignedint.hh:278
    \n+
    EnableIfInterOperable< T1, T2, bool >::type operator==(const ForwardIteratorFacade< T1, V1, R1, D > &lhs, const ForwardIteratorFacade< T2, V2, R2, D > &rhs)
    Checks for equality.
    Definition iteratorfacades.hh:238
    \n+
    EnableIfInterOperable< T1, T2, bool >::type operator!=(const ForwardIteratorFacade< T1, V1, R1, D > &lhs, const ForwardIteratorFacade< T2, V2, R2, D > &rhs)
    Checks for inequality.
    Definition iteratorfacades.hh:260
    \n+
    bool isPublic() const
    Check whether the index might also be known other processes.
    Definition plocalindex.hh:273
    \n+
    void setAttribute(const Attribute &attribute)
    Set the attribute of the index.
    Definition plocalindex.hh:247
    \n+
    size_t local() const
    get the local index.
    Definition plocalindex.hh:253
    \n+
    LocalIndexState
    The states available for the local indices.
    Definition localindex.hh:28
    \n+
    void setState(const LocalIndexState &state)
    Set the state.
    Definition plocalindex.hh:285
    \n+
    ParallelLocalIndex< Attribute > & operator=(size_t index)
    Assign a new local index.
    Definition plocalindex.hh:266
    \n+
    LocalIndexState state() const
    Get the state.
    Definition plocalindex.hh:279
    \n+
    ParallelLocalIndex()
    Parameterless constructor.
    Definition plocalindex.hh:234
    \n+
    const Attribute attribute() const
    Get the attribute of the index.
    Definition plocalindex.hh:240
    \n+
    @ VALID
    Definition localindex.hh:28
    \n
    Dune namespace.
    Definition alignedallocator.hh:13
    \n-
    constexpr auto get(std::integer_sequence< T, II... >, std::integral_constant< std::size_t, pos >={})
    Return the entry at position pos of the given sequence.
    Definition integersequence.hh:22
    \n-
    Default exception if a function was called while the object is not in a valid state for that function...
    Definition exceptions.hh:281
    \n-
    This exception is thrown when ready(), wait() or get() is called on an invalid future....
    Definition future.hh:20
    \n-
    A wrapper-class for a object which is ready immediately.
    Definition future.hh:124
    \n-
    bool ready() const
    Definition future.hh:143
    \n-
    T get()
    Definition future.hh:149
    \n-
    PseudoFuture(U &&u)
    Definition future.hh:133
    \n-
    PseudoFuture()
    Definition future.hh:128
    \n-
    void wait()
    Definition future.hh:138
    \n-
    bool valid() const
    Definition future.hh:156
    \n-
    Type-erasure for future-like objects. A future-like object is a object satisfying the interface of Fu...
    Definition future.hh:30
    \n-
    bool ready() const
    Definition future.hh:105
    \n-
    void wait()
    wait until the future is ready
    Definition future.hh:89
    \n-
    Future(U &&data)
    Definition future.hh:80
    \n-
    T get()
    Waits until the future is ready and returns the resulting value.
    Definition future.hh:97
    \n-
    Future()=default
    \n-
    bool valid() const
    Checks whether the future is valid. I.e. \u2018get()\u2019 was not called on that future and when it was not de...
    Definition future.hh:114
    \n-
    Future(F &&f)
    Definition future.hh:75
    \n-
    bool ready() const
    Definition future.hh:173
    \n-
    bool valid() const
    Definition future.hh:185
    \n-
    void get()
    Definition future.hh:179
    \n-
    PseudoFuture(bool valid=false)
    Definition future.hh:165
    \n-
    void wait()
    Definition future.hh:169
    \n+
    A traits class describing the mapping of types onto MPI_Datatypes.
    Definition mpitraits.hh:41
    \n+
    static MPI_Datatype getType()
    Definition mpitraits.hh:48
    \n+
    Definition indexset.hh:615
    \n+
    An index present on the local process with an additional attribute flag.
    Definition plocalindex.hh:52
    \n+
    T Attribute
    The type of the attributes. Normally this will be an enumeration like.
    Definition plocalindex.hh:67
    \n+
    static bool compare(const ParallelLocalIndex< T > &t1, const ParallelLocalIndex< T > &t2)
    Definition plocalindex.hh:198
    \n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,267 +1,328 @@\n dune-common\u00a02.10\n Loading...\n Searching...\n No Matches\n * _\bd_\bu_\bn_\be\n * _\bc_\bo_\bm_\bm_\bo_\bn\n * _\bp_\ba_\br_\ba_\bl_\bl_\be_\bl\n-future.hh\n+plocalindex.hh\n _\bG_\bo_\b _\bt_\bo_\b _\bt_\bh_\be_\b _\bd_\bo_\bc_\bu_\bm_\be_\bn_\bt_\ba_\bt_\bi_\bo_\bn_\b _\bo_\bf_\b _\bt_\bh_\bi_\bs_\b _\bf_\bi_\bl_\be_\b.\n 1// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-\n 2// vi: set et ts=4 sw=2 sts=2:\n 3// SPDX-FileCopyrightInfo: Copyright \u00c2\u00a9 DUNE Project contributors, see file\n LICENSE.md in module root\n 4// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception\n-5#ifndef DUNE_COMMON_PARALLEL_FUTURE_HH\n-6#define DUNE_COMMON_PARALLEL_FUTURE_HH\n+5#ifndef DUNE_COMMON_PARALLEL_PLOCALINDEX_HH\n+6#define DUNE_COMMON_PARALLEL_PLOCALINDEX_HH\n 7\n-8#include \n-9#include \n-10\n-11#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\be_\bx_\bc_\be_\bp_\bt_\bi_\bo_\bn_\bs_\b._\bh_\bh>\n-12\n-13namespace _\bD_\bu_\bn_\be{\n-14\n-_\b1_\b9 class _\bI_\bn_\bv_\ba_\bl_\bi_\bd_\bF_\bu_\bt_\bu_\br_\be_\bE_\bx_\bc_\be_\bp_\bt_\bi_\bo_\bn : public _\bI_\bn_\bv_\ba_\bl_\bi_\bd_\bS_\bt_\ba_\bt_\be_\bE_\bx_\bc_\be_\bp_\bt_\bi_\bo_\bn\n-20 {};\n+8#include \n+9\n+10#if HAVE_MPI\n+11#include \n+12#endif\n+13\n+14#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bp_\ba_\br_\ba_\bl_\bl_\be_\bl_\b/_\bi_\bn_\bd_\be_\bx_\bs_\be_\bt_\b._\bh_\bh>\n+15#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bp_\ba_\br_\ba_\bl_\bl_\be_\bl_\b/_\bl_\bo_\bc_\ba_\bl_\bi_\bn_\bd_\be_\bx_\b._\bh_\bh>\n+16#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bp_\ba_\br_\ba_\bl_\bl_\be_\bl_\b/_\bm_\bp_\bi_\bt_\br_\ba_\bi_\bt_\bs_\b._\bh_\bh>\n+17\n+18namespace _\bD_\bu_\bn_\be\n+19{\n+20\n 21\n-22 // forward declaration\n-23 template\n-24 class _\bP_\bs_\be_\bu_\bd_\bo_\bF_\bu_\bt_\bu_\br_\be;\n-25\n-29 template\n-_\b3_\b0 class _\bF_\bu_\bt_\bu_\br_\be{\n-31 // Future interface:\n-32 class FutureBase{\n-33 public:\n-34 virtual ~FutureBase() = default;\n-35 virtual void wait() = 0;\n-36 virtual bool ready() const = 0;\n-37 virtual bool valid() const = 0;\n-38 virtual T _\bg_\be_\bt() = 0;\n-39 };\n-40\n-41 // model class\n-42 template\n-43 class FutureModel\n-44 : public FutureBase\n-45 {\n-46 F _future;\n-47 public:\n-48 FutureModel(F&& f)\n-49 : _future(std::forward(f))\n-50 {}\n-51\n-52 virtual void wait() override\n-53 {\n-54 _future.wait();\n-55 }\n-56\n-57 virtual bool ready() const override\n-58 {\n-59 return _future.ready();\n-60 }\n-61\n-62 virtual bool valid() const override\n-63 {\n-64 return _future.valid();\n-65 }\n-66\n-67 virtual T _\bg_\be_\bt() override{\n-68 return (T)_future.get();\n-69 }\n-70 };\n-71\n-72 std::unique_ptr _future;\n-73 public:\n-74 template\n-_\b7_\b5 _\bF_\bu_\bt_\bu_\br_\be(F&& f)\n-76 : _future(_\bs_\bt_\bd::make_unique>(_\bs_\bt_\bd::forward(f)))\n-77 {}\n-78\n-79 template::value && !std::\n-is_same::value>>\n-_\b8_\b0 _\bF_\bu_\bt_\bu_\br_\be(U&& data)\n-81 : _future(_\bs_\bt_\bd::make_unique>>(_\bP_\bs_\be_\bu_\bd_\bo_\bF_\bu_\bt_\bu_\br_\be\n-(_\bs_\bt_\bd::forward(data))))\n-82 {}\n-83\n-_\b8_\b4 _\bF_\bu_\bt_\bu_\br_\be() = default;\n-85\n-_\b8_\b9 void _\bw_\ba_\bi_\bt(){\n-90 _future->wait();\n-91 }\n-92\n-_\b9_\b7 T _\bg_\be_\bt() {\n-98 return _future->get();\n-99 }\n-100\n-_\b1_\b0_\b5 bool _\br_\be_\ba_\bd_\by() const {\n-106 return _future->ready();\n-107 }\n-108\n-_\b1_\b1_\b4 bool _\bv_\ba_\bl_\bi_\bd() const {\n-115 if(_future)\n-116 return _future->valid();\n-117 return false;\n-118 }\n-119 };\n-120\n-123 template\n-_\b1_\b2_\b4 class _\bP_\bs_\be_\bu_\bd_\bo_\bF_\bu_\bt_\bu_\br_\be{\n-125 bool valid_;\n-126 T data_;\n-127 public:\n-_\b1_\b2_\b8 _\bP_\bs_\be_\bu_\bd_\bo_\bF_\bu_\bt_\bu_\br_\be() :\n-129 valid_(false)\n-130 {}\n-131\n-132 template\n-_\b1_\b3_\b3 _\bP_\bs_\be_\bu_\bd_\bo_\bF_\bu_\bt_\bu_\br_\be(U&& u) :\n-134 valid_(true),\n-135 data_(_\bs_\bt_\bd::forward(u))\n-136 {}\n-137\n-_\b1_\b3_\b8 void _\bw_\ba_\bi_\bt() {\n-139 if(!valid_)\n-140 _\bD_\bU_\bN_\bE_\b__\bT_\bH_\bR_\bO_\bW(_\bI_\bn_\bv_\ba_\bl_\bi_\bd_\bF_\bu_\bt_\bu_\br_\be_\bE_\bx_\bc_\be_\bp_\bt_\bi_\bo_\bn, \"The PseudoFuture is not valid\");\n-141 }\n+32 template class ParallelLocalIndex;\n+33\n+39 template\n+_\b4_\b0 std::ostream& _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b<_\b<(std::ostream& os, const _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bL_\bo_\bc_\ba_\bl_\bI_\bn_\bd_\be_\bx_\b<_\bT_\b>&\n+index)\n+41 {\n+42 os<<\"{local=\"<\n+_\b5_\b1 class _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bL_\bo_\bc_\ba_\bl_\bI_\bn_\bd_\be_\bx\n+52 {\n+53#if HAVE_MPI\n+54 // friend declaration needed for MPITraits\n+55 friend struct _\bM_\bP_\bI_\bT_\br_\ba_\bi_\bt_\bs<_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bL_\bo_\bc_\ba_\bl_\bI_\bn_\bd_\be_\bx >;\n+56#endif\n+57 friend std::ostream& operator<< <>(std::ostream& os, const\n+_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bL_\bo_\bc_\ba_\bl_\bI_\bn_\bd_\be_\bx_\b<_\bT_\b>& index);\n+58\n+59 public:\n+_\b6_\b7 typedef T _\bA_\bt_\bt_\br_\bi_\bb_\bu_\bt_\be;\n+76 _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bL_\bo_\bc_\ba_\bl_\bI_\bn_\bd_\be_\bx(const _\bA_\bt_\bt_\br_\bi_\bb_\bu_\bt_\be& _\ba_\bt_\bt_\br_\bi_\bb_\bu_\bt_\be, bool _\bi_\bs_\bP_\bu_\bb_\bl_\bi_\bc);\n+77\n+86 _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bL_\bo_\bc_\ba_\bl_\bI_\bn_\bd_\be_\bx(size_t localIndex, const _\bA_\bt_\bt_\br_\bi_\bb_\bu_\bt_\be& _\ba_\bt_\bt_\br_\bi_\bb_\bu_\bt_\be, bool\n+_\bi_\bs_\bP_\bu_\bb_\bl_\bi_\bc=true);\n+92 _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bL_\bo_\bc_\ba_\bl_\bI_\bn_\bd_\be_\bx();\n+93\n+94#if 0\n+104 _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bL_\bo_\bc_\ba_\bl_\bI_\bn_\bd_\be_\bx(const _\bA_\bt_\bt_\br_\bi_\bb_\bu_\bt_\be& _\ba_\bt_\bt_\br_\bi_\bb_\bu_\bt_\be, size_t _\bl_\bo_\bc_\ba_\bl, bool\n+_\bi_\bs_\bP_\bu_\bb_\bl_\bi_\bc);\n+105#endif\n+106\n+111 inline const _\bA_\bt_\bt_\br_\bi_\bb_\bu_\bt_\be _\ba_\bt_\bt_\br_\bi_\bb_\bu_\bt_\be() const;\n+112\n+117 inline void _\bs_\be_\bt_\bA_\bt_\bt_\br_\bi_\bb_\bu_\bt_\be(const _\bA_\bt_\bt_\br_\bi_\bb_\bu_\bt_\be& _\ba_\bt_\bt_\br_\bi_\bb_\bu_\bt_\be);\n+118\n+123 inline size_t _\bl_\bo_\bc_\ba_\bl() const;\n+124\n+128 inline operator size_t() const;\n+129\n+135 inline _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bL_\bo_\bc_\ba_\bl_\bI_\bn_\bd_\be_\bx_\b<_\bA_\bt_\bt_\br_\bi_\bb_\bu_\bt_\be_\b>& _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b=(size_t index);\n+136\n+141 inline bool _\bi_\bs_\bP_\bu_\bb_\bl_\bi_\bc() const;\n 142\n-_\b1_\b4_\b3 bool _\br_\be_\ba_\bd_\by() const {\n-144 if(!valid_)\n-145 _\bD_\bU_\bN_\bE_\b__\bT_\bH_\bR_\bO_\bW(_\bI_\bn_\bv_\ba_\bl_\bi_\bd_\bF_\bu_\bt_\bu_\br_\be_\bE_\bx_\bc_\be_\bp_\bt_\bi_\bo_\bn, \"The PseudoFuture is not valid\");\n-146 return true;\n-147 }\n+147 inline _\bL_\bo_\bc_\ba_\bl_\bI_\bn_\bd_\be_\bx_\bS_\bt_\ba_\bt_\be _\bs_\bt_\ba_\bt_\be() const;\n 148\n-_\b1_\b4_\b9 T _\bg_\be_\bt() {\n-150 if(!valid_)\n-151 _\bD_\bU_\bN_\bE_\b__\bT_\bH_\bR_\bO_\bW(_\bI_\bn_\bv_\ba_\bl_\bi_\bd_\bF_\bu_\bt_\bu_\br_\be_\bE_\bx_\bc_\be_\bp_\bt_\bi_\bo_\bn, \"The PseudoFuture is not valid\");\n-152 valid_ = false;\n-153 return std::forward(data_);\n-154 }\n-155\n-_\b1_\b5_\b6 bool _\bv_\ba_\bl_\bi_\bd() const {\n-157 return valid_;\n-158 }\n-159 };\n-160\n-161 template<>\n-_\b1_\b6_\b2 class _\bP_\bs_\be_\bu_\bd_\bo_\bF_\bu_\bt_\bu_\br_\be{\n-163 bool valid_;\n-164 public:\n-_\b1_\b6_\b5 _\bP_\bs_\be_\bu_\bd_\bo_\bF_\bu_\bt_\bu_\br_\be(bool _\bv_\ba_\bl_\bi_\bd = false) :\n-166 valid_(_\bv_\ba_\bl_\bi_\bd)\n-167 {}\n-168\n-_\b1_\b6_\b9 void _\bw_\ba_\bi_\bt(){\n-170 if(!valid_)\n-171 _\bD_\bU_\bN_\bE_\b__\bT_\bH_\bR_\bO_\bW(_\bI_\bn_\bv_\ba_\bl_\bi_\bd_\bF_\bu_\bt_\bu_\br_\be_\bE_\bx_\bc_\be_\bp_\bt_\bi_\bo_\bn, \"The PseudoFuture is not valid\");\n-172 }\n-_\b1_\b7_\b3 bool _\br_\be_\ba_\bd_\by() const{\n-174 if(!valid_)\n-175 _\bD_\bU_\bN_\bE_\b__\bT_\bH_\bR_\bO_\bW(_\bI_\bn_\bv_\ba_\bl_\bi_\bd_\bF_\bu_\bt_\bu_\br_\be_\bE_\bx_\bc_\be_\bp_\bt_\bi_\bo_\bn, \"The PseudoFuture is not valid\");\n-176 return true;\n-177 }\n-178\n-_\b1_\b7_\b9 void _\bg_\be_\bt(){\n-180 if(!valid_)\n-181 _\bD_\bU_\bN_\bE_\b__\bT_\bH_\bR_\bO_\bW(_\bI_\bn_\bv_\ba_\bl_\bi_\bd_\bF_\bu_\bt_\bu_\br_\be_\bE_\bx_\bc_\be_\bp_\bt_\bi_\bo_\bn, \"The PseudoFuture is not valid\");\n-182 valid_ = false;\n-183 }\n-184\n-_\b1_\b8_\b5 bool _\bv_\ba_\bl_\bi_\bd() const{\n-186 return valid_;\n-187 }\n-188 };\n-189}\n-190\n-191#endif // DUNE_COMMON_PARALLEL_FUTURE_HH\n-_\be_\bx_\bc_\be_\bp_\bt_\bi_\bo_\bn_\bs_\b._\bh_\bh\n-A few common exception classes.\n-_\bD_\bU_\bN_\bE_\b__\bT_\bH_\bR_\bO_\bW\n-#define DUNE_THROW(E, m)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn exceptions.hh:218\n-_\bs_\bt_\bd\n-STL namespace.\n+153 inline void _\bs_\be_\bt_\bS_\bt_\ba_\bt_\be(const _\bL_\bo_\bc_\ba_\bl_\bI_\bn_\bd_\be_\bx_\bS_\bt_\ba_\bt_\be& _\bs_\bt_\ba_\bt_\be);\n+154\n+155 private:\n+157 size_t localIndex_;\n+158\n+160 char attribute_;\n+161\n+163 char public_;\n+164\n+171 char state_;\n+172\n+173 };\n+174\n+175 template\n+_\b1_\b7_\b6 bool _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b=_\b=(const _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bL_\bo_\bc_\ba_\bl_\bI_\bn_\bd_\be_\bx_\b<_\bT_\b>& p1,\n+177 const _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bL_\bo_\bc_\ba_\bl_\bI_\bn_\bd_\be_\bx_\b<_\bT_\b>& p2)\n+178 {\n+179 if(p1._\bl_\bo_\bc_\ba_\bl()!=p2._\bl_\bo_\bc_\ba_\bl())\n+180 return false;\n+181 if(p1._\ba_\bt_\bt_\br_\bi_\bb_\bu_\bt_\be()!=p2._\ba_\bt_\bt_\br_\bi_\bb_\bu_\bt_\be())\n+182 return false;\n+183 if(p1._\bi_\bs_\bP_\bu_\bb_\bl_\bi_\bc()!=p2._\bi_\bs_\bP_\bu_\bb_\bl_\bi_\bc())\n+184 return false;\n+185 return true;\n+186 }\n+187 template\n+_\b1_\b8_\b8 bool _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b!_\b=(const _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bL_\bo_\bc_\ba_\bl_\bI_\bn_\bd_\be_\bx_\b<_\bT_\b>& p1,\n+189 const _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bL_\bo_\bc_\ba_\bl_\bI_\bn_\bd_\be_\bx_\b<_\bT_\b>& p2)\n+190 {\n+191 return !(p1==p2);\n+192 }\n+193\n+194\n+195 template\n+_\b1_\b9_\b6 struct _\bL_\bo_\bc_\ba_\bl_\bI_\bn_\bd_\be_\bx_\bC_\bo_\bm_\bp_\ba_\br_\ba_\bt_\bo_\br<_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bL_\bo_\bc_\ba_\bl_\bI_\bn_\bd_\be_\bx >\n+197 {\n+_\b1_\b9_\b8 static bool _\bc_\bo_\bm_\bp_\ba_\br_\be(const _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bL_\bo_\bc_\ba_\bl_\bI_\bn_\bd_\be_\bx_\b<_\bT_\b>& t1,\n+199 const _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bL_\bo_\bc_\ba_\bl_\bI_\bn_\bd_\be_\bx_\b<_\bT_\b>& t2){\n+200 return t1._\ba_\bt_\bt_\br_\bi_\bb_\bu_\bt_\be()\n+_\b2_\b0_\b9 class _\bM_\bP_\bI_\bT_\br_\ba_\bi_\bt_\bs<_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bL_\bo_\bc_\ba_\bl_\bI_\bn_\bd_\be_\bx >\n+210 {\n+211 public:\n+212 static MPI_Datatype _\bg_\be_\bt_\bT_\by_\bp_\be();\n+213 private:\n+214 static MPI_Datatype type;\n+215\n+216 };\n+217\n+218#endif\n+219\n+220 template\n+_\b2_\b2_\b1 _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bL_\bo_\bc_\ba_\bl_\bI_\bn_\bd_\be_\bx_\b<_\bT_\b>_\b:_\b:_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bL_\bo_\bc_\ba_\bl_\bI_\bn_\bd_\be_\bx(const T& attribute, bool\n+isPublic)\n+222 : localIndex_(0), attribute_(static_cast(attribute)),\n+223 public_(static_cast(isPublic)), state_(static_cast(_\bV_\bA_\bL_\bI_\bD))\n+224 {}\n+225\n+226\n+227 template\n+_\b2_\b2_\b8 _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bL_\bo_\bc_\ba_\bl_\bI_\bn_\bd_\be_\bx_\b<_\bT_\b>_\b:_\b:_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bL_\bo_\bc_\ba_\bl_\bI_\bn_\bd_\be_\bx(size_t local, const T& attribute,\n+bool isPublic)\n+229 : localIndex_(local), attribute_(static_cast(attribute)),\n+230 public_(static_cast(isPublic)), state_(static_cast(_\bV_\bA_\bL_\bI_\bD))\n+231 {}\n+232\n+233 template\n+_\b2_\b3_\b4 _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bL_\bo_\bc_\ba_\bl_\bI_\bn_\bd_\be_\bx_\b<_\bT_\b>_\b:_\b:_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bL_\bo_\bc_\ba_\bl_\bI_\bn_\bd_\be_\bx()\n+235 : localIndex_(0), attribute_(), public_(static_cast(false)),\n+236 state_(static_cast(_\bV_\bA_\bL_\bI_\bD))\n+237 {}\n+238\n+239 template\n+_\b2_\b4_\b0 inline const T _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bL_\bo_\bc_\ba_\bl_\bI_\bn_\bd_\be_\bx_\b<_\bT_\b>_\b:_\b:_\ba_\bt_\bt_\br_\bi_\bb_\bu_\bt_\be() const\n+241 {\n+242 return T(attribute_);\n+243 }\n+244\n+245 template\n+246 inline void\n+_\b2_\b4_\b7 _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bL_\bo_\bc_\ba_\bl_\bI_\bn_\bd_\be_\bx_\b<_\bT_\b>_\b:_\b:_\bs_\be_\bt_\bA_\bt_\bt_\br_\bi_\bb_\bu_\bt_\be(const _\bA_\bt_\bt_\br_\bi_\bb_\bu_\bt_\be& attribute)\n+248 {\n+249 attribute_ = attribute;\n+250 }\n+251\n+252 template\n+_\b2_\b5_\b3 inline size_t _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bL_\bo_\bc_\ba_\bl_\bI_\bn_\bd_\be_\bx_\b<_\bT_\b>_\b:_\b:_\bl_\bo_\bc_\ba_\bl() const\n+254 {\n+255 return localIndex_;\n+256 }\n+257\n+258 template\n+_\b2_\b5_\b9 inline _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bL_\bo_\bc_\ba_\bl_\bI_\bn_\bd_\be_\bx_\b<_\bT_\b>_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br size_t() const\n+260 {\n+261 return localIndex_;\n+262 }\n+263\n+264 template\n+265 inline _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bL_\bo_\bc_\ba_\bl_\bI_\bn_\bd_\be_\bx_\b<_\bT_\b>&\n+_\b2_\b6_\b6 _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bL_\bo_\bc_\ba_\bl_\bI_\bn_\bd_\be_\bx_\b<_\bT_\b>_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b=(size_t index)\n+267 {\n+268 localIndex_=index;\n+269 return *this;\n+270 }\n+271\n+272 template\n+_\b2_\b7_\b3 inline bool _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bL_\bo_\bc_\ba_\bl_\bI_\bn_\bd_\be_\bx_\b<_\bT_\b>_\b:_\b:_\bi_\bs_\bP_\bu_\bb_\bl_\bi_\bc() const\n+274 {\n+275 return static_cast(public_);\n+276 }\n+277\n+278 template\n+_\b2_\b7_\b9 inline _\bL_\bo_\bc_\ba_\bl_\bI_\bn_\bd_\be_\bx_\bS_\bt_\ba_\bt_\be _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bL_\bo_\bc_\ba_\bl_\bI_\bn_\bd_\be_\bx_\b<_\bT_\b>_\b:_\b:_\bs_\bt_\ba_\bt_\be() const\n+280 {\n+281 return _\bL_\bo_\bc_\ba_\bl_\bI_\bn_\bd_\be_\bx_\bS_\bt_\ba_\bt_\be(state_);\n+282 }\n+283\n+284 template\n+_\b2_\b8_\b5 inline void _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bL_\bo_\bc_\ba_\bl_\bI_\bn_\bd_\be_\bx_\b<_\bT_\b>_\b:_\b:_\bs_\be_\bt_\bS_\bt_\ba_\bt_\be(const _\bL_\bo_\bc_\ba_\bl_\bI_\bn_\bd_\be_\bx_\bS_\bt_\ba_\bt_\be& state)\n+286 {\n+287 state_=static_cast(state);\n+288 }\n+289\n+290#if HAVE_MPI\n+291\n+292 template\n+_\b2_\b9_\b3 MPI_Datatype _\bM_\bP_\bI_\bT_\br_\ba_\bi_\bt_\bs_\b<_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bL_\bo_\bc_\ba_\bl_\bI_\bn_\bd_\be_\bx_\b<_\bT_\b> >::getType()\n+294 {\n+295\n+296 if(type==MPI_DATATYPE_NULL) {\n+297 int length = 1;\n+298 MPI_Aint base, disp;\n+299 MPI_Datatype types[1] = {_\bM_\bP_\bI_\bT_\br_\ba_\bi_\bt_\bs_\b<_\bc_\bh_\ba_\br_\b>_\b:_\b:_\bg_\be_\bt_\bT_\by_\bp_\be()};\n+300 _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bL_\bo_\bc_\ba_\bl_\bI_\bn_\bd_\be_\bx_\b<_\bT_\b> rep;\n+301 MPI_Get_address(&rep, &base);\n+302 MPI_Get_address(&(rep.attribute_), &disp);\n+303 disp -= base;\n+304\n+305 MPI_Datatype tmp;\n+306 MPI_Type_create_struct(1, &length, &disp, types, &tmp);\n+307\n+308 MPI_Type_create_resized(tmp, 0, sizeof(_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bL_\bo_\bc_\ba_\bl_\bI_\bn_\bd_\be_\bx_\b<_\bT_\b>), &type);\n+309 MPI_Type_commit(&type);\n+310\n+311 MPI_Type_free(&tmp);\n+312 }\n+313 return type;\n+314 }\n+315\n+316 template\n+_\b3_\b1_\b7 MPI_Datatype _\bM_\bP_\bI_\bT_\br_\ba_\bi_\bt_\bs_\b<_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bL_\bo_\bc_\ba_\bl_\bI_\bn_\bd_\be_\bx_\b<_\bT_\b> >::type = MPI_DATATYPE_NULL;\n+318\n+319#endif // HAVE_MPI\n+320\n+321\n+323} // namespace Dune\n+324\n+325#endif // DUNE_COMMON_PARALLEL_PLOCALINDEX_HH\n+_\bi_\bn_\bd_\be_\bx_\bs_\be_\bt_\b._\bh_\bh\n+Provides a map between global and local indices.\n+_\bl_\bo_\bc_\ba_\bl_\bi_\bn_\bd_\be_\bx_\b._\bh_\bh\n+Provides classes for use as the local index in ParallelIndexSet.\n+_\bm_\bp_\bi_\bt_\br_\ba_\bi_\bt_\bs_\b._\bh_\bh\n+Traits classes for mapping types onto MPI_Datatype.\n+_\bD_\bu_\bn_\be_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b<_\b<\n+std::ostream & operator<<(std::ostream &s, const bigunsignedint< k > &x)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bigunsignedint.hh:278\n+_\bD_\bu_\bn_\be_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b=_\b=\n+EnableIfInterOperable< T1, T2, bool >::type operator==(const\n+ForwardIteratorFacade< T1, V1, R1, D > &lhs, const ForwardIteratorFacade< T2,\n+V2, R2, D > &rhs)\n+Checks for equality.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn iteratorfacades.hh:238\n+_\bD_\bu_\bn_\be_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b!_\b=\n+EnableIfInterOperable< T1, T2, bool >::type operator!=(const\n+ForwardIteratorFacade< T1, V1, R1, D > &lhs, const ForwardIteratorFacade< T2,\n+V2, R2, D > &rhs)\n+Checks for inequality.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn iteratorfacades.hh:260\n+_\bD_\bu_\bn_\be_\b:_\b:_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bL_\bo_\bc_\ba_\bl_\bI_\bn_\bd_\be_\bx_\b:_\b:_\bi_\bs_\bP_\bu_\bb_\bl_\bi_\bc\n+bool isPublic() const\n+Check whether the index might also be known other processes.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn plocalindex.hh:273\n+_\bD_\bu_\bn_\be_\b:_\b:_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bL_\bo_\bc_\ba_\bl_\bI_\bn_\bd_\be_\bx_\b:_\b:_\bs_\be_\bt_\bA_\bt_\bt_\br_\bi_\bb_\bu_\bt_\be\n+void setAttribute(const Attribute &attribute)\n+Set the attribute of the index.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn plocalindex.hh:247\n+_\bD_\bu_\bn_\be_\b:_\b:_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bL_\bo_\bc_\ba_\bl_\bI_\bn_\bd_\be_\bx_\b:_\b:_\bl_\bo_\bc_\ba_\bl\n+size_t local() const\n+get the local index.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn plocalindex.hh:253\n+_\bD_\bu_\bn_\be_\b:_\b:_\bL_\bo_\bc_\ba_\bl_\bI_\bn_\bd_\be_\bx_\bS_\bt_\ba_\bt_\be\n+LocalIndexState\n+The states available for the local indices.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn localindex.hh:28\n+_\bD_\bu_\bn_\be_\b:_\b:_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bL_\bo_\bc_\ba_\bl_\bI_\bn_\bd_\be_\bx_\b:_\b:_\bs_\be_\bt_\bS_\bt_\ba_\bt_\be\n+void setState(const LocalIndexState &state)\n+Set the state.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn plocalindex.hh:285\n+_\bD_\bu_\bn_\be_\b:_\b:_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bL_\bo_\bc_\ba_\bl_\bI_\bn_\bd_\be_\bx_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b=\n+ParallelLocalIndex< Attribute > & operator=(size_t index)\n+Assign a new local index.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn plocalindex.hh:266\n+_\bD_\bu_\bn_\be_\b:_\b:_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bL_\bo_\bc_\ba_\bl_\bI_\bn_\bd_\be_\bx_\b:_\b:_\bs_\bt_\ba_\bt_\be\n+LocalIndexState state() const\n+Get the state.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn plocalindex.hh:279\n+_\bD_\bu_\bn_\be_\b:_\b:_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bL_\bo_\bc_\ba_\bl_\bI_\bn_\bd_\be_\bx_\b:_\b:_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bL_\bo_\bc_\ba_\bl_\bI_\bn_\bd_\be_\bx\n+ParallelLocalIndex()\n+Parameterless constructor.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn plocalindex.hh:234\n+_\bD_\bu_\bn_\be_\b:_\b:_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bL_\bo_\bc_\ba_\bl_\bI_\bn_\bd_\be_\bx_\b:_\b:_\ba_\bt_\bt_\br_\bi_\bb_\bu_\bt_\be\n+const Attribute attribute() const\n+Get the attribute of the index.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn plocalindex.hh:240\n+_\bD_\bu_\bn_\be_\b:_\b:_\bV_\bA_\bL_\bI_\bD\n+@ VALID\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn localindex.hh:28\n _\bD_\bu_\bn_\be\n Dune namespace.\n D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn alignedallocator.hh:13\n-_\bD_\bu_\bn_\be_\b:_\b:_\bg_\be_\bt\n-constexpr auto get(std::integer_sequence< T, II... >, std::integral_constant<\n-std::size_t, pos >={})\n-Return the entry at position pos of the given sequence.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn integersequence.hh:22\n-_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bv_\ba_\bl_\bi_\bd_\bS_\bt_\ba_\bt_\be_\bE_\bx_\bc_\be_\bp_\bt_\bi_\bo_\bn\n-Default exception if a function was called while the object is not in a valid\n-state for that function...\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn exceptions.hh:281\n-_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bv_\ba_\bl_\bi_\bd_\bF_\bu_\bt_\bu_\br_\be_\bE_\bx_\bc_\be_\bp_\bt_\bi_\bo_\bn\n-This exception is thrown when ready(), wait() or get() is called on an invalid\n-future....\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn future.hh:20\n-_\bD_\bu_\bn_\be_\b:_\b:_\bP_\bs_\be_\bu_\bd_\bo_\bF_\bu_\bt_\bu_\br_\be\n-A wrapper-class for a object which is ready immediately.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn future.hh:124\n-_\bD_\bu_\bn_\be_\b:_\b:_\bP_\bs_\be_\bu_\bd_\bo_\bF_\bu_\bt_\bu_\br_\be_\b:_\b:_\br_\be_\ba_\bd_\by\n-bool ready() const\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn future.hh:143\n-_\bD_\bu_\bn_\be_\b:_\b:_\bP_\bs_\be_\bu_\bd_\bo_\bF_\bu_\bt_\bu_\br_\be_\b:_\b:_\bg_\be_\bt\n-T get()\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn future.hh:149\n-_\bD_\bu_\bn_\be_\b:_\b:_\bP_\bs_\be_\bu_\bd_\bo_\bF_\bu_\bt_\bu_\br_\be_\b:_\b:_\bP_\bs_\be_\bu_\bd_\bo_\bF_\bu_\bt_\bu_\br_\be\n-PseudoFuture(U &&u)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn future.hh:133\n-_\bD_\bu_\bn_\be_\b:_\b:_\bP_\bs_\be_\bu_\bd_\bo_\bF_\bu_\bt_\bu_\br_\be_\b:_\b:_\bP_\bs_\be_\bu_\bd_\bo_\bF_\bu_\bt_\bu_\br_\be\n-PseudoFuture()\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn future.hh:128\n-_\bD_\bu_\bn_\be_\b:_\b:_\bP_\bs_\be_\bu_\bd_\bo_\bF_\bu_\bt_\bu_\br_\be_\b:_\b:_\bw_\ba_\bi_\bt\n-void wait()\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn future.hh:138\n-_\bD_\bu_\bn_\be_\b:_\b:_\bP_\bs_\be_\bu_\bd_\bo_\bF_\bu_\bt_\bu_\br_\be_\b:_\b:_\bv_\ba_\bl_\bi_\bd\n-bool valid() const\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn future.hh:156\n-_\bD_\bu_\bn_\be_\b:_\b:_\bF_\bu_\bt_\bu_\br_\be\n-Type-erasure for future-like objects. A future-like object is a object\n-satisfying the interface of Fu...\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn future.hh:30\n-_\bD_\bu_\bn_\be_\b:_\b:_\bF_\bu_\bt_\bu_\br_\be_\b:_\b:_\br_\be_\ba_\bd_\by\n-bool ready() const\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn future.hh:105\n-_\bD_\bu_\bn_\be_\b:_\b:_\bF_\bu_\bt_\bu_\br_\be_\b:_\b:_\bw_\ba_\bi_\bt\n-void wait()\n-wait until the future is ready\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn future.hh:89\n-_\bD_\bu_\bn_\be_\b:_\b:_\bF_\bu_\bt_\bu_\br_\be_\b:_\b:_\bF_\bu_\bt_\bu_\br_\be\n-Future(U &&data)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn future.hh:80\n-_\bD_\bu_\bn_\be_\b:_\b:_\bF_\bu_\bt_\bu_\br_\be_\b:_\b:_\bg_\be_\bt\n-T get()\n-Waits until the future is ready and returns the resulting value.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn future.hh:97\n-_\bD_\bu_\bn_\be_\b:_\b:_\bF_\bu_\bt_\bu_\br_\be_\b:_\b:_\bF_\bu_\bt_\bu_\br_\be\n-Future()=default\n-_\bD_\bu_\bn_\be_\b:_\b:_\bF_\bu_\bt_\bu_\br_\be_\b:_\b:_\bv_\ba_\bl_\bi_\bd\n-bool valid() const\n-Checks whether the future is valid. I.e. \u00e2\u0080\u0098get()\u00e2\u0080\u0099 was not called on that\n-future and when it was not de...\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn future.hh:114\n-_\bD_\bu_\bn_\be_\b:_\b:_\bF_\bu_\bt_\bu_\br_\be_\b:_\b:_\bF_\bu_\bt_\bu_\br_\be\n-Future(F &&f)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn future.hh:75\n-_\bD_\bu_\bn_\be_\b:_\b:_\bP_\bs_\be_\bu_\bd_\bo_\bF_\bu_\bt_\bu_\br_\be_\b<_\b _\bv_\bo_\bi_\bd_\b _\b>_\b:_\b:_\br_\be_\ba_\bd_\by\n-bool ready() const\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn future.hh:173\n-_\bD_\bu_\bn_\be_\b:_\b:_\bP_\bs_\be_\bu_\bd_\bo_\bF_\bu_\bt_\bu_\br_\be_\b<_\b _\bv_\bo_\bi_\bd_\b _\b>_\b:_\b:_\bv_\ba_\bl_\bi_\bd\n-bool valid() const\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn future.hh:185\n-_\bD_\bu_\bn_\be_\b:_\b:_\bP_\bs_\be_\bu_\bd_\bo_\bF_\bu_\bt_\bu_\br_\be_\b<_\b _\bv_\bo_\bi_\bd_\b _\b>_\b:_\b:_\bg_\be_\bt\n-void get()\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn future.hh:179\n-_\bD_\bu_\bn_\be_\b:_\b:_\bP_\bs_\be_\bu_\bd_\bo_\bF_\bu_\bt_\bu_\br_\be_\b<_\b _\bv_\bo_\bi_\bd_\b _\b>_\b:_\b:_\bP_\bs_\be_\bu_\bd_\bo_\bF_\bu_\bt_\bu_\br_\be\n-PseudoFuture(bool valid=false)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn future.hh:165\n-_\bD_\bu_\bn_\be_\b:_\b:_\bP_\bs_\be_\bu_\bd_\bo_\bF_\bu_\bt_\bu_\br_\be_\b<_\b _\bv_\bo_\bi_\bd_\b _\b>_\b:_\b:_\bw_\ba_\bi_\bt\n-void wait()\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn future.hh:169\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\bP_\bI_\bT_\br_\ba_\bi_\bt_\bs\n+A traits class describing the mapping of types onto MPI_Datatypes.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mpitraits.hh:41\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\bP_\bI_\bT_\br_\ba_\bi_\bt_\bs_\b:_\b:_\bg_\be_\bt_\bT_\by_\bp_\be\n+static MPI_Datatype getType()\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mpitraits.hh:48\n+_\bD_\bu_\bn_\be_\b:_\b:_\bL_\bo_\bc_\ba_\bl_\bI_\bn_\bd_\be_\bx_\bC_\bo_\bm_\bp_\ba_\br_\ba_\bt_\bo_\br\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn indexset.hh:615\n+_\bD_\bu_\bn_\be_\b:_\b:_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bL_\bo_\bc_\ba_\bl_\bI_\bn_\bd_\be_\bx\n+An index present on the local process with an additional attribute flag.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn plocalindex.hh:52\n+_\bD_\bu_\bn_\be_\b:_\b:_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bL_\bo_\bc_\ba_\bl_\bI_\bn_\bd_\be_\bx_\b:_\b:_\bA_\bt_\bt_\br_\bi_\bb_\bu_\bt_\be\n+T Attribute\n+The type of the attributes. Normally this will be an enumeration like.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn plocalindex.hh:67\n+_\bD_\bu_\bn_\be_\b:_\b:_\bL_\bo_\bc_\ba_\bl_\bI_\bn_\bd_\be_\bx_\bC_\bo_\bm_\bp_\ba_\br_\ba_\bt_\bo_\br_\b<_\b _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bL_\bo_\bc_\ba_\bl_\bI_\bn_\bd_\be_\bx_\b<_\b _\bT_\b _\b>_\b _\b>_\b:_\b:_\bc_\bo_\bm_\bp_\ba_\br_\be\n+static bool compare(const ParallelLocalIndex< T > &t1, const\n+ParallelLocalIndex< T > &t2)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn plocalindex.hh:198\n ===============================================================================\n Generated by\u00a0_\b[_\bd_\bo_\bx_\by_\bg_\be_\bn_\b] 1.9.8\n"}]}, {"source1": "./usr/share/doc/libdune-common-doc/doxygen/a00068.html", "source2": "./usr/share/doc/libdune-common-doc/doxygen/a00068.html", "unified_diff": "@@ -1,15 +1,15 @@\n \n \n \n \n \n \n \n-dune-common: mpicollectivecommunication.hh File Reference\n+dune-common: mpidata.hh File Reference\n \n \n \n \n \n \n \n@@ -69,20 +69,58 @@\n \n \n \n
    \n-
    mpicollectivecommunication.hh File Reference
    \n+ \n+
    mpidata.hh File Reference
    \n
    \n
    \n-
    #include <dune/common/parallel/mpicommunication.hh>
    \n+\n+

    Interface class to translate objects to a MPI_Datatype, void* and size used for MPI calls. \n+More...

    \n+
    #include <vector>
    \n+#include <string>
    \n+#include <type_traits>
    \n+#include <dune/common/typetraits.hh>
    \n+#include <dune/common/std/type_traits.hh>
    \n+#include <dune/common/parallel/mpitraits.hh>
    \n
    \n

    Go to the source code of this file.

    \n-
    \n+\n+\n+\n+\n+\n+\n+\n+\n+

    \n+Classes

    struct  Dune::MPIData< T, Enable >
     
    struct  Dune::MPIData< void >
     
    struct  Dune::MPIData< T, std::void_t< std::tuple< decltype(std::declval< T >().data()), decltype(std::declval< T >().size()), typename std::decay_t< T >::value_type > > >
     
    \n+\n+\n+\n+\n+

    \n+Namespaces

    namespace  Dune
     Dune namespace.
     
    \n+\n+\n+\n+\n+

    \n+Functions

    template<class T >
    auto Dune::getMPIData (T &t)
     
    \n+

    Detailed Description

    \n+

    Interface class to translate objects to a MPI_Datatype, void* and size used for MPI calls.

    \n+

    Furthermore it can be used to resize the object if possible. This makes it possible to receive a message with variable size. See Communication::rrecv.

    \n+

    To 'register' a new dynamic type for MPI communication specialize MPIData or overload getMPIData.

    \n+
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,12 +1,45 @@\n dune-common\u00a02.10\n Loading...\n Searching...\n No Matches\n * _\bd_\bu_\bn_\be\n * _\bc_\bo_\bm_\bm_\bo_\bn\n * _\bp_\ba_\br_\ba_\bl_\bl_\be_\bl\n-mpicollectivecommunication.hh File Reference\n-#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bp_\ba_\br_\ba_\bl_\bl_\be_\bl_\b/_\bm_\bp_\bi_\bc_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b._\bh_\bh>\n+_\bC_\bl_\ba_\bs_\bs_\be_\bs | _\bN_\ba_\bm_\be_\bs_\bp_\ba_\bc_\be_\bs | _\bF_\bu_\bn_\bc_\bt_\bi_\bo_\bn_\bs\n+mpidata.hh File Reference\n+_\bC_\bo_\bm_\bm_\bo_\bn \u00bb _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\b _\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn\n+Interface class to translate objects to a MPI_Datatype, void* and size used for\n+MPI calls. _\bM_\bo_\br_\be_\b._\b._\b.\n+#include \n+#include \n+#include \n+#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bt_\by_\bp_\be_\bt_\br_\ba_\bi_\bt_\bs_\b._\bh_\bh>\n+#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bs_\bt_\bd_\b/_\bt_\by_\bp_\be_\b__\bt_\br_\ba_\bi_\bt_\bs_\b._\bh_\bh>\n+#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bp_\ba_\br_\ba_\bl_\bl_\be_\bl_\b/_\bm_\bp_\bi_\bt_\br_\ba_\bi_\bt_\bs_\b._\bh_\bh>\n _\bG_\bo_\b _\bt_\bo_\b _\bt_\bh_\be_\b _\bs_\bo_\bu_\br_\bc_\be_\b _\bc_\bo_\bd_\be_\b _\bo_\bf_\b _\bt_\bh_\bi_\bs_\b _\bf_\bi_\bl_\be_\b.\n+C\bCl\bla\bas\bss\bse\bes\bs\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bM_\bP_\bI_\bD_\ba_\bt_\ba_\b<_\b _\bT_\b,_\b _\bE_\bn_\ba_\bb_\bl_\be_\b _\b>\n+\u00a0\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bM_\bP_\bI_\bD_\ba_\bt_\ba_\b<_\b _\bv_\bo_\bi_\bd_\b _\b>\n+\u00a0\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bM_\bP_\bI_\bD_\ba_\bt_\ba_\b<_\b _\bT_\b,_\b _\bs_\bt_\bd_\b:_\b:_\bv_\bo_\bi_\bd_\b__\bt_\b<_\b _\bs_\bt_\bd_\b:_\b:_\bt_\bu_\bp_\bl_\be_\b<_\b _\bd_\be_\bc_\bl_\bt_\by_\bp_\be_\b(_\bs_\bt_\bd_\b:_\b:_\bd_\be_\bc_\bl_\bv_\ba_\bl_\b<_\b _\bT_\b _\b>\n+ _\b(_\b)_\b._\bd_\ba_\bt_\ba_\b(_\b)_\b)_\b,_\b _\bd_\be_\bc_\bl_\bt_\by_\bp_\be_\b(_\bs_\bt_\bd_\b:_\b:_\bd_\be_\bc_\bl_\bv_\ba_\bl_\b<_\b _\bT_\b _\b>_\b(_\b)_\b._\bs_\bi_\bz_\be_\b(_\b)_\b)_\b,_\b _\bt_\by_\bp_\be_\bn_\ba_\bm_\be_\b _\bs_\bt_\bd_\b:_\b:\n+ _\bd_\be_\bc_\ba_\by_\b__\bt_\b<_\b _\bT_\b _\b>_\b:_\b:_\bv_\ba_\bl_\bu_\be_\b__\bt_\by_\bp_\be_\b _\b>_\b _\b>_\b _\b>\n+\u00a0\n+N\bNa\bam\bme\bes\bsp\bpa\bac\bce\bes\bs\n+namespace \u00a0 _\bD_\bu_\bn_\be\n+\u00a0 _\bD_\bu_\bn_\be namespace.\n+\u00a0\n+F\bFu\bun\bnc\bct\bti\bio\bon\bns\bs\n+template\n+auto\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bg_\be_\bt_\bM_\bP_\bI_\bD_\ba_\bt_\ba (T &t)\n+\u00a0\n+*\b**\b**\b**\b**\b* D\bDe\bet\bta\bai\bil\ble\bed\bd D\bDe\bes\bsc\bcr\bri\bip\bpt\bti\bio\bon\bn *\b**\b**\b**\b**\b*\n+Interface class to translate objects to a MPI_Datatype, void* and size used for\n+MPI calls.\n+Furthermore it can be used to resize the object if possible. This makes it\n+possible to receive a message with variable size. See Communication::rrecv.\n+To 'register' a new dynamic type for MPI communication specialize MPIData or\n+overload getMPIData.\n ===============================================================================\n Generated by\u00a0_\b[_\bd_\bo_\bx_\by_\bg_\be_\bn_\b] 1.9.8\n"}]}, {"source1": "./usr/share/doc/libdune-common-doc/doxygen/a00068_source.html", "source2": "./usr/share/doc/libdune-common-doc/doxygen/a00068_source.html", "unified_diff": "@@ -1,15 +1,15 @@\n \n \n \n \n \n \n \n-dune-common: mpicollectivecommunication.hh Source File\n+dune-common: mpidata.hh Source File\n \n \n \n \n \n \n \n@@ -74,23 +74,193 @@\n \n \n \n
    \n-
    mpicollectivecommunication.hh
    \n+
    mpidata.hh
    \n
    \n
    \n-Go to the documentation of this file.
    1// SPDX-FileCopyrightInfo: Copyright \u00a9 DUNE Project contributors, see file LICENSE.md in module root
    \n-
    2// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception
    \n-
    3// Will be removed after the 2.7 release
    \n-
    4#warning "Deprecated header, use #include <dune/common/parallel/mpicommunication.hh> instead!"
    \n-\n-
    Implements an utility class that provides MPI's collective communication methods.
    \n+Go to the documentation of this file.
    1// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
    \n+
    2// vi: set et ts=4 sw=2 sts=2:
    \n+
    3// SPDX-FileCopyrightInfo: Copyright \u00a9 DUNE Project contributors, see file LICENSE.md in module root
    \n+
    4// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception
    \n+
    5
    \n+
    6#ifndef DUNE_COMMON_PARALLEL_MPIDATA_HH
    \n+
    7#define DUNE_COMMON_PARALLEL_MPIDATA_HH
    \n+
    8
    \n+
    9#if HAVE_MPI
    \n+
    10
    \n+
    11#include <vector>
    \n+
    12#include <string>
    \n+
    13#include <type_traits>
    \n+
    14
    \n+\n+\n+\n+
    18
    \n+
    38namespace Dune{
    \n+
    39
    \n+
    40 template<class, class = void>
    \n+
    41 struct MPIData;
    \n+
    42
    \n+
    43 template<class T>
    \n+
    \n+
    44 auto getMPIData(T& t){
    \n+
    45 return MPIData<T>(t);
    \n+
    46 }
    \n+
    \n+
    47
    \n+
    48 // Default implementation for static datatypes
    \n+
    49 template<class T, class Enable>
    \n+
    \n+
    50 struct MPIData
    \n+
    51 {
    \n+
    52 friend auto getMPIData<T>(T&);
    \n+
    53 protected:
    \n+\n+
    55
    \n+
    \n+
    56 MPIData(T& t)
    \n+
    57 : data_(t)
    \n+
    58 {}
    \n+
    \n+
    59
    \n+
    60 public:
    \n+
    \n+
    61 void* ptr() const {
    \n+
    62 return (void*)&data_;
    \n+
    63 }
    \n+
    \n+
    64
    \n+
    65 // indicates whether the datatype can be resized
    \n+
    66 static constexpr bool static_size = true;
    \n+
    67
    \n+
    \n+
    68 int size() const{
    \n+
    69 return 1;
    \n+
    70 }
    \n+
    \n+
    71
    \n+
    \n+
    72 MPI_Datatype type() const {
    \n+
    73 return MPITraits<std::decay_t<T>>::getType();
    \n+
    74 }
    \n+
    \n+
    75 };
    \n+
    \n+
    76
    \n+
    77 // dummy implementation for void
    \n+
    78 template<>
    \n+
    \n+
    79 struct MPIData<void>{
    \n+
    80 protected:
    \n+\n+
    82
    \n+
    83 public:
    \n+
    \n+
    84 void* ptr(){
    \n+
    85 return nullptr;
    \n+
    86 }
    \n+
    \n+
    \n+
    87 int size(){
    \n+
    88 return 0;
    \n+
    89 }
    \n+
    \n+
    90 void get(){}
    \n+
    \n+
    91 MPI_Datatype type() const{
    \n+
    92 return MPI_INT;
    \n+
    93 }
    \n+
    \n+
    94 };
    \n+
    \n+
    95
    \n+
    96 // specializations:
    \n+
    97 // std::vector of static sized elements or std::string
    \n+
    98 template<class T>
    \n+
    \n+
    99 struct MPIData<T, std::void_t<std::tuple<decltype(std::declval<T>().data()),
    \n+
    100 decltype(std::declval<T>().size()),
    \n+
    101 typename std::decay_t<T>::value_type>>>{
    \n+
    102 private:
    \n+
    103 template<class U>
    \n+
    104 using hasResizeOp = decltype(std::declval<U>().resize(0));
    \n+
    105
    \n+
    106 protected:
    \n+
    107 friend auto getMPIData<T>(T&);
    \n+
    \n+\n+
    109 : data_(t)
    \n+
    110 {}
    \n+
    \n+
    111 public:
    \n+
    112 static constexpr bool static_size = std::is_const<T>::value || !Std::is_detected_v<hasResizeOp, T>;
    \n+
    \n+
    113 void* ptr() {
    \n+
    114 return (void*) data_.data();
    \n+
    115 }
    \n+
    \n+
    \n+
    116 int size() {
    \n+
    117 return data_.size();
    \n+
    118 }
    \n+
    \n+
    \n+
    119 MPI_Datatype type() const{
    \n+\n+
    121 }
    \n+
    \n+
    122
    \n+
    123 template<class S = T>
    \n+
    \n+
    124 auto /*void*/ resize(int size)
    \n+
    125 -> std::enable_if_t<!std::is_const<S>::value || !Std::is_detected_v<hasResizeOp, S>>
    \n+
    126 {
    \n+
    127 data_.resize(size);
    \n+
    128 }
    \n+
    \n+
    129
    \n+
    130 protected:
    \n+\n+
    132 };
    \n+
    \n+
    133
    \n+
    134}
    \n+
    135
    \n+
    140#endif // HAVE_MPI
    \n+
    141#endif // DUNE_COMMON_PARALLEL_MPIDATA_HH
    \n+
    Traits classes for mapping types onto MPI_Datatype.
    \n+
    Traits for type conversions and type information.
    \n+\n+
    typename Impl::voider< Types... >::type void_t
    Is void for all valid input types. The workhorse for C++11 SFINAE-techniques.
    Definition typetraits.hh:40
    \n+
    STL namespace.
    \n+
    Dune namespace.
    Definition alignedallocator.hh:13
    \n+
    auto getMPIData(T &t)
    Definition mpidata.hh:44
    \n+
    A traits class describing the mapping of types onto MPI_Datatypes.
    Definition mpitraits.hh:41
    \n+
    Definition mpidata.hh:51
    \n+
    T & data_
    Definition mpidata.hh:54
    \n+
    MPI_Datatype type() const
    Definition mpidata.hh:72
    \n+
    void * ptr() const
    Definition mpidata.hh:61
    \n+
    int size() const
    Definition mpidata.hh:68
    \n+
    static constexpr bool static_size
    Definition mpidata.hh:66
    \n+
    MPIData(T &t)
    Definition mpidata.hh:56
    \n+
    void get()
    Definition mpidata.hh:90
    \n+
    MPIData()
    Definition mpidata.hh:81
    \n+
    int size()
    Definition mpidata.hh:87
    \n+
    void * ptr()
    Definition mpidata.hh:84
    \n+
    MPI_Datatype type() const
    Definition mpidata.hh:91
    \n+\n+\n+\n+\n+
    auto resize(int size) -> std::enable_if_t<!std::is_const< S >::value||!Std::is_detected_v< hasResizeOp, S > >
    Definition mpidata.hh:124
    \n+\n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,21 +1,218 @@\n dune-common\u00a02.10\n Loading...\n Searching...\n No Matches\n * _\bd_\bu_\bn_\be\n * _\bc_\bo_\bm_\bm_\bo_\bn\n * _\bp_\ba_\br_\ba_\bl_\bl_\be_\bl\n-mpicollectivecommunication.hh\n+mpidata.hh\n _\bG_\bo_\b _\bt_\bo_\b _\bt_\bh_\be_\b _\bd_\bo_\bc_\bu_\bm_\be_\bn_\bt_\ba_\bt_\bi_\bo_\bn_\b _\bo_\bf_\b _\bt_\bh_\bi_\bs_\b _\bf_\bi_\bl_\be_\b.\n-1// SPDX-FileCopyrightInfo: Copyright \u00c2\u00a9 DUNE Project contributors, see file\n+1// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-\n+2// vi: set et ts=4 sw=2 sts=2:\n+3// SPDX-FileCopyrightInfo: Copyright \u00c2\u00a9 DUNE Project contributors, see file\n LICENSE.md in module root\n-2// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception\n-3// Will be removed after the 2.7 release\n-4#warning \"Deprecated header, use #include instead!\"\n-5#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bp_\ba_\br_\ba_\bl_\bl_\be_\bl_\b/_\bm_\bp_\bi_\bc_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b._\bh_\bh>\n-_\bm_\bp_\bi_\bc_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b._\bh_\bh\n-Implements an utility class that provides MPI's collective communication\n-methods.\n+4// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception\n+5\n+6#ifndef DUNE_COMMON_PARALLEL_MPIDATA_HH\n+7#define DUNE_COMMON_PARALLEL_MPIDATA_HH\n+8\n+9#if HAVE_MPI\n+10\n+11#include \n+12#include \n+13#include \n+14\n+15#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bt_\by_\bp_\be_\bt_\br_\ba_\bi_\bt_\bs_\b._\bh_\bh>\n+16#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bs_\bt_\bd_\b/_\bt_\by_\bp_\be_\b__\bt_\br_\ba_\bi_\bt_\bs_\b._\bh_\bh>\n+17#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bp_\ba_\br_\ba_\bl_\bl_\be_\bl_\b/_\bm_\bp_\bi_\bt_\br_\ba_\bi_\bt_\bs_\b._\bh_\bh>\n+18\n+38namespace _\bD_\bu_\bn_\be{\n+39\n+40 template\n+41 struct MPIData;\n+42\n+43 template\n+_\b4_\b4 auto _\bg_\be_\bt_\bM_\bP_\bI_\bD_\ba_\bt_\ba(T& t){\n+45 return _\bM_\bP_\bI_\bD_\ba_\bt_\ba_\b<_\bT_\b>(t);\n+46 }\n+47\n+48 // Default implementation for static datatypes\n+49 template\n+_\b5_\b0 struct _\bM_\bP_\bI_\bD_\ba_\bt_\ba\n+51 {\n+52 friend auto getMPIData(T&);\n+53 protected:\n+_\b5_\b4 T& _\bd_\ba_\bt_\ba_\b_;\n+55\n+_\b5_\b6 _\bM_\bP_\bI_\bD_\ba_\bt_\ba(T& t)\n+57 : _\bd_\ba_\bt_\ba_\b_(t)\n+58 {}\n+59\n+60 public:\n+_\b6_\b1 void* _\bp_\bt_\br() const {\n+62 return (void*)&_\bd_\ba_\bt_\ba_\b_;\n+63 }\n+64\n+65 // indicates whether the datatype can be resized\n+_\b6_\b6 static constexpr bool _\bs_\bt_\ba_\bt_\bi_\bc_\b__\bs_\bi_\bz_\be = true;\n+67\n+_\b6_\b8 int _\bs_\bi_\bz_\be() const{\n+69 return 1;\n+70 }\n+71\n+_\b7_\b2 MPI_Datatype _\bt_\by_\bp_\be() const {\n+73 return _\bM_\bP_\bI_\bT_\br_\ba_\bi_\bt_\bs_\b<_\bs_\bt_\bd_\b:_\b:_\bd_\be_\bc_\ba_\by_\b__\bt_\b<_\bT_\b>>::getType();\n+74 }\n+75 };\n+76\n+77 // dummy implementation for void\n+78 template<>\n+_\b7_\b9 struct _\bM_\bP_\bI_\bD_\ba_\bt_\ba{\n+80 protected:\n+_\b8_\b1 _\bM_\bP_\bI_\bD_\ba_\bt_\ba() {}\n+82\n+83 public:\n+_\b8_\b4 void* _\bp_\bt_\br(){\n+85 return nullptr;\n+86 }\n+_\b8_\b7 int _\bs_\bi_\bz_\be(){\n+88 return 0;\n+89 }\n+_\b9_\b0 void _\bg_\be_\bt(){}\n+_\b9_\b1 MPI_Datatype _\bt_\by_\bp_\be() const{\n+92 return MPI_INT;\n+93 }\n+94 };\n+95\n+96 // specializations:\n+97 // std::vector of static sized elements or std::string\n+98 template\n+_\b9_\b9 struct _\bM_\bP_\bI_\bD_\ba_\bt_\ba().data()),\n+100 decltype(std::declval().size()),\n+101 typename std::decay_t::value_type>>>{\n+102 private:\n+103 template\n+104 using hasResizeOp = decltype(std::declval().resize(0));\n+105\n+106 protected:\n+107 friend auto getMPIData(T&);\n+_\b1_\b0_\b8 _\bM_\bP_\bI_\bD_\ba_\bt_\ba(T& t)\n+109 : _\bd_\ba_\bt_\ba_\b_(t)\n+110 {}\n+111 public:\n+_\b1_\b1_\b2 static constexpr bool _\bs_\bt_\ba_\bt_\bi_\bc_\b__\bs_\bi_\bz_\be = std::is_const::value || !Std::\n+is_detected_v;\n+_\b1_\b1_\b3 void* _\bp_\bt_\br() {\n+114 return (void*) _\bd_\ba_\bt_\ba_\b_.data();\n+115 }\n+_\b1_\b1_\b6 int _\bs_\bi_\bz_\be() {\n+117 return _\bd_\ba_\bt_\ba_\b_.size();\n+118 }\n+_\b1_\b1_\b9 MPI_Datatype _\bt_\by_\bp_\be() const{\n+120 return _\bM_\bP_\bI_\bT_\br_\ba_\bi_\bt_\bs_\b<_\bt_\by_\bp_\be_\bn_\ba_\bm_\be_\b _\bs_\bt_\bd_\b:_\b:_\bd_\be_\bc_\ba_\by_\b__\bt_\b<_\bT_\b>_\b:_\b:_\bv_\ba_\bl_\bu_\be_\b__\bt_\by_\bp_\be>::getType();\n+121 }\n+122\n+123 template\n+_\b1_\b2_\b4 auto /*void*/ _\br_\be_\bs_\bi_\bz_\be(int _\bs_\bi_\bz_\be)\n+125 -> std::enable_if_t::value || !Std::\n+is_detected_v>\n+126 {\n+127 _\bd_\ba_\bt_\ba_\b_.resize(_\bs_\bi_\bz_\be);\n+128 }\n+129\n+130 protected:\n+_\b1_\b3_\b1 T& _\bd_\ba_\bt_\ba_\b_;\n+132 };\n+133\n+134}\n+135\n+140#endif // HAVE_MPI\n+141#endif // DUNE_COMMON_PARALLEL_MPIDATA_HH\n+_\bm_\bp_\bi_\bt_\br_\ba_\bi_\bt_\bs_\b._\bh_\bh\n+Traits classes for mapping types onto MPI_Datatype.\n+_\bt_\by_\bp_\be_\bt_\br_\ba_\bi_\bt_\bs_\b._\bh_\bh\n+Traits for type conversions and type information.\n+_\bt_\by_\bp_\be_\b__\bt_\br_\ba_\bi_\bt_\bs_\b._\bh_\bh\n+_\bD_\bu_\bn_\be_\b:_\b:_\bv_\bo_\bi_\bd_\b__\bt\n+typename Impl::voider< Types... >::type void_t\n+Is void for all valid input types. The workhorse for C++11 SFINAE-techniques.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn typetraits.hh:40\n+_\bs_\bt_\bd\n+STL namespace.\n+_\bD_\bu_\bn_\be\n+Dune namespace.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn alignedallocator.hh:13\n+_\bD_\bu_\bn_\be_\b:_\b:_\bg_\be_\bt_\bM_\bP_\bI_\bD_\ba_\bt_\ba\n+auto getMPIData(T &t)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mpidata.hh:44\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\bP_\bI_\bT_\br_\ba_\bi_\bt_\bs\n+A traits class describing the mapping of types onto MPI_Datatypes.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mpitraits.hh:41\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\bP_\bI_\bD_\ba_\bt_\ba\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mpidata.hh:51\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\bP_\bI_\bD_\ba_\bt_\ba_\b:_\b:_\bd_\ba_\bt_\ba_\b_\n+T & data_\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mpidata.hh:54\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\bP_\bI_\bD_\ba_\bt_\ba_\b:_\b:_\bt_\by_\bp_\be\n+MPI_Datatype type() const\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mpidata.hh:72\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\bP_\bI_\bD_\ba_\bt_\ba_\b:_\b:_\bp_\bt_\br\n+void * ptr() const\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mpidata.hh:61\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\bP_\bI_\bD_\ba_\bt_\ba_\b:_\b:_\bs_\bi_\bz_\be\n+int size() const\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mpidata.hh:68\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\bP_\bI_\bD_\ba_\bt_\ba_\b:_\b:_\bs_\bt_\ba_\bt_\bi_\bc_\b__\bs_\bi_\bz_\be\n+static constexpr bool static_size\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mpidata.hh:66\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\bP_\bI_\bD_\ba_\bt_\ba_\b:_\b:_\bM_\bP_\bI_\bD_\ba_\bt_\ba\n+MPIData(T &t)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mpidata.hh:56\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\bP_\bI_\bD_\ba_\bt_\ba_\b<_\b _\bv_\bo_\bi_\bd_\b _\b>_\b:_\b:_\bg_\be_\bt\n+void get()\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mpidata.hh:90\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\bP_\bI_\bD_\ba_\bt_\ba_\b<_\b _\bv_\bo_\bi_\bd_\b _\b>_\b:_\b:_\bM_\bP_\bI_\bD_\ba_\bt_\ba\n+MPIData()\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mpidata.hh:81\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\bP_\bI_\bD_\ba_\bt_\ba_\b<_\b _\bv_\bo_\bi_\bd_\b _\b>_\b:_\b:_\bs_\bi_\bz_\be\n+int size()\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mpidata.hh:87\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\bP_\bI_\bD_\ba_\bt_\ba_\b<_\b _\bv_\bo_\bi_\bd_\b _\b>_\b:_\b:_\bp_\bt_\br\n+void * ptr()\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mpidata.hh:84\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\bP_\bI_\bD_\ba_\bt_\ba_\b<_\b _\bv_\bo_\bi_\bd_\b _\b>_\b:_\b:_\bt_\by_\bp_\be\n+MPI_Datatype type() const\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mpidata.hh:91\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\bP_\bI_\bD_\ba_\bt_\ba_\b<_\b _\bT_\b,_\b _\bs_\bt_\bd_\b:_\b:_\bv_\bo_\bi_\bd_\b__\bt_\b<_\b _\bs_\bt_\bd_\b:_\b:_\bt_\bu_\bp_\bl_\be_\b<_\b _\bd_\be_\bc_\bl_\bt_\by_\bp_\be_\b(_\bs_\bt_\bd_\b:_\b:_\bd_\be_\bc_\bl_\bv_\ba_\bl_\b<_\b _\bT_\b _\b>_\b(_\b)_\b._\bd_\ba_\bt_\ba\n+_\b(_\b)_\b)_\b,_\b _\bd_\be_\bc_\bl_\bt_\by_\bp_\be_\b(_\bs_\bt_\bd_\b:_\b:_\bd_\be_\bc_\bl_\bv_\ba_\bl_\b<_\b _\bT_\b _\b>_\b(_\b)_\b._\bs_\bi_\bz_\be_\b(_\b)_\b)_\b,_\b _\bt_\by_\bp_\be_\bn_\ba_\bm_\be_\b _\bs_\bt_\bd_\b:_\b:_\bd_\be_\bc_\ba_\by_\b__\bt_\b<_\b _\bT_\b _\b>_\b:_\b:\n+_\bv_\ba_\bl_\bu_\be_\b__\bt_\by_\bp_\be_\b _\b>_\b _\b>_\b _\b>_\b:_\b:_\bM_\bP_\bI_\bD_\ba_\bt_\ba\n+MPIData(T &t)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mpidata.hh:108\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\bP_\bI_\bD_\ba_\bt_\ba_\b<_\b _\bT_\b,_\b _\bs_\bt_\bd_\b:_\b:_\bv_\bo_\bi_\bd_\b__\bt_\b<_\b _\bs_\bt_\bd_\b:_\b:_\bt_\bu_\bp_\bl_\be_\b<_\b _\bd_\be_\bc_\bl_\bt_\by_\bp_\be_\b(_\bs_\bt_\bd_\b:_\b:_\bd_\be_\bc_\bl_\bv_\ba_\bl_\b<_\b _\bT_\b _\b>_\b(_\b)_\b._\bd_\ba_\bt_\ba\n+_\b(_\b)_\b)_\b,_\b _\bd_\be_\bc_\bl_\bt_\by_\bp_\be_\b(_\bs_\bt_\bd_\b:_\b:_\bd_\be_\bc_\bl_\bv_\ba_\bl_\b<_\b _\bT_\b _\b>_\b(_\b)_\b._\bs_\bi_\bz_\be_\b(_\b)_\b)_\b,_\b _\bt_\by_\bp_\be_\bn_\ba_\bm_\be_\b _\bs_\bt_\bd_\b:_\b:_\bd_\be_\bc_\ba_\by_\b__\bt_\b<_\b _\bT_\b _\b>_\b:_\b:\n+_\bv_\ba_\bl_\bu_\be_\b__\bt_\by_\bp_\be_\b _\b>_\b _\b>_\b _\b>_\b:_\b:_\bp_\bt_\br\n+void * ptr()\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mpidata.hh:113\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\bP_\bI_\bD_\ba_\bt_\ba_\b<_\b _\bT_\b,_\b _\bs_\bt_\bd_\b:_\b:_\bv_\bo_\bi_\bd_\b__\bt_\b<_\b _\bs_\bt_\bd_\b:_\b:_\bt_\bu_\bp_\bl_\be_\b<_\b _\bd_\be_\bc_\bl_\bt_\by_\bp_\be_\b(_\bs_\bt_\bd_\b:_\b:_\bd_\be_\bc_\bl_\bv_\ba_\bl_\b<_\b _\bT_\b _\b>_\b(_\b)_\b._\bd_\ba_\bt_\ba\n+_\b(_\b)_\b)_\b,_\b _\bd_\be_\bc_\bl_\bt_\by_\bp_\be_\b(_\bs_\bt_\bd_\b:_\b:_\bd_\be_\bc_\bl_\bv_\ba_\bl_\b<_\b _\bT_\b _\b>_\b(_\b)_\b._\bs_\bi_\bz_\be_\b(_\b)_\b)_\b,_\b _\bt_\by_\bp_\be_\bn_\ba_\bm_\be_\b _\bs_\bt_\bd_\b:_\b:_\bd_\be_\bc_\ba_\by_\b__\bt_\b<_\b _\bT_\b _\b>_\b:_\b:\n+_\bv_\ba_\bl_\bu_\be_\b__\bt_\by_\bp_\be_\b _\b>_\b _\b>_\b _\b>_\b:_\b:_\bs_\bi_\bz_\be\n+int size()\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mpidata.hh:116\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\bP_\bI_\bD_\ba_\bt_\ba_\b<_\b _\bT_\b,_\b _\bs_\bt_\bd_\b:_\b:_\bv_\bo_\bi_\bd_\b__\bt_\b<_\b _\bs_\bt_\bd_\b:_\b:_\bt_\bu_\bp_\bl_\be_\b<_\b _\bd_\be_\bc_\bl_\bt_\by_\bp_\be_\b(_\bs_\bt_\bd_\b:_\b:_\bd_\be_\bc_\bl_\bv_\ba_\bl_\b<_\b _\bT_\b _\b>_\b(_\b)_\b._\bd_\ba_\bt_\ba\n+_\b(_\b)_\b)_\b,_\b _\bd_\be_\bc_\bl_\bt_\by_\bp_\be_\b(_\bs_\bt_\bd_\b:_\b:_\bd_\be_\bc_\bl_\bv_\ba_\bl_\b<_\b _\bT_\b _\b>_\b(_\b)_\b._\bs_\bi_\bz_\be_\b(_\b)_\b)_\b,_\b _\bt_\by_\bp_\be_\bn_\ba_\bm_\be_\b _\bs_\bt_\bd_\b:_\b:_\bd_\be_\bc_\ba_\by_\b__\bt_\b<_\b _\bT_\b _\b>_\b:_\b:\n+_\bv_\ba_\bl_\bu_\be_\b__\bt_\by_\bp_\be_\b _\b>_\b _\b>_\b _\b>_\b:_\b:_\bd_\ba_\bt_\ba_\b_\n+T & data_\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mpidata.hh:131\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\bP_\bI_\bD_\ba_\bt_\ba_\b<_\b _\bT_\b,_\b _\bs_\bt_\bd_\b:_\b:_\bv_\bo_\bi_\bd_\b__\bt_\b<_\b _\bs_\bt_\bd_\b:_\b:_\bt_\bu_\bp_\bl_\be_\b<_\b _\bd_\be_\bc_\bl_\bt_\by_\bp_\be_\b(_\bs_\bt_\bd_\b:_\b:_\bd_\be_\bc_\bl_\bv_\ba_\bl_\b<_\b _\bT_\b _\b>_\b(_\b)_\b._\bd_\ba_\bt_\ba\n+_\b(_\b)_\b)_\b,_\b _\bd_\be_\bc_\bl_\bt_\by_\bp_\be_\b(_\bs_\bt_\bd_\b:_\b:_\bd_\be_\bc_\bl_\bv_\ba_\bl_\b<_\b _\bT_\b _\b>_\b(_\b)_\b._\bs_\bi_\bz_\be_\b(_\b)_\b)_\b,_\b _\bt_\by_\bp_\be_\bn_\ba_\bm_\be_\b _\bs_\bt_\bd_\b:_\b:_\bd_\be_\bc_\ba_\by_\b__\bt_\b<_\b _\bT_\b _\b>_\b:_\b:\n+_\bv_\ba_\bl_\bu_\be_\b__\bt_\by_\bp_\be_\b _\b>_\b _\b>_\b _\b>_\b:_\b:_\br_\be_\bs_\bi_\bz_\be\n+auto resize(int size) -> std::enable_if_t::value||!Std::\n+is_detected_v< hasResizeOp, S > >\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mpidata.hh:124\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\bP_\bI_\bD_\ba_\bt_\ba_\b<_\b _\bT_\b,_\b _\bs_\bt_\bd_\b:_\b:_\bv_\bo_\bi_\bd_\b__\bt_\b<_\b _\bs_\bt_\bd_\b:_\b:_\bt_\bu_\bp_\bl_\be_\b<_\b _\bd_\be_\bc_\bl_\bt_\by_\bp_\be_\b(_\bs_\bt_\bd_\b:_\b:_\bd_\be_\bc_\bl_\bv_\ba_\bl_\b<_\b _\bT_\b _\b>_\b(_\b)_\b._\bd_\ba_\bt_\ba\n+_\b(_\b)_\b)_\b,_\b _\bd_\be_\bc_\bl_\bt_\by_\bp_\be_\b(_\bs_\bt_\bd_\b:_\b:_\bd_\be_\bc_\bl_\bv_\ba_\bl_\b<_\b _\bT_\b _\b>_\b(_\b)_\b._\bs_\bi_\bz_\be_\b(_\b)_\b)_\b,_\b _\bt_\by_\bp_\be_\bn_\ba_\bm_\be_\b _\bs_\bt_\bd_\b:_\b:_\bd_\be_\bc_\ba_\by_\b__\bt_\b<_\b _\bT_\b _\b>_\b:_\b:\n+_\bv_\ba_\bl_\bu_\be_\b__\bt_\by_\bp_\be_\b _\b>_\b _\b>_\b _\b>_\b:_\b:_\bt_\by_\bp_\be\n+MPI_Datatype type() const\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mpidata.hh:119\n ===============================================================================\n Generated by\u00a0_\b[_\bd_\bo_\bx_\by_\bg_\be_\bn_\b] 1.9.8\n"}]}, {"source1": "./usr/share/doc/libdune-common-doc/doxygen/a00071.html", "source2": "./usr/share/doc/libdune-common-doc/doxygen/a00071.html", "unified_diff": "@@ -1,15 +1,15 @@\n \n \n \n \n \n \n \n-dune-common: mpitraits.hh File Reference\n+dune-common: mpiguard.hh File Reference\n \n \n \n \n \n \n \n@@ -72,44 +72,46 @@\n
  • dune
  • common
  • parallel
  • \n
    \n \n
    \n \n-
    mpitraits.hh File Reference
    \n+
    mpiguard.hh File Reference
    \n
    \n
    \n \n-

    Traits classes for mapping types onto MPI_Datatype. \n+

    Implements a MPIGuard which detects an error on a remote process. \n More...

    \n-
    #include <complex>
    \n-#include <cstddef>
    \n-#include <cstdint>
    \n-#include <type_traits>
    \n-#include <utility>
    \n-#include <mpi.h>
    \n+\n

    Go to the source code of this file.

    \n \n \n-\n-\n+\n+\n+\n+\n+\n \n

    \n Classes

    struct  Dune::MPITraits< T >
     A traits class describing the mapping of types onto MPI_Datatypes. More...
    class  Dune::MPIGuardError
     This exception is thrown if the MPIGuard detects an error on a remote process. More...
     
    class  Dune::MPIGuard
     detects a thrown exception and communicates to all other processes More...
     
    \n \n \n \n \n

    \n Namespaces

    namespace  Dune
     Dune namespace.
     
    \n

    Detailed Description

    \n-

    Traits classes for mapping types onto MPI_Datatype.

    \n-
    Author
    Markus Blatt
    \n+

    Implements a MPIGuard which detects an error on a remote process.

    \n+
    Author
    Christian Engwer
    \n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -2,32 +2,35 @@\n Loading...\n Searching...\n No Matches\n * _\bd_\bu_\bn_\be\n * _\bc_\bo_\bm_\bm_\bo_\bn\n * _\bp_\ba_\br_\ba_\bl_\bl_\be_\bl\n _\bC_\bl_\ba_\bs_\bs_\be_\bs | _\bN_\ba_\bm_\be_\bs_\bp_\ba_\bc_\be_\bs\n-mpitraits.hh File Reference\n+mpiguard.hh File Reference\n _\bC_\bo_\bm_\bm_\bo_\bn \u00bb _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\b _\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn\n-Traits classes for mapping types onto MPI_Datatype. _\bM_\bo_\br_\be_\b._\b._\b.\n-#include \n-#include \n-#include \n-#include \n-#include \n+Implements a MPIGuard which detects an error on a remote process. _\bM_\bo_\br_\be_\b._\b._\b.\n #include \n+#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\be_\bx_\bc_\be_\bp_\bt_\bi_\bo_\bn_\bs_\b._\bh_\bh>\n+#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bp_\ba_\br_\ba_\bl_\bl_\be_\bl_\b/_\bc_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b._\bh_\bh>\n+#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bp_\ba_\br_\ba_\bl_\bl_\be_\bl_\b/_\bm_\bp_\bi_\bc_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b._\bh_\bh>\n+#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bp_\ba_\br_\ba_\bl_\bl_\be_\bl_\b/_\bm_\bp_\bi_\bh_\be_\bl_\bp_\be_\br_\b._\bh_\bh>\n _\bG_\bo_\b _\bt_\bo_\b _\bt_\bh_\be_\b _\bs_\bo_\bu_\br_\bc_\be_\b _\bc_\bo_\bd_\be_\b _\bo_\bf_\b _\bt_\bh_\bi_\bs_\b _\bf_\bi_\bl_\be_\b.\n C\bCl\bla\bas\bss\bse\bes\bs\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bM_\bP_\bI_\bT_\br_\ba_\bi_\bt_\bs_\b<_\b _\bT_\b _\b>\n-\u00a0 A traits class describing the mapping of types onto MPI_Datatypes.\n- _\bM_\bo_\br_\be_\b._\b._\b.\n+class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bM_\bP_\bI_\bG_\bu_\ba_\br_\bd_\bE_\br_\br_\bo_\br\n+\u00a0 This exception is thrown if the _\bM_\bP_\bI_\bG_\bu_\ba_\br_\bd detects an error on a remote\n+ process. _\bM_\bo_\br_\be_\b._\b._\b.\n+\u00a0\n+class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bM_\bP_\bI_\bG_\bu_\ba_\br_\bd\n+\u00a0 detects a thrown exception and communicates to all other processes\n+ _\bM_\bo_\br_\be_\b._\b._\b.\n \u00a0\n N\bNa\bam\bme\bes\bsp\bpa\bac\bce\bes\bs\n namespace \u00a0 _\bD_\bu_\bn_\be\n \u00a0 _\bD_\bu_\bn_\be namespace.\n \u00a0\n *\b**\b**\b**\b**\b* D\bDe\bet\bta\bai\bil\ble\bed\bd D\bDe\bes\bsc\bcr\bri\bip\bpt\bti\bio\bon\bn *\b**\b**\b**\b**\b*\n-Traits classes for mapping types onto MPI_Datatype.\n+Implements a MPIGuard which detects an error on a remote process.\n Author\n- Markus Blatt\n+ Christian Engwer\n ===============================================================================\n Generated by\u00a0_\b[_\bd_\bo_\bx_\by_\bg_\be_\bn_\b] 1.9.8\n"}]}, {"source1": "./usr/share/doc/libdune-common-doc/doxygen/a00071_source.html", "source2": "./usr/share/doc/libdune-common-doc/doxygen/a00071_source.html", "unified_diff": "@@ -1,15 +1,15 @@\n \n \n \n \n \n \n \n-dune-common: mpitraits.hh Source File\n+dune-common: mpiguard.hh Source File\n \n \n \n \n \n \n \n@@ -74,214 +74,212 @@\n \n \n
    \n
    \n-
    mpitraits.hh
    \n+
    mpiguard.hh
    \n
    \n
    \n Go to the documentation of this file.
    1// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
    \n
    2// vi: set et ts=4 sw=2 sts=2:
    \n
    3// SPDX-FileCopyrightInfo: Copyright \u00a9 DUNE Project contributors, see file LICENSE.md in module root
    \n
    4// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception
    \n-
    5#ifndef DUNE_COMMON_PARALLEL_MPITRAITS_HH
    \n-
    6#define DUNE_COMMON_PARALLEL_MPITRAITS_HH
    \n-
    7
    \n-
    18#if HAVE_MPI
    \n+
    5
    \n+
    13#ifndef DUNE_COMMON_PARALLEL_MPIGUARD_HH
    \n+
    14#define DUNE_COMMON_PARALLEL_MPIGUARD_HH
    \n+
    15
    \n+
    16#if HAVE_MPI
    \n+
    17#include <mpi.h>
    \n+
    18#endif
    \n
    19
    \n-
    20#include <complex>
    \n-
    21#include <cstddef>
    \n-
    22#include <cstdint>
    \n-
    23#include <type_traits>
    \n-
    24#include <utility>
    \n-
    25
    \n-
    26#include <mpi.h>
    \n+\n+\n+\n+\n+
    24
    \n+
    25namespace Dune
    \n+
    26{
    \n
    27
    \n-
    28namespace Dune
    \n-
    29{
    \n-
    39 template<typename T>
    \n-
    \n-
    40 struct MPITraits
    \n-
    41 {
    \n-
    42 private:
    \n-
    43 MPITraits(){}
    \n-
    44 MPITraits(const MPITraits&){}
    \n-
    45 static MPI_Datatype datatype;
    \n-
    46 static MPI_Datatype vectortype;
    \n-
    47 public:
    \n-
    \n-
    48 static inline MPI_Datatype getType()
    \n-
    49 {
    \n-
    50 if(datatype==MPI_DATATYPE_NULL) {
    \n-
    51 MPI_Type_contiguous(sizeof(T),MPI_BYTE,&datatype);
    \n-
    52 MPI_Type_commit(&datatype);
    \n-
    53 }
    \n-
    54 return datatype;
    \n-
    55 }
    \n-
    \n-
    56 static constexpr bool is_intrinsic = false;
    \n-
    57 };
    \n-
    \n-
    58 template<class T>
    \n-
    59 MPI_Datatype MPITraits<T>::datatype = MPI_DATATYPE_NULL;
    \n-
    60
    \n-
    61#ifndef DOXYGEN
    \n-
    62
    \n-
    63 // A Macro for defining traits for the primitive data types
    \n-
    64#define ComposeMPITraits(p,m) \\
    \n-
    65 template<> \\
    \n-
    66 struct MPITraits<p>{ \\
    \n-
    67 static inline MPI_Datatype getType(){ \\
    \n-
    68 return m; \\
    \n-
    69 } \\
    \n-
    70 static constexpr bool is_intrinsic = true; \\
    \n-
    71 }
    \n-
    72
    \n-
    73 ComposeMPITraits(char, MPI_CHAR);
    \n-
    74 ComposeMPITraits(unsigned char,MPI_UNSIGNED_CHAR);
    \n-
    75 ComposeMPITraits(short,MPI_SHORT);
    \n-
    76 ComposeMPITraits(unsigned short,MPI_UNSIGNED_SHORT);
    \n-
    77 ComposeMPITraits(int,MPI_INT);
    \n-
    78 ComposeMPITraits(unsigned int,MPI_UNSIGNED);
    \n-
    79 ComposeMPITraits(long,MPI_LONG);
    \n-
    80 ComposeMPITraits(unsigned long,MPI_UNSIGNED_LONG);
    \n-
    81 ComposeMPITraits(float,MPI_FLOAT);
    \n-
    82 ComposeMPITraits(double,MPI_DOUBLE);
    \n-
    83 ComposeMPITraits(long double,MPI_LONG_DOUBLE);
    \n-
    84 ComposeMPITraits(std::complex<double>, MPI_CXX_DOUBLE_COMPLEX);
    \n-
    85 ComposeMPITraits(std::complex<long double>, MPI_CXX_LONG_DOUBLE_COMPLEX);
    \n-
    86 ComposeMPITraits(std::complex<float>, MPI_CXX_FLOAT_COMPLEX);
    \n-
    87
    \n-
    88
    \n-
    89#undef ComposeMPITraits
    \n+
    28#ifndef DOXYGEN
    \n+
    29
    \n+
    30 /*
    \n+
    31 Interface class for the communication needed by MPIGuard
    \n+
    32 */
    \n+
    33 struct GuardCommunicator
    \n+
    34 {
    \n+
    35 // cleanup
    \n+
    36 virtual ~GuardCommunicator() {};
    \n+
    37 // all the communication methods we need
    \n+
    38 virtual int rank() = 0;
    \n+
    39 virtual int size() = 0;
    \n+
    40 virtual int sum(int i) = 0;
    \n+
    41 // create a new GuardCommunicator pointer
    \n+
    42 template <class C>
    \n+
    43 static GuardCommunicator * create(const Communication<C> & c);
    \n+
    44#if HAVE_MPI
    \n+
    45 inline
    \n+
    46 static GuardCommunicator * create(const MPI_Comm & c);
    \n+
    47#endif
    \n+
    48 };
    \n+
    49
    \n+
    50 namespace {
    \n+
    51 /*
    \n+
    52 templated implementation of different communication classes
    \n+
    53 */
    \n+
    54 // the default class will always fail, due to the missing implementation of "sum"
    \n+
    55 template <class Imp>
    \n+
    56 struct GenericGuardCommunicator
    \n+
    57 : public GuardCommunicator
    \n+
    58 {};
    \n+
    59 // specialization for Communication
    \n+
    60 template <class T>
    \n+
    61 struct GenericGuardCommunicator< Communication<T> >
    \n+
    62 : public GuardCommunicator
    \n+
    63 {
    \n+
    64 const Communication<T> comm;
    \n+
    65 GenericGuardCommunicator(const Communication<T> & c) :
    \n+
    66 comm(c) {}
    \n+
    67 int rank() override { return comm.rank(); };
    \n+
    68 int size() override { return comm.size(); };
    \n+
    69 int sum(int i) override { return comm.sum(i); }
    \n+
    70 };
    \n+
    71
    \n+
    72#if HAVE_MPI
    \n+
    73 // specialization for MPI_Comm
    \n+
    74 template <>
    \n+
    75 struct GenericGuardCommunicator<MPI_Comm>
    \n+
    76 : public GenericGuardCommunicator< Communication<MPI_Comm> >
    \n+
    77 {
    \n+
    78 GenericGuardCommunicator(const MPI_Comm & c) :
    \n+
    79 GenericGuardCommunicator< Communication<MPI_Comm> >(
    \n+
    80 Communication<MPI_Comm>(c)) {}
    \n+
    81 };
    \n+
    82#endif
    \n+
    83 } // anonymous namespace
    \n+
    84
    \n+
    85 template<class C>
    \n+
    86 GuardCommunicator * GuardCommunicator::create(const Communication<C> & comm)
    \n+
    87 {
    \n+
    88 return new GenericGuardCommunicator< Communication<C> >(comm);
    \n+
    89 }
    \n
    90
    \n-
    91 template<class K, int n> class FieldVector;
    \n-
    92
    \n-
    93 template<class K, int n>
    \n-
    94 struct MPITraits<FieldVector<K,n> >
    \n-
    95 {
    \n-
    96 static MPI_Datatype datatype;
    \n-
    97 static MPI_Datatype vectortype;
    \n-
    98
    \n-
    99 static inline MPI_Datatype getType()
    \n-
    100 {
    \n-
    101 if(datatype==MPI_DATATYPE_NULL) {
    \n-
    102 MPI_Type_contiguous(n, MPITraits<K>::getType(), &vectortype);
    \n-
    103 MPI_Type_commit(&vectortype);
    \n-
    104 FieldVector<K,n> fvector;
    \n-
    105 MPI_Aint base;
    \n-
    106 MPI_Aint displ;
    \n-
    107 MPI_Get_address(&fvector, &base);
    \n-
    108 MPI_Get_address(&(fvector[0]), &displ);
    \n-
    109 displ -= base;
    \n-
    110 int length[1]={1};
    \n-
    111
    \n-
    112 MPI_Type_create_struct(1, length, &displ, &vectortype, &datatype);
    \n-
    113 MPI_Type_commit(&datatype);
    \n-
    114 }
    \n-
    115 return datatype;
    \n-
    116 }
    \n-
    117
    \n-
    118 };
    \n-
    119
    \n-
    120 template<class K, int n>
    \n-
    121 MPI_Datatype MPITraits<FieldVector<K,n> >::datatype = MPI_DATATYPE_NULL;
    \n-
    122 template<class K, int n>
    \n-
    123 MPI_Datatype MPITraits<FieldVector<K,n> >::vectortype = {MPI_DATATYPE_NULL};
    \n-
    124
    \n-
    125
    \n-
    126 template<int k>
    \n-
    127 class bigunsignedint;
    \n-
    128
    \n-
    129 template<int k>
    \n-
    130 struct MPITraits<bigunsignedint<k> >
    \n-
    131 {
    \n-
    132 static MPI_Datatype datatype;
    \n-
    133 static MPI_Datatype vectortype;
    \n-
    134
    \n-
    135 static inline MPI_Datatype getType()
    \n-
    136 {
    \n-
    137 if(datatype==MPI_DATATYPE_NULL) {
    \n-\n-
    139 &vectortype);
    \n-
    140 //MPI_Type_commit(&vectortype);
    \n-
    141 bigunsignedint<k> data;
    \n-
    142 MPI_Aint base;
    \n-
    143 MPI_Aint displ;
    \n-
    144 MPI_Get_address(&data, &base);
    \n-
    145 MPI_Get_address(&(data.digit), &displ);
    \n-
    146 displ -= base;
    \n-
    147 int length[1]={1};
    \n-
    148 MPI_Type_create_struct(1, length, &displ, &vectortype, &datatype);
    \n-
    149 MPI_Type_commit(&datatype);
    \n-
    150 }
    \n-
    151 return datatype;
    \n-
    152 }
    \n-
    153 };
    \n-
    154}
    \n+
    91#if HAVE_MPI
    \n+
    92 GuardCommunicator * GuardCommunicator::create(const MPI_Comm & comm)
    \n+
    93 {
    \n+
    94 return new GenericGuardCommunicator< Communication<MPI_Comm> >(comm);
    \n+
    95 }
    \n+
    96#endif
    \n+
    97
    \n+
    98#endif
    \n+
    99
    \n+
    103 class MPIGuardError : public ParallelError {};
    \n+
    104
    \n+
    \n+\n+
    138 {
    \n+
    139 GuardCommunicator * comm_;
    \n+
    140 bool active_;
    \n+
    141
    \n+
    142 // we don't want to copy this class
    \n+
    143 MPIGuard (const MPIGuard &);
    \n+
    144
    \n+
    145 public:
    \n+
    \n+
    150 MPIGuard (bool active=true) :
    \n+
    151 comm_(GuardCommunicator::create(
    \n+
    152 MPIHelper::getCommunication())),
    \n+
    153 active_(active)
    \n+
    154 {}
    \n+
    \n
    155
    \n-
    156namespace Dune
    \n-
    157{
    \n-
    158 template<int k>
    \n-
    159 MPI_Datatype MPITraits<bigunsignedint<k> >::datatype = MPI_DATATYPE_NULL;
    \n-
    160 template<int k>
    \n-
    161 MPI_Datatype MPITraits<bigunsignedint<k> >::vectortype = MPI_DATATYPE_NULL;
    \n-
    162
    \n-
    163 template<typename T1, typename T2>
    \n-
    164 struct MPITraits<std::pair<T1,T2 > >
    \n-
    165 {
    \n-
    166 public:
    \n-
    167 inline static MPI_Datatype getType();
    \n-
    168 private:
    \n-
    169 static MPI_Datatype type;
    \n-
    170 };
    \n-
    171 template<typename T1, typename T2>
    \n-
    172 MPI_Datatype MPITraits<std::pair<T1,T2> >::getType()
    \n-
    173 {
    \n-
    174 if(type==MPI_DATATYPE_NULL) {
    \n-
    175 int length[2] = {1, 1};
    \n-
    176 MPI_Aint disp[2];
    \n-
    177 MPI_Datatype types[2] = {MPITraits<T1>::getType(),
    \n-\n-
    179
    \n-
    180 using Pair = std::pair<T1, T2>;
    \n-
    181 static_assert(std::is_standard_layout<Pair>::value, "offsetof() is only defined for standard layout types");
    \n-
    182 disp[0] = offsetof(Pair, first);
    \n-
    183 disp[1] = offsetof(Pair, second);
    \n-
    184
    \n-
    185 MPI_Datatype tmp;
    \n-
    186 MPI_Type_create_struct(2, length, disp, types, &tmp);
    \n-
    187
    \n-
    188 MPI_Type_create_resized(tmp, 0, sizeof(Pair), &type);
    \n-
    189 MPI_Type_commit(&type);
    \n-
    190
    \n-
    191 MPI_Type_free(&tmp);
    \n-
    192 }
    \n-
    193 return type;
    \n-
    194 }
    \n-
    195
    \n-
    196 template<typename T1, typename T2>
    \n-
    197 MPI_Datatype MPITraits<std::pair<T1,T2> >::type=MPI_DATATYPE_NULL;
    \n-
    198
    \n-
    199#endif // !DOXYGEN
    \n-
    200
    \n-
    201} // namespace Dune
    \n-
    202
    \n-
    203#endif // HAVE_MPI
    \n-
    204
    \n-
    207#endif // DUNE_COMMON_PARALLEL_MPITRAITS_HH
    \n-
    STL namespace.
    \n+
    \n+
    161 MPIGuard (MPIHelper & m, bool active=true) :
    \n+
    162 comm_(GuardCommunicator::create(
    \n+
    163 m.getCommunication())),
    \n+
    164 active_(active)
    \n+
    165 {}
    \n+
    \n+
    166
    \n+
    177 template <class C>
    \n+
    \n+
    178 MPIGuard (const C & comm, bool active=true) :
    \n+
    179 comm_(GuardCommunicator::create(comm)),
    \n+
    180 active_(active)
    \n+
    181 {}
    \n+
    \n+
    182
    \n+
    183#if HAVE_MPI
    \n+
    \n+
    184 MPIGuard (const MPI_Comm & comm, bool active=true) :
    \n+
    185 comm_(GuardCommunicator::create(comm)),
    \n+
    186 active_(active)
    \n+
    187 {}
    \n+
    \n+
    188#endif
    \n+
    189
    \n+
    \n+\n+
    193 {
    \n+
    194 if (active_)
    \n+
    195 {
    \n+
    196 active_ = false;
    \n+
    197 finalize(false);
    \n+
    198 }
    \n+
    199 delete comm_;
    \n+
    200 }
    \n+
    \n+
    201
    \n+
    \n+
    206 void reactivate() {
    \n+
    207 if (active_ == true)
    \n+
    208 finalize();
    \n+
    209 active_ = true;
    \n+
    210 }
    \n+
    \n+
    211
    \n+
    \n+
    222 void finalize(bool success = true)
    \n+
    223 {
    \n+
    224 int result = success ? 0 : 1;
    \n+
    225 bool was_active = active_;
    \n+
    226 active_ = false;
    \n+
    227 result = comm_->sum(result);
    \n+
    228 if (result>0 && was_active)
    \n+
    229 {
    \n+
    230 DUNE_THROW(MPIGuardError, "Terminating process "
    \n+
    231 << comm_->rank() << " due to "
    \n+
    232 << result << " remote error(s)");
    \n+
    233 }
    \n+
    234 }
    \n+
    \n+
    235 };
    \n+
    \n+
    236
    \n+
    237}
    \n+
    238
    \n+
    239#endif // DUNE_COMMON_PARALLEL_MPIGUARD_HH
    \n+
    Helpers for dealing with MPI.
    \n+
    Implements an utility class that provides collective communication methods for sequential programs.
    \n+
    Implements an utility class that provides MPI's collective communication methods.
    \n+
    A few common exception classes.
    \n+
    #define DUNE_THROW(E, m)
    Definition exceptions.hh:218
    \n
    Dune namespace.
    Definition alignedallocator.hh:13
    \n-
    A traits class describing the mapping of types onto MPI_Datatypes.
    Definition mpitraits.hh:41
    \n-
    static MPI_Datatype getType()
    Definition mpitraits.hh:48
    \n-
    static constexpr bool is_intrinsic
    Definition mpitraits.hh:56
    \n-
    static constexpr int n
    Definition bigunsignedint.hh:78
    \n-
    vector space out of a tensor product of fields.
    Definition fvector.hh:91
    \n+
    Default exception if an error in the parallel communication of the program occurred.
    Definition exceptions.hh:287
    \n+
    This exception is thrown if the MPIGuard detects an error on a remote process.
    Definition mpiguard.hh:103
    \n+
    detects a thrown exception and communicates to all other processes
    Definition mpiguard.hh:138
    \n+
    void reactivate()
    reactivate the guard.
    Definition mpiguard.hh:206
    \n+
    void finalize(bool success=true)
    stop the guard.
    Definition mpiguard.hh:222
    \n+
    ~MPIGuard()
    destroy the guard and check for undetected exceptions
    Definition mpiguard.hh:192
    \n+
    MPIGuard(const C &comm, bool active=true)
    create an MPIGuard operating on an arbitrary communicator.
    Definition mpiguard.hh:178
    \n+
    MPIGuard(const MPI_Comm &comm, bool active=true)
    Definition mpiguard.hh:184
    \n+
    MPIGuard(bool active=true)
    create an MPIGuard operating on the Communicator of the global Dune::MPIHelper
    Definition mpiguard.hh:150
    \n+
    MPIGuard(MPIHelper &m, bool active=true)
    create an MPIGuard operating on the Communicator of a special Dune::MPIHelper m
    Definition mpiguard.hh:161
    \n+
    A real mpi helper.
    Definition mpihelper.hh:181
    \n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,221 +1,231 @@\n dune-common\u00a02.10\n Loading...\n Searching...\n No Matches\n * _\bd_\bu_\bn_\be\n * _\bc_\bo_\bm_\bm_\bo_\bn\n * _\bp_\ba_\br_\ba_\bl_\bl_\be_\bl\n-mpitraits.hh\n+mpiguard.hh\n _\bG_\bo_\b _\bt_\bo_\b _\bt_\bh_\be_\b _\bd_\bo_\bc_\bu_\bm_\be_\bn_\bt_\ba_\bt_\bi_\bo_\bn_\b _\bo_\bf_\b _\bt_\bh_\bi_\bs_\b _\bf_\bi_\bl_\be_\b.\n 1// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-\n 2// vi: set et ts=4 sw=2 sts=2:\n 3// SPDX-FileCopyrightInfo: Copyright \u00c2\u00a9 DUNE Project contributors, see file\n LICENSE.md in module root\n 4// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception\n-5#ifndef DUNE_COMMON_PARALLEL_MPITRAITS_HH\n-6#define DUNE_COMMON_PARALLEL_MPITRAITS_HH\n-7\n-18#if HAVE_MPI\n+5\n+13#ifndef DUNE_COMMON_PARALLEL_MPIGUARD_HH\n+14#define DUNE_COMMON_PARALLEL_MPIGUARD_HH\n+15\n+16#if HAVE_MPI\n+17#include \n+18#endif\n 19\n-20#include \n-21#include \n-22#include \n-23#include \n-24#include \n-25\n-26#include \n+20#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\be_\bx_\bc_\be_\bp_\bt_\bi_\bo_\bn_\bs_\b._\bh_\bh>\n+21#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bp_\ba_\br_\ba_\bl_\bl_\be_\bl_\b/_\bc_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b._\bh_\bh>\n+22#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bp_\ba_\br_\ba_\bl_\bl_\be_\bl_\b/_\bm_\bp_\bi_\bc_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b._\bh_\bh>\n+23#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bp_\ba_\br_\ba_\bl_\bl_\be_\bl_\b/_\bm_\bp_\bi_\bh_\be_\bl_\bp_\be_\br_\b._\bh_\bh>\n+24\n+25namespace _\bD_\bu_\bn_\be\n+26{\n 27\n-28namespace _\bD_\bu_\bn_\be\n-29{\n-39 template\n-_\b4_\b0 struct _\bM_\bP_\bI_\bT_\br_\ba_\bi_\bt_\bs\n-41 {\n-42 private:\n-43 _\bM_\bP_\bI_\bT_\br_\ba_\bi_\bt_\bs(){}\n-44 _\bM_\bP_\bI_\bT_\br_\ba_\bi_\bt_\bs(const _\bM_\bP_\bI_\bT_\br_\ba_\bi_\bt_\bs&){}\n-45 static MPI_Datatype datatype;\n-46 static MPI_Datatype vectortype;\n-47 public:\n-_\b4_\b8 static inline MPI_Datatype _\bg_\be_\bt_\bT_\by_\bp_\be()\n-49 {\n-50 if(datatype==MPI_DATATYPE_NULL) {\n-51 MPI_Type_contiguous(sizeof(T),MPI_BYTE,&datatype);\n-52 MPI_Type_commit(&datatype);\n-53 }\n-54 return datatype;\n-55 }\n-_\b5_\b6 static constexpr bool _\bi_\bs_\b__\bi_\bn_\bt_\br_\bi_\bn_\bs_\bi_\bc = false;\n-57 };\n-58 template\n-59 MPI_Datatype _\bM_\bP_\bI_\bT_\br_\ba_\bi_\bt_\bs_\b<_\bT_\b>_\b:_\b:_\bd_\ba_\bt_\ba_\bt_\by_\bp_\be = MPI_DATATYPE_NULL;\n-60\n-61#ifndef DOXYGEN\n-62\n-63 // A Macro for defining traits for the primitive data types\n-64#define ComposeMPITraits(p,m) \\\n-65 template<> \\\n-66 struct MPITraits

    { \\\n-67 static inline MPI_Datatype getType(){ \\\n-68 return m; \\\n-69 } \\\n-70 static constexpr bool is_intrinsic = true; \\\n-71 }\n-72\n-73 ComposeMPITraits(char, MPI_CHAR);\n-74 ComposeMPITraits(unsigned char,MPI_UNSIGNED_CHAR);\n-75 ComposeMPITraits(short,MPI_SHORT);\n-76 ComposeMPITraits(unsigned short,MPI_UNSIGNED_SHORT);\n-77 ComposeMPITraits(int,MPI_INT);\n-78 ComposeMPITraits(unsigned int,MPI_UNSIGNED);\n-79 ComposeMPITraits(long,MPI_LONG);\n-80 ComposeMPITraits(unsigned long,MPI_UNSIGNED_LONG);\n-81 ComposeMPITraits(float,MPI_FLOAT);\n-82 ComposeMPITraits(double,MPI_DOUBLE);\n-83 ComposeMPITraits(long double,MPI_LONG_DOUBLE);\n-84 ComposeMPITraits(std::complex, MPI_CXX_DOUBLE_COMPLEX);\n-85 ComposeMPITraits(std::complex, MPI_CXX_LONG_DOUBLE_COMPLEX);\n-86 ComposeMPITraits(std::complex, MPI_CXX_FLOAT_COMPLEX);\n-87\n-88\n-89#undef ComposeMPITraits\n+28#ifndef DOXYGEN\n+29\n+30 /*\n+31 Interface class for the communication needed by MPIGuard\n+32 */\n+33 struct GuardCommunicator\n+34 {\n+35 // cleanup\n+36 virtual ~GuardCommunicator() {};\n+37 // all the communication methods we need\n+38 virtual int rank() = 0;\n+39 virtual int size() = 0;\n+40 virtual int sum(int i) = 0;\n+41 // create a new GuardCommunicator pointer\n+42 template \n+43 static GuardCommunicator * create(const Communication & c);\n+44#if HAVE_MPI\n+45 inline\n+46 static GuardCommunicator * create(const MPI_Comm & c);\n+47#endif\n+48 };\n+49\n+50 namespace {\n+51 /*\n+52 templated implementation of different communication classes\n+53 */\n+54 // the default class will always fail, due to the missing implementation of\n+\"sum\"\n+55 template \n+56 struct GenericGuardCommunicator\n+57 : public GuardCommunicator\n+58 {};\n+59 // specialization for Communication\n+60 template \n+61 struct GenericGuardCommunicator< Communication >\n+62 : public GuardCommunicator\n+63 {\n+64 const Communication comm;\n+65 GenericGuardCommunicator(const Communication & c) :\n+66 comm(c) {}\n+67 int rank() override { return comm.rank(); };\n+68 int size() override { return comm.size(); };\n+69 int sum(int i) override { return comm.sum(i); }\n+70 };\n+71\n+72#if HAVE_MPI\n+73 // specialization for MPI_Comm\n+74 template <>\n+75 struct GenericGuardCommunicator\n+76 : public GenericGuardCommunicator< Communication >\n+77 {\n+78 GenericGuardCommunicator(const MPI_Comm & c) :\n+79 GenericGuardCommunicator< Communication >(\n+80 Communication(c)) {}\n+81 };\n+82#endif\n+83 } // anonymous namespace\n+84\n+85 template\n+86 GuardCommunicator * GuardCommunicator::create(const Communication & comm)\n+87 {\n+88 return new GenericGuardCommunicator< Communication >(comm);\n+89 }\n 90\n-91 template class _\bF_\bi_\be_\bl_\bd_\bV_\be_\bc_\bt_\bo_\br;\n-92\n-93 template\n-94 struct _\bM_\bP_\bI_\bT_\br_\ba_\bi_\bt_\bs<_\bF_\bi_\be_\bl_\bd_\bV_\be_\bc_\bt_\bo_\br >\n-95 {\n-96 static MPI_Datatype datatype;\n-97 static MPI_Datatype vectortype;\n-98\n-99 static inline MPI_Datatype _\bg_\be_\bt_\bT_\by_\bp_\be()\n-100 {\n-101 if(datatype==MPI_DATATYPE_NULL) {\n-102 MPI_Type_contiguous(n, _\bM_\bP_\bI_\bT_\br_\ba_\bi_\bt_\bs_\b<_\bK_\b>_\b:_\b:_\bg_\be_\bt_\bT_\by_\bp_\be(), &vectortype);\n-103 MPI_Type_commit(&vectortype);\n-104 _\bF_\bi_\be_\bl_\bd_\bV_\be_\bc_\bt_\bo_\br_\b<_\bK_\b,_\bn_\b> fvector;\n-105 MPI_Aint base;\n-106 MPI_Aint displ;\n-107 MPI_Get_address(&fvector, &base);\n-108 MPI_Get_address(&(fvector[0]), &displ);\n-109 displ -= base;\n-110 int length[1]={1};\n-111\n-112 MPI_Type_create_struct(1, length, &displ, &vectortype, &datatype);\n-113 MPI_Type_commit(&datatype);\n-114 }\n-115 return datatype;\n-116 }\n-117\n-118 };\n-119\n-120 template\n-121 MPI_Datatype MPITraits >::datatype = MPI_DATATYPE_NULL;\n-122 template\n-123 MPI_Datatype MPITraits >::vectortype =\n-{MPI_DATATYPE_NULL};\n-124\n-125\n-126 template\n-127 class bigunsignedint;\n-128\n-129 template\n-130 struct MPITraits >\n-131 {\n-132 static MPI_Datatype datatype;\n-133 static MPI_Datatype vectortype;\n-134\n-135 static inline MPI_Datatype _\bg_\be_\bt_\bT_\by_\bp_\be()\n-136 {\n-137 if(datatype==MPI_DATATYPE_NULL) {\n-138 MPI_Type_contiguous(_\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt_\b<_\bk_\b>_\b:_\b:_\bn, _\bM_\bP_\bI_\bT_\br_\ba_\bi_\bt_\bs_\b<_\bs_\bt_\bd_\b:_\b:_\bu_\bi_\bn_\bt_\b1_\b6_\b__\bt_\b>_\b:_\b:_\bg_\be_\bt_\bT_\by_\bp_\be\n-(),\n-139 &vectortype);\n-140 //MPI_Type_commit(&vectortype);\n-141 bigunsignedint data;\n-142 MPI_Aint base;\n-143 MPI_Aint displ;\n-144 MPI_Get_address(&data, &base);\n-145 MPI_Get_address(&(data.digit), &displ);\n-146 displ -= base;\n-147 int length[1]={1};\n-148 MPI_Type_create_struct(1, length, &displ, &vectortype, &datatype);\n-149 MPI_Type_commit(&datatype);\n-150 }\n-151 return datatype;\n-152 }\n-153 };\n-154}\n+91#if HAVE_MPI\n+92 GuardCommunicator * GuardCommunicator::create(const MPI_Comm & comm)\n+93 {\n+94 return new GenericGuardCommunicator< Communication >(comm);\n+95 }\n+96#endif\n+97\n+98#endif\n+99\n+_\b1_\b0_\b3 class _\bM_\bP_\bI_\bG_\bu_\ba_\br_\bd_\bE_\br_\br_\bo_\br : public _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bE_\br_\br_\bo_\br {};\n+104\n+_\b1_\b3_\b7 class _\bM_\bP_\bI_\bG_\bu_\ba_\br_\bd\n+138 {\n+139 GuardCommunicator * comm_;\n+140 bool active_;\n+141\n+142 // we don't want to copy this class\n+143 _\bM_\bP_\bI_\bG_\bu_\ba_\br_\bd (const _\bM_\bP_\bI_\bG_\bu_\ba_\br_\bd &);\n+144\n+145 public:\n+_\b1_\b5_\b0 _\bM_\bP_\bI_\bG_\bu_\ba_\br_\bd (bool active=true) :\n+151 comm_(GuardCommunicator::create(\n+152 _\bM_\bP_\bI_\bH_\be_\bl_\bp_\be_\br::getCommunication())),\n+153 active_(active)\n+154 {}\n 155\n-156namespace _\bD_\bu_\bn_\be\n-157{\n-158 template\n-159 MPI_Datatype MPITraits >::datatype = MPI_DATATYPE_NULL;\n-160 template\n-161 MPI_Datatype MPITraits >::vectortype = MPI_DATATYPE_NULL;\n-162\n-163 template\n-164 struct MPITraits<_\bs_\bt_\bd::pair >\n-165 {\n-166 public:\n-167 inline static MPI_Datatype _\bg_\be_\bt_\bT_\by_\bp_\be();\n-168 private:\n-169 static MPI_Datatype type;\n-170 };\n-171 template\n-172 MPI_Datatype MPITraits >::getType()\n-173 {\n-174 if(type==MPI_DATATYPE_NULL) {\n-175 int length[2] = {1, 1};\n-176 MPI_Aint disp[2];\n-177 MPI_Datatype types[2] = {_\bM_\bP_\bI_\bT_\br_\ba_\bi_\bt_\bs_\b<_\bT_\b1_\b>_\b:_\b:_\bg_\be_\bt_\bT_\by_\bp_\be(),\n-178 _\bM_\bP_\bI_\bT_\br_\ba_\bi_\bt_\bs_\b<_\bT_\b2_\b>_\b:_\b:_\bg_\be_\bt_\bT_\by_\bp_\be()};\n-179\n-180 using Pair = std::pair;\n-181 static_assert(std::is_standard_layout::value, \"offsetof() is only\n-defined for standard layout types\");\n-182 disp[0] = offsetof(Pair, first);\n-183 disp[1] = offsetof(Pair, second);\n-184\n-185 MPI_Datatype tmp;\n-186 MPI_Type_create_struct(2, length, disp, types, &tmp);\n-187\n-188 MPI_Type_create_resized(tmp, 0, sizeof(Pair), &type);\n-189 MPI_Type_commit(&type);\n-190\n-191 MPI_Type_free(&tmp);\n-192 }\n-193 return type;\n-194 }\n-195\n-196 template\n-197 MPI_Datatype MPITraits >::type=MPI_DATATYPE_NULL;\n-198\n-199#endif // !DOXYGEN\n-200\n-201} // namespace Dune\n-202\n-203#endif // HAVE_MPI\n-204\n-207#endif // DUNE_COMMON_PARALLEL_MPITRAITS_HH\n-_\bs_\bt_\bd\n-STL namespace.\n+_\b1_\b6_\b1 _\bM_\bP_\bI_\bG_\bu_\ba_\br_\bd (_\bM_\bP_\bI_\bH_\be_\bl_\bp_\be_\br & m, bool active=true) :\n+162 comm_(GuardCommunicator::create(\n+163 m.getCommunication())),\n+164 active_(active)\n+165 {}\n+166\n+177 template \n+_\b1_\b7_\b8 _\bM_\bP_\bI_\bG_\bu_\ba_\br_\bd (const C & comm, bool active=true) :\n+179 comm_(GuardCommunicator::create(comm)),\n+180 active_(active)\n+181 {}\n+182\n+183#if HAVE_MPI\n+_\b1_\b8_\b4 _\bM_\bP_\bI_\bG_\bu_\ba_\br_\bd (const MPI_Comm & comm, bool active=true) :\n+185 comm_(GuardCommunicator::create(comm)),\n+186 active_(active)\n+187 {}\n+188#endif\n+189\n+_\b1_\b9_\b2 _\b~_\bM_\bP_\bI_\bG_\bu_\ba_\br_\bd()\n+193 {\n+194 if (active_)\n+195 {\n+196 active_ = false;\n+197 _\bf_\bi_\bn_\ba_\bl_\bi_\bz_\be(false);\n+198 }\n+199 delete comm_;\n+200 }\n+201\n+_\b2_\b0_\b6 void _\br_\be_\ba_\bc_\bt_\bi_\bv_\ba_\bt_\be() {\n+207 if (active_ == true)\n+208 _\bf_\bi_\bn_\ba_\bl_\bi_\bz_\be();\n+209 active_ = true;\n+210 }\n+211\n+_\b2_\b2_\b2 void _\bf_\bi_\bn_\ba_\bl_\bi_\bz_\be(bool success = true)\n+223 {\n+224 int result = success ? 0 : 1;\n+225 bool was_active = active_;\n+226 active_ = false;\n+227 result = comm_->sum(result);\n+228 if (result>0 && was_active)\n+229 {\n+230 _\bD_\bU_\bN_\bE_\b__\bT_\bH_\bR_\bO_\bW(_\bM_\bP_\bI_\bG_\bu_\ba_\br_\bd_\bE_\br_\br_\bo_\br, \"Terminating process \"\n+231 << comm_->rank() << \" due to \"\n+232 << result << \" remote error(s)\");\n+233 }\n+234 }\n+235 };\n+236\n+237}\n+238\n+239#endif // DUNE_COMMON_PARALLEL_MPIGUARD_HH\n+_\bm_\bp_\bi_\bh_\be_\bl_\bp_\be_\br_\b._\bh_\bh\n+Helpers for dealing with MPI.\n+_\bc_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b._\bh_\bh\n+Implements an utility class that provides collective communication methods for\n+sequential programs.\n+_\bm_\bp_\bi_\bc_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b._\bh_\bh\n+Implements an utility class that provides MPI's collective communication\n+methods.\n+_\be_\bx_\bc_\be_\bp_\bt_\bi_\bo_\bn_\bs_\b._\bh_\bh\n+A few common exception classes.\n+_\bD_\bU_\bN_\bE_\b__\bT_\bH_\bR_\bO_\bW\n+#define DUNE_THROW(E, m)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn exceptions.hh:218\n _\bD_\bu_\bn_\be\n Dune namespace.\n D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn alignedallocator.hh:13\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\bP_\bI_\bT_\br_\ba_\bi_\bt_\bs\n-A traits class describing the mapping of types onto MPI_Datatypes.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mpitraits.hh:41\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\bP_\bI_\bT_\br_\ba_\bi_\bt_\bs_\b:_\b:_\bg_\be_\bt_\bT_\by_\bp_\be\n-static MPI_Datatype getType()\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mpitraits.hh:48\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\bP_\bI_\bT_\br_\ba_\bi_\bt_\bs_\b:_\b:_\bi_\bs_\b__\bi_\bn_\bt_\br_\bi_\bn_\bs_\bi_\bc\n-static constexpr bool is_intrinsic\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mpitraits.hh:56\n-_\bD_\bu_\bn_\be_\b:_\b:_\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt_\b:_\b:_\bn\n-static constexpr int n\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bigunsignedint.hh:78\n-_\bD_\bu_\bn_\be_\b:_\b:_\bF_\bi_\be_\bl_\bd_\bV_\be_\bc_\bt_\bo_\br\n-vector space out of a tensor product of fields.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn fvector.hh:91\n+_\bD_\bu_\bn_\be_\b:_\b:_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bE_\br_\br_\bo_\br\n+Default exception if an error in the parallel communication of the program\n+occurred.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn exceptions.hh:287\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\bP_\bI_\bG_\bu_\ba_\br_\bd_\bE_\br_\br_\bo_\br\n+This exception is thrown if the MPIGuard detects an error on a remote process.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mpiguard.hh:103\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\bP_\bI_\bG_\bu_\ba_\br_\bd\n+detects a thrown exception and communicates to all other processes\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mpiguard.hh:138\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\bP_\bI_\bG_\bu_\ba_\br_\bd_\b:_\b:_\br_\be_\ba_\bc_\bt_\bi_\bv_\ba_\bt_\be\n+void reactivate()\n+reactivate the guard.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mpiguard.hh:206\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\bP_\bI_\bG_\bu_\ba_\br_\bd_\b:_\b:_\bf_\bi_\bn_\ba_\bl_\bi_\bz_\be\n+void finalize(bool success=true)\n+stop the guard.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mpiguard.hh:222\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\bP_\bI_\bG_\bu_\ba_\br_\bd_\b:_\b:_\b~_\bM_\bP_\bI_\bG_\bu_\ba_\br_\bd\n+~MPIGuard()\n+destroy the guard and check for undetected exceptions\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mpiguard.hh:192\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\bP_\bI_\bG_\bu_\ba_\br_\bd_\b:_\b:_\bM_\bP_\bI_\bG_\bu_\ba_\br_\bd\n+MPIGuard(const C &comm, bool active=true)\n+create an MPIGuard operating on an arbitrary communicator.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mpiguard.hh:178\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\bP_\bI_\bG_\bu_\ba_\br_\bd_\b:_\b:_\bM_\bP_\bI_\bG_\bu_\ba_\br_\bd\n+MPIGuard(const MPI_Comm &comm, bool active=true)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mpiguard.hh:184\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\bP_\bI_\bG_\bu_\ba_\br_\bd_\b:_\b:_\bM_\bP_\bI_\bG_\bu_\ba_\br_\bd\n+MPIGuard(bool active=true)\n+create an MPIGuard operating on the Communicator of the global Dune::MPIHelper\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mpiguard.hh:150\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\bP_\bI_\bG_\bu_\ba_\br_\bd_\b:_\b:_\bM_\bP_\bI_\bG_\bu_\ba_\br_\bd\n+MPIGuard(MPIHelper &m, bool active=true)\n+create an MPIGuard operating on the Communicator of a special Dune::MPIHelper m\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mpiguard.hh:161\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\bP_\bI_\bH_\be_\bl_\bp_\be_\br\n+A real mpi helper.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mpihelper.hh:181\n ===============================================================================\n Generated by\u00a0_\b[_\bd_\bo_\bx_\by_\bg_\be_\bn_\b] 1.9.8\n"}]}, {"source1": "./usr/share/doc/libdune-common-doc/doxygen/a00074.html", "source2": "./usr/share/doc/libdune-common-doc/doxygen/a00074.html", "unified_diff": "@@ -1,15 +1,15 @@\n \n \n \n \n \n \n \n-dune-common: mpifuture.hh File Reference\n+dune-common: parmetis.hh File Reference\n \n \n \n \n \n \n \n@@ -69,53 +69,19 @@\n \n

    \n
    \n
    \n- \n-
    mpifuture.hh File Reference
    \n+
    parmetis.hh File Reference
    \n
    \n
    \n-
    #include <functional>
    \n-#include <memory>
    \n-#include <optional>
    \n-#include <type_traits>
    \n-#include <utility>
    \n-#include <mpi.h>
    \n-#include <dune/common/exceptions.hh>
    \n-#include <dune/common/parallel/communication.hh>
    \n-#include <dune/common/parallel/future.hh>
    \n-#include <dune/common/parallel/mpidata.hh>
    \n-
    \n+\n

    Go to the source code of this file.

    \n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-

    \n-Classes

    struct  Dune::impl::Buffer< T >
     
    struct  Dune::impl::Buffer< T & >
     
    struct  Dune::impl::Buffer< void >
     
    class  Dune::MPIFuture< R, S >
     Provides a future-like object for MPI communication. It contains the object that will be received and might contain also a sending object, which must be hold (keep alive) until the communication has been completed. More...
     
    \n-\n-\n-\n-\n-\n-\n-

    \n-Namespaces

    namespace  Dune
     Dune namespace.
     
    namespace  Dune::impl
     
    \n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,41 +1,11 @@\n dune-common\u00a02.10\n Loading...\n Searching...\n No Matches\n * _\bd_\bu_\bn_\be\n * _\bc_\bo_\bm_\bm_\bo_\bn\n * _\bp_\ba_\br_\ba_\bl_\bl_\be_\bl\n-_\bC_\bl_\ba_\bs_\bs_\be_\bs | _\bN_\ba_\bm_\be_\bs_\bp_\ba_\bc_\be_\bs\n-mpifuture.hh File Reference\n-#include \n-#include \n-#include \n-#include \n-#include \n-#include \n-#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\be_\bx_\bc_\be_\bp_\bt_\bi_\bo_\bn_\bs_\b._\bh_\bh>\n-#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bp_\ba_\br_\ba_\bl_\bl_\be_\bl_\b/_\bc_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b._\bh_\bh>\n-#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bp_\ba_\br_\ba_\bl_\bl_\be_\bl_\b/_\bf_\bu_\bt_\bu_\br_\be_\b._\bh_\bh>\n-#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bp_\ba_\br_\ba_\bl_\bl_\be_\bl_\b/_\bm_\bp_\bi_\bd_\ba_\bt_\ba_\b._\bh_\bh>\n+parmetis.hh File Reference\n _\bG_\bo_\b _\bt_\bo_\b _\bt_\bh_\be_\b _\bs_\bo_\bu_\br_\bc_\be_\b _\bc_\bo_\bd_\be_\b _\bo_\bf_\b _\bt_\bh_\bi_\bs_\b _\bf_\bi_\bl_\be_\b.\n-C\bCl\bla\bas\bss\bse\bes\bs\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bi_\bm_\bp_\bl_\b:_\b:_\bB_\bu_\bf_\bf_\be_\br_\b<_\b _\bT_\b _\b>\n-\u00a0\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bi_\bm_\bp_\bl_\b:_\b:_\bB_\bu_\bf_\bf_\be_\br_\b<_\b _\bT_\b _\b&_\b _\b>\n-\u00a0\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bi_\bm_\bp_\bl_\b:_\b:_\bB_\bu_\bf_\bf_\be_\br_\b<_\b _\bv_\bo_\bi_\bd_\b _\b>\n-\u00a0\n- class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bM_\bP_\bI_\bF_\bu_\bt_\bu_\br_\be_\b<_\b _\bR_\b,_\b _\bS_\b _\b>\n- Provides a future-like object for MPI communication. It contains the\n-\u00a0 object that will be received and might contain also a sending object,\n- which must be hold (keep alive) until the communication has been\n- completed. _\bM_\bo_\br_\be_\b._\b._\b.\n-\u00a0\n-N\bNa\bam\bme\bes\bsp\bpa\bac\bce\bes\bs\n-namespace \u00a0 _\bD_\bu_\bn_\be\n-\u00a0 _\bD_\bu_\bn_\be namespace.\n-\u00a0\n-namespace \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bi_\bm_\bp_\bl\n-\u00a0\n ===============================================================================\n Generated by\u00a0_\b[_\bd_\bo_\bx_\by_\bg_\be_\bn_\b] 1.9.8\n"}]}, {"source1": "./usr/share/doc/libdune-common-doc/doxygen/a00074_source.html", "source2": "./usr/share/doc/libdune-common-doc/doxygen/a00074_source.html", "unified_diff": "@@ -1,15 +1,15 @@\n \n \n \n \n \n \n \n-dune-common: mpifuture.hh Source File\n+dune-common: parmetis.hh Source File\n \n \n \n \n \n \n \n@@ -74,295 +74,61 @@\n \n \n \n
    \n-
    mpifuture.hh
    \n+
    parmetis.hh
    \n
    \n
    \n Go to the documentation of this file.
    1// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
    \n
    2// vi: set et ts=4 sw=2 sts=2:
    \n
    3// SPDX-FileCopyrightInfo: Copyright \u00a9 DUNE Project contributors, see file LICENSE.md in module root
    \n
    4// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception
    \n-
    5#ifndef DUNE_COMMON_PARALLEL_MPIFUTURE_HH
    \n-
    6#define DUNE_COMMON_PARALLEL_MPIFUTURE_HH
    \n+
    5#ifndef DUNE_PARMETIS_HH
    \n+
    6#define DUNE_PARMETIS_HH
    \n
    7
    \n-
    8#if HAVE_MPI
    \n-
    9
    \n-
    10#include <functional>
    \n-
    11#include <memory>
    \n-
    12#include <optional>
    \n-
    13#include <type_traits>
    \n-
    14#include <utility>
    \n-
    15
    \n-
    16#include <mpi.h>
    \n-
    17
    \n-\n-\n-\n-\n-
    22
    \n-
    23namespace Dune{
    \n-
    24
    \n-
    \n-
    25 namespace impl{
    \n-
    26 template<class T>
    \n-
    \n-
    27 struct Buffer{
    \n-
    \n-
    28 Buffer(bool valid){
    \n-
    29 if(valid)
    \n-
    30 value = std::make_unique<T>();
    \n-
    31 }
    \n-
    \n-
    32 template<class V>
    \n-
    \n-
    33 Buffer(V&& t)
    \n-
    34 : value(std::make_unique<T>(std::forward<V>(t)))
    \n-
    35 {}
    \n-
    \n-
    36 std::unique_ptr<T> value;
    \n-
    \n-
    37 T get(){
    \n-
    38 T tmp = std::move(*value);
    \n-
    39 value.reset();
    \n-
    40 return tmp;
    \n-
    41 }
    \n-
    \n-
    \n-
    42 operator bool () const {
    \n-
    43 return (bool)value;
    \n-
    44 }
    \n-
    \n-
    \n-
    45 T& operator *() const{
    \n-
    46 return *value;
    \n-
    47 }
    \n-
    \n-
    48 };
    \n-
    \n-
    49
    \n-
    50 template<class T>
    \n-
    \n-
    51 struct Buffer<T&>{
    \n-
    \n-
    52 Buffer(bool valid = false)
    \n-
    53 {
    \n-
    54 if(valid)
    \n-
    55 value = T();
    \n-
    56 }
    \n-
    \n-
    57 template<class V>
    \n-
    \n-
    58 Buffer(V&& t)
    \n-
    59 : value(std::forward<V>(t))
    \n-
    60 {}
    \n-
    \n-
    61 std::optional<std::reference_wrapper<T>> value;
    \n-
    \n-
    62 T& get(){
    \n-
    63 T& tmp = *value;
    \n-
    64 value.reset();
    \n-
    65 return tmp;
    \n-
    66 }
    \n-
    \n-
    \n-
    67 operator bool () const{
    \n-
    68 return (bool)value;
    \n-
    69 }
    \n-
    \n-
    \n-
    70 T& operator *() const{
    \n-
    71 return *value;
    \n-
    72 }
    \n-
    \n-
    73 };
    \n-
    \n-
    74
    \n-
    75 template<>
    \n-
    \n-
    76 struct Buffer<void>{
    \n-
    77 bool valid_;
    \n-
    \n-
    78 Buffer(bool valid = false)
    \n-
    79 : valid_(valid)
    \n-
    80 {}
    \n-
    \n-
    \n-
    81 operator bool () const{
    \n-
    82 return valid_;
    \n-
    83 }
    \n-
    \n-
    84 void get(){}
    \n-
    85 };
    \n-
    \n-
    86 }
    \n-
    \n-
    87
    \n-
    92 template<class R, class S = void>
    \n-
    \n-
    93 class MPIFuture{
    \n-
    94 mutable MPI_Request req_;
    \n-
    95 mutable MPI_Status status_;
    \n-
    96 impl::Buffer<R> data_;
    \n-
    97 impl::Buffer<S> send_data_;
    \n-
    98 friend class Communication<MPI_Comm>;
    \n-
    99 public:
    \n-
    \n-
    100 MPIFuture(bool valid = false)
    \n-
    101 : req_(MPI_REQUEST_NULL)
    \n-
    102 , data_(valid)
    \n-
    103 {}
    \n-
    \n-
    104
    \n-
    105 // Hide this constructor if R or S is void
    \n-
    106 template<class V = R, class U = S>
    \n-
    \n-
    107 MPIFuture(V&& recv_data, U&& send_data, typename std::enable_if_t<!std::is_void<V>::value && !std::is_void<U>::value>* = 0) :
    \n-
    108 req_(MPI_REQUEST_NULL)
    \n-
    109 , data_(std::forward<R>(recv_data))
    \n-
    110 , send_data_(std::forward<S>(send_data))
    \n-
    111 {}
    \n-
    \n-
    112
    \n-
    113 // hide this constructor if R is void
    \n-
    114 template<class V = R>
    \n-
    \n-
    115 MPIFuture(V&& recv_data, typename std::enable_if_t<!std::is_void<V>::value>* = 0)
    \n-
    116 : req_(MPI_REQUEST_NULL)
    \n-
    117 , data_(std::forward<V>(recv_data))
    \n-
    118 {}
    \n-
    \n-
    119
    \n-
    \n-\n-
    121 if(req_ != MPI_REQUEST_NULL){
    \n-
    122 try{ // might fail when it is a collective communication
    \n-
    123 MPI_Cancel(&req_);
    \n-
    124 MPI_Request_free(&req_);
    \n-
    125 }catch(...){
    \n-
    126 }
    \n-
    127 }
    \n-
    128 }
    \n-
    \n-
    129
    \n-
    \n-\n-
    131 : req_(MPI_REQUEST_NULL)
    \n-
    132 , data_(std::move(f.data_))
    \n-
    133 , send_data_(std::move(f.send_data_))
    \n-
    134 {
    \n-
    135 std::swap(req_, f.req_);
    \n-
    136 std::swap(status_, f.status_);
    \n-
    137 }
    \n-
    \n-
    138
    \n-
    \n-\n-
    140 std::swap(req_, f.req_);
    \n-
    141 std::swap(status_, f.status_);
    \n-
    142 std::swap(data_, f.data_);
    \n-
    143 std::swap(send_data_, f.send_data_);
    \n-
    144 return *this;
    \n-
    145 }
    \n-
    \n-
    146
    \n-
    \n-
    147 bool valid() const{
    \n-
    148 return (bool)data_;
    \n-
    149 }
    \n-
    \n-
    150
    \n-
    \n-
    151 void wait(){
    \n-
    152 if(!valid())
    \n-
    153 DUNE_THROW(InvalidFutureException, "The MPIFuture is not valid!");
    \n-
    154 MPI_Wait(&req_, &status_);
    \n-
    155 }
    \n-
    \n-
    156
    \n-
    \n-
    157 bool ready() const{
    \n-
    158 int flag = -1;
    \n-
    159 MPI_Test(&req_, &flag, &status_);
    \n-
    160 return flag;
    \n-
    161 }
    \n-
    \n-
    162
    \n-
    \n-
    163 R get() {
    \n-
    164 wait();
    \n-
    165 return data_.get();
    \n-
    166 }
    \n-
    \n-
    167
    \n-
    \n-\n-
    169 wait();
    \n-
    170 return send_data_.get();
    \n-
    171 }
    \n-
    \n-
    172
    \n-
    \n-\n-
    174 return getMPIData(*data_);
    \n-
    175 }
    \n-
    \n-
    176
    \n-
    \n-\n-
    178 return getMPIData(*send_data_);
    \n-
    179 }
    \n-
    \n-
    180 };
    \n-
    \n-
    181
    \n-
    182}
    \n-
    183#endif // HAVE_MPI
    \n-
    184#endif // DUNE_COMMON_PARALLEL_MPIFUTURE_HH
    \n-
    Interface class to translate objects to a MPI_Datatype, void* and size used for MPI calls.
    \n-
    Implements an utility class that provides collective communication methods for sequential programs.
    \n-\n-
    A few common exception classes.
    \n-
    bigunsignedint< k > operator*(const bigunsignedint< k > &x, std::uintmax_t y)
    Definition bigunsignedint.hh:549
    \n-
    #define DUNE_THROW(E, m)
    Definition exceptions.hh:218
    \n-
    STL namespace.
    \n-
    Dune namespace.
    Definition alignedallocator.hh:13
    \n-
    auto getMPIData(T &t)
    Definition mpidata.hh:44
    \n-
    Collective communication interface and sequential default implementation.
    Definition communication.hh:100
    \n-
    This exception is thrown when ready(), wait() or get() is called on an invalid future....
    Definition future.hh:20
    \n-
    Definition mpifuture.hh:27
    \n-
    std::unique_ptr< T > value
    Definition mpifuture.hh:36
    \n-
    T & operator*() const
    Definition mpifuture.hh:45
    \n-
    Buffer(V &&t)
    Definition mpifuture.hh:33
    \n-
    T get()
    Definition mpifuture.hh:37
    \n-
    Buffer(bool valid)
    Definition mpifuture.hh:28
    \n-
    std::optional< std::reference_wrapper< T > > value
    Definition mpifuture.hh:61
    \n-
    Buffer(bool valid=false)
    Definition mpifuture.hh:52
    \n-
    T & get()
    Definition mpifuture.hh:62
    \n-
    Buffer(V &&t)
    Definition mpifuture.hh:58
    \n-
    bool valid_
    Definition mpifuture.hh:77
    \n-
    void get()
    Definition mpifuture.hh:84
    \n-
    Buffer(bool valid=false)
    Definition mpifuture.hh:78
    \n-
    Provides a future-like object for MPI communication. It contains the object that will be received and...
    Definition mpifuture.hh:93
    \n-
    MPIFuture(V &&recv_data, typename std::enable_if_t<!std::is_void< V >::value > *=0)
    Definition mpifuture.hh:115
    \n-
    bool ready() const
    Definition mpifuture.hh:157
    \n-
    bool valid() const
    Definition mpifuture.hh:147
    \n-
    ~MPIFuture()
    Definition mpifuture.hh:120
    \n-
    MPIFuture(bool valid=false)
    Definition mpifuture.hh:100
    \n-
    MPIFuture & operator=(MPIFuture &&f)
    Definition mpifuture.hh:139
    \n-
    auto get_send_mpidata()
    Definition mpifuture.hh:177
    \n-
    void wait()
    Definition mpifuture.hh:151
    \n-
    auto get_mpidata()
    Definition mpifuture.hh:173
    \n-
    R get()
    Definition mpifuture.hh:163
    \n-
    MPIFuture(V &&recv_data, U &&send_data, typename std::enable_if_t<!std::is_void< V >::value &&!std::is_void< U >::value > *=0)
    Definition mpifuture.hh:107
    \n-
    S get_send_data()
    Definition mpifuture.hh:168
    \n-
    MPIFuture(MPIFuture &&f)
    Definition mpifuture.hh:130
    \n+
    15#if HAVE_PARMETIS
    \n+
    16
    \n+
    17#if HAVE_MPI
    \n+
    18#include <mpi.h>
    \n+
    19#endif
    \n+
    20
    \n+
    21#if HAVE_PTSCOTCH_PARMETIS
    \n+
    22extern "C" {
    \n+
    23 #include <ptscotch.h>
    \n+
    24}
    \n+
    25#endif
    \n+
    26
    \n+
    27extern "C" {
    \n+
    28 #include <parmetis.h>
    \n+
    29}
    \n+
    30
    \n+
    31namespace Dune::ParMetis {
    \n+
    32
    \n+
    33#if defined(REALTYPEWIDTH)
    \n+
    34 using real_t = ::real_t;
    \n+
    35#else
    \n+
    36 using real_t = float;
    \n+
    37#endif
    \n+
    38
    \n+
    39#if defined(IDXTYPEWIDTH)
    \n+
    40 using idx_t = ::idx_t;
    \n+
    41#elif HAVE_PTSCOTCH_PARMETIS
    \n+
    42 using idx_t = SCOTCH_Num;
    \n+
    43#else
    \n+
    44 using idx_t = int;
    \n+
    45#endif
    \n+
    46
    \n+
    47} // end namespace Dune::ParMetis
    \n+
    48
    \n+
    49#endif // HAVE_PARMETIS
    \n+
    50#endif // DUNE_PARMETIS_HH
    \n+
    typename FieldTraits< Type >::real_type real_t
    Convenient access to FieldTraits<Type>::real_type.
    Definition typetraits.hh:301
    \n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,307 +1,59 @@\n dune-common\u00a02.10\n Loading...\n Searching...\n No Matches\n * _\bd_\bu_\bn_\be\n * _\bc_\bo_\bm_\bm_\bo_\bn\n * _\bp_\ba_\br_\ba_\bl_\bl_\be_\bl\n-mpifuture.hh\n+parmetis.hh\n _\bG_\bo_\b _\bt_\bo_\b _\bt_\bh_\be_\b _\bd_\bo_\bc_\bu_\bm_\be_\bn_\bt_\ba_\bt_\bi_\bo_\bn_\b _\bo_\bf_\b _\bt_\bh_\bi_\bs_\b _\bf_\bi_\bl_\be_\b.\n 1// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-\n 2// vi: set et ts=4 sw=2 sts=2:\n 3// SPDX-FileCopyrightInfo: Copyright \u00c2\u00a9 DUNE Project contributors, see file\n LICENSE.md in module root\n 4// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception\n-5#ifndef DUNE_COMMON_PARALLEL_MPIFUTURE_HH\n-6#define DUNE_COMMON_PARALLEL_MPIFUTURE_HH\n+5#ifndef DUNE_PARMETIS_HH\n+6#define DUNE_PARMETIS_HH\n 7\n-8#if HAVE_MPI\n-9\n-10#include \n-11#include \n-12#include \n-13#include \n-14#include \n-15\n-16#include \n-17\n-18#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\be_\bx_\bc_\be_\bp_\bt_\bi_\bo_\bn_\bs_\b._\bh_\bh>\n-19#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bp_\ba_\br_\ba_\bl_\bl_\be_\bl_\b/_\bc_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b._\bh_\bh>\n-20#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bp_\ba_\br_\ba_\bl_\bl_\be_\bl_\b/_\bf_\bu_\bt_\bu_\br_\be_\b._\bh_\bh>\n-21#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bp_\ba_\br_\ba_\bl_\bl_\be_\bl_\b/_\bm_\bp_\bi_\bd_\ba_\bt_\ba_\b._\bh_\bh>\n-22\n-23namespace _\bD_\bu_\bn_\be{\n-24\n-_\b2_\b5 namespace impl{\n-26 template\n-_\b2_\b7 struct _\bB_\bu_\bf_\bf_\be_\br{\n-_\b2_\b8 _\bB_\bu_\bf_\bf_\be_\br(bool valid){\n-29 if(valid)\n-30 _\bv_\ba_\bl_\bu_\be = std::make_unique();\n-31 }\n-32 template\n-_\b3_\b3 _\bB_\bu_\bf_\bf_\be_\br(V&& t)\n-34 : _\bv_\ba_\bl_\bu_\be(_\bs_\bt_\bd::make_unique(_\bs_\bt_\bd::forward(t)))\n-35 {}\n-_\b3_\b6 std::unique_ptr _\bv_\ba_\bl_\bu_\be;\n-_\b3_\b7 T _\bg_\be_\bt(){\n-38 T tmp = std::move(*_\bv_\ba_\bl_\bu_\be);\n-39 _\bv_\ba_\bl_\bu_\be.reset();\n-40 return tmp;\n-41 }\n-_\b4_\b2 operator bool () const {\n-43 return (bool)_\bv_\ba_\bl_\bu_\be;\n-44 }\n-_\b4_\b5 T& _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b _\b*() const{\n-46 return *_\bv_\ba_\bl_\bu_\be;\n-47 }\n-48 };\n-49\n-50 template\n-_\b5_\b1 struct _\bB_\bu_\bf_\bf_\be_\br{\n-_\b5_\b2 _\bB_\bu_\bf_\bf_\be_\br(bool valid = false)\n-53 {\n-54 if(valid)\n-55 value = T();\n-56 }\n-57 template\n-_\b5_\b8 _\bB_\bu_\bf_\bf_\be_\br(V&& t)\n-59 : value(_\bs_\bt_\bd::forward(t))\n-60 {}\n-_\b6_\b1 std::optional> _\bv_\ba_\bl_\bu_\be;\n-_\b6_\b2 T& _\bg_\be_\bt(){\n-63 T& tmp = *value;\n-64 value.reset();\n-65 return tmp;\n-66 }\n-_\b6_\b7 operator bool () const{\n-68 return (bool)value;\n-69 }\n-_\b7_\b0 T& _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b _\b*() const{\n-71 return *value;\n-72 }\n-73 };\n-74\n-75 template<>\n-_\b7_\b6 struct _\bB_\bu_\bf_\bf_\be_\br{\n-_\b7_\b7 bool _\bv_\ba_\bl_\bi_\bd_\b_;\n-_\b7_\b8 _\bB_\bu_\bf_\bf_\be_\br(bool valid = false)\n-79 : valid_(valid)\n-80 {}\n-_\b8_\b1 operator bool () const{\n-82 return valid_;\n-83 }\n-_\b8_\b4 void _\bg_\be_\bt(){}\n-85 };\n-86 }\n-87\n-92 template\n-_\b9_\b3 class _\bM_\bP_\bI_\bF_\bu_\bt_\bu_\br_\be{\n-94 mutable MPI_Request req_;\n-95 mutable MPI_Status status_;\n-96 _\bi_\bm_\bp_\bl_\b:_\b:_\bB_\bu_\bf_\bf_\be_\br_\b<_\bR_\b> data_;\n-_\b9_\b7 _\bi_\bm_\bp_\bl_\b:_\b:_\bB_\bu_\bf_\bf_\be_\br_\b<_\bS_\b> send_data_;\n-98 friend class _\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn;\n-99 public:\n-_\b1_\b0_\b0 _\bM_\bP_\bI_\bF_\bu_\bt_\bu_\br_\be(bool _\bv_\ba_\bl_\bi_\bd = false)\n-101 : req_(MPI_REQUEST_NULL)\n-102 , data_(_\bv_\ba_\bl_\bi_\bd)\n-103 {}\n-104\n-105 // Hide this constructor if R or S is void\n-106 template\n-_\b1_\b0_\b7 _\bM_\bP_\bI_\bF_\bu_\bt_\bu_\br_\be(V&& recv_data, U&& send_data, typename std::enable_if_t::value && !std::is_void::value>* = 0) :\n-108 req_(MPI_REQUEST_NULL)\n-109 , data_(_\bs_\bt_\bd::forward(recv_data))\n-110 , send_data_(_\bs_\bt_\bd::forward(send_data))\n-111 {}\n-112\n-113 // hide this constructor if R is void\n-114 template\n-_\b1_\b1_\b5 _\bM_\bP_\bI_\bF_\bu_\bt_\bu_\br_\be(V&& recv_data, typename std::enable_if_t::\n-value>* = 0)\n-116 : req_(MPI_REQUEST_NULL)\n-117 , data_(_\bs_\bt_\bd::forward(recv_data))\n-118 {}\n-119\n-_\b1_\b2_\b0 _\b~_\bM_\bP_\bI_\bF_\bu_\bt_\bu_\br_\be() {\n-121 if(req_ != MPI_REQUEST_NULL){\n-122 try{ // might fail when it is a collective communication\n-123 MPI_Cancel(&req_);\n-124 MPI_Request_free(&req_);\n-125 }catch(...){\n-126 }\n-127 }\n-128 }\n-129\n-_\b1_\b3_\b0 _\bM_\bP_\bI_\bF_\bu_\bt_\bu_\br_\be(_\bM_\bP_\bI_\bF_\bu_\bt_\bu_\br_\be&& f)\n-131 : req_(MPI_REQUEST_NULL)\n-132 , data_(_\bs_\bt_\bd::move(f.data_))\n-133 , send_data_(_\bs_\bt_\bd::move(f.send_data_))\n-134 {\n-135 std::swap(req_, f.req_);\n-136 std::swap(status_, f.status_);\n-137 }\n-138\n-_\b1_\b3_\b9 _\bM_\bP_\bI_\bF_\bu_\bt_\bu_\br_\be& _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b=(_\bM_\bP_\bI_\bF_\bu_\bt_\bu_\br_\be&& f){\n-140 std::swap(req_, f.req_);\n-141 std::swap(status_, f.status_);\n-142 std::swap(data_, f.data_);\n-143 std::swap(send_data_, f.send_data_);\n-144 return *this;\n-145 }\n-146\n-_\b1_\b4_\b7 bool _\bv_\ba_\bl_\bi_\bd() const{\n-148 return (bool)data_;\n-149 }\n-150\n-_\b1_\b5_\b1 void _\bw_\ba_\bi_\bt(){\n-152 if(!_\bv_\ba_\bl_\bi_\bd())\n-153 _\bD_\bU_\bN_\bE_\b__\bT_\bH_\bR_\bO_\bW(_\bI_\bn_\bv_\ba_\bl_\bi_\bd_\bF_\bu_\bt_\bu_\br_\be_\bE_\bx_\bc_\be_\bp_\bt_\bi_\bo_\bn, \"The MPIFuture is not valid!\");\n-154 MPI_Wait(&req_, &status_);\n-155 }\n-156\n-_\b1_\b5_\b7 bool _\br_\be_\ba_\bd_\by() const{\n-158 int flag = -1;\n-159 MPI_Test(&req_, &flag, &status_);\n-160 return flag;\n-161 }\n-162\n-_\b1_\b6_\b3 R _\bg_\be_\bt() {\n-164 _\bw_\ba_\bi_\bt();\n-165 return data_.get();\n-166 }\n-167\n-_\b1_\b6_\b8 S _\bg_\be_\bt_\b__\bs_\be_\bn_\bd_\b__\bd_\ba_\bt_\ba(){\n-169 _\bw_\ba_\bi_\bt();\n-170 return send_data_._\bg_\be_\bt();\n-171 }\n-172\n-_\b1_\b7_\b3 auto _\bg_\be_\bt_\b__\bm_\bp_\bi_\bd_\ba_\bt_\ba(){\n-174 return _\bg_\be_\bt_\bM_\bP_\bI_\bD_\ba_\bt_\ba(*data_);\n-175 }\n-176\n-_\b1_\b7_\b7 auto _\bg_\be_\bt_\b__\bs_\be_\bn_\bd_\b__\bm_\bp_\bi_\bd_\ba_\bt_\ba(){\n-178 return _\bg_\be_\bt_\bM_\bP_\bI_\bD_\ba_\bt_\ba(*send_data_);\n-179 }\n-180 };\n-181\n-182}\n-183#endif // HAVE_MPI\n-184#endif // DUNE_COMMON_PARALLEL_MPIFUTURE_HH\n-_\bm_\bp_\bi_\bd_\ba_\bt_\ba_\b._\bh_\bh\n-Interface class to translate objects to a MPI_Datatype, void* and size used for\n-MPI calls.\n-_\bc_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b._\bh_\bh\n-Implements an utility class that provides collective communication methods for\n-sequential programs.\n-_\bf_\bu_\bt_\bu_\br_\be_\b._\bh_\bh\n-_\be_\bx_\bc_\be_\bp_\bt_\bi_\bo_\bn_\bs_\b._\bh_\bh\n-A few common exception classes.\n-_\bD_\bu_\bn_\be_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b*\n-bigunsignedint< k > operator*(const bigunsignedint< k > &x, std::uintmax_t y)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bigunsignedint.hh:549\n-_\bD_\bU_\bN_\bE_\b__\bT_\bH_\bR_\bO_\bW\n-#define DUNE_THROW(E, m)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn exceptions.hh:218\n-_\bs_\bt_\bd\n-STL namespace.\n-_\bD_\bu_\bn_\be\n-Dune namespace.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn alignedallocator.hh:13\n-_\bD_\bu_\bn_\be_\b:_\b:_\bg_\be_\bt_\bM_\bP_\bI_\bD_\ba_\bt_\ba\n-auto getMPIData(T &t)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mpidata.hh:44\n-_\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn\n-Collective communication interface and sequential default implementation.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn communication.hh:100\n-_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bv_\ba_\bl_\bi_\bd_\bF_\bu_\bt_\bu_\br_\be_\bE_\bx_\bc_\be_\bp_\bt_\bi_\bo_\bn\n-This exception is thrown when ready(), wait() or get() is called on an invalid\n-future....\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn future.hh:20\n-_\bD_\bu_\bn_\be_\b:_\b:_\bi_\bm_\bp_\bl_\b:_\b:_\bB_\bu_\bf_\bf_\be_\br\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mpifuture.hh:27\n-_\bD_\bu_\bn_\be_\b:_\b:_\bi_\bm_\bp_\bl_\b:_\b:_\bB_\bu_\bf_\bf_\be_\br_\b:_\b:_\bv_\ba_\bl_\bu_\be\n-std::unique_ptr< T > value\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mpifuture.hh:36\n-_\bD_\bu_\bn_\be_\b:_\b:_\bi_\bm_\bp_\bl_\b:_\b:_\bB_\bu_\bf_\bf_\be_\br_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b*\n-T & operator*() const\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mpifuture.hh:45\n-_\bD_\bu_\bn_\be_\b:_\b:_\bi_\bm_\bp_\bl_\b:_\b:_\bB_\bu_\bf_\bf_\be_\br_\b:_\b:_\bB_\bu_\bf_\bf_\be_\br\n-Buffer(V &&t)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mpifuture.hh:33\n-_\bD_\bu_\bn_\be_\b:_\b:_\bi_\bm_\bp_\bl_\b:_\b:_\bB_\bu_\bf_\bf_\be_\br_\b:_\b:_\bg_\be_\bt\n-T get()\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mpifuture.hh:37\n-_\bD_\bu_\bn_\be_\b:_\b:_\bi_\bm_\bp_\bl_\b:_\b:_\bB_\bu_\bf_\bf_\be_\br_\b:_\b:_\bB_\bu_\bf_\bf_\be_\br\n-Buffer(bool valid)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mpifuture.hh:28\n-_\bD_\bu_\bn_\be_\b:_\b:_\bi_\bm_\bp_\bl_\b:_\b:_\bB_\bu_\bf_\bf_\be_\br_\b<_\b _\bT_\b _\b&_\b _\b>_\b:_\b:_\bv_\ba_\bl_\bu_\be\n-std::optional< std::reference_wrapper< T > > value\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mpifuture.hh:61\n-_\bD_\bu_\bn_\be_\b:_\b:_\bi_\bm_\bp_\bl_\b:_\b:_\bB_\bu_\bf_\bf_\be_\br_\b<_\b _\bT_\b _\b&_\b _\b>_\b:_\b:_\bB_\bu_\bf_\bf_\be_\br\n-Buffer(bool valid=false)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mpifuture.hh:52\n-_\bD_\bu_\bn_\be_\b:_\b:_\bi_\bm_\bp_\bl_\b:_\b:_\bB_\bu_\bf_\bf_\be_\br_\b<_\b _\bT_\b _\b&_\b _\b>_\b:_\b:_\bg_\be_\bt\n-T & get()\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mpifuture.hh:62\n-_\bD_\bu_\bn_\be_\b:_\b:_\bi_\bm_\bp_\bl_\b:_\b:_\bB_\bu_\bf_\bf_\be_\br_\b<_\b _\bT_\b _\b&_\b _\b>_\b:_\b:_\bB_\bu_\bf_\bf_\be_\br\n-Buffer(V &&t)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mpifuture.hh:58\n-_\bD_\bu_\bn_\be_\b:_\b:_\bi_\bm_\bp_\bl_\b:_\b:_\bB_\bu_\bf_\bf_\be_\br_\b<_\b _\bv_\bo_\bi_\bd_\b _\b>_\b:_\b:_\bv_\ba_\bl_\bi_\bd_\b_\n-bool valid_\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mpifuture.hh:77\n-_\bD_\bu_\bn_\be_\b:_\b:_\bi_\bm_\bp_\bl_\b:_\b:_\bB_\bu_\bf_\bf_\be_\br_\b<_\b _\bv_\bo_\bi_\bd_\b _\b>_\b:_\b:_\bg_\be_\bt\n-void get()\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mpifuture.hh:84\n-_\bD_\bu_\bn_\be_\b:_\b:_\bi_\bm_\bp_\bl_\b:_\b:_\bB_\bu_\bf_\bf_\be_\br_\b<_\b _\bv_\bo_\bi_\bd_\b _\b>_\b:_\b:_\bB_\bu_\bf_\bf_\be_\br\n-Buffer(bool valid=false)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mpifuture.hh:78\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\bP_\bI_\bF_\bu_\bt_\bu_\br_\be\n-Provides a future-like object for MPI communication. It contains the object\n-that will be received and...\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mpifuture.hh:93\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\bP_\bI_\bF_\bu_\bt_\bu_\br_\be_\b:_\b:_\bM_\bP_\bI_\bF_\bu_\bt_\bu_\br_\be\n-MPIFuture(V &&recv_data, typename std::enable_if_t::value >\n-*=0)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mpifuture.hh:115\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\bP_\bI_\bF_\bu_\bt_\bu_\br_\be_\b:_\b:_\br_\be_\ba_\bd_\by\n-bool ready() const\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mpifuture.hh:157\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\bP_\bI_\bF_\bu_\bt_\bu_\br_\be_\b:_\b:_\bv_\ba_\bl_\bi_\bd\n-bool valid() const\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mpifuture.hh:147\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\bP_\bI_\bF_\bu_\bt_\bu_\br_\be_\b:_\b:_\b~_\bM_\bP_\bI_\bF_\bu_\bt_\bu_\br_\be\n-~MPIFuture()\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mpifuture.hh:120\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\bP_\bI_\bF_\bu_\bt_\bu_\br_\be_\b:_\b:_\bM_\bP_\bI_\bF_\bu_\bt_\bu_\br_\be\n-MPIFuture(bool valid=false)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mpifuture.hh:100\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\bP_\bI_\bF_\bu_\bt_\bu_\br_\be_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b=\n-MPIFuture & operator=(MPIFuture &&f)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mpifuture.hh:139\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\bP_\bI_\bF_\bu_\bt_\bu_\br_\be_\b:_\b:_\bg_\be_\bt_\b__\bs_\be_\bn_\bd_\b__\bm_\bp_\bi_\bd_\ba_\bt_\ba\n-auto get_send_mpidata()\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mpifuture.hh:177\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\bP_\bI_\bF_\bu_\bt_\bu_\br_\be_\b:_\b:_\bw_\ba_\bi_\bt\n-void wait()\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mpifuture.hh:151\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\bP_\bI_\bF_\bu_\bt_\bu_\br_\be_\b:_\b:_\bg_\be_\bt_\b__\bm_\bp_\bi_\bd_\ba_\bt_\ba\n-auto get_mpidata()\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mpifuture.hh:173\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\bP_\bI_\bF_\bu_\bt_\bu_\br_\be_\b:_\b:_\bg_\be_\bt\n-R get()\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mpifuture.hh:163\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\bP_\bI_\bF_\bu_\bt_\bu_\br_\be_\b:_\b:_\bM_\bP_\bI_\bF_\bu_\bt_\bu_\br_\be\n-MPIFuture(V &&recv_data, U &&send_data, typename std::enable_if_t::value &&!std::is_void< U >::value > *=0)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mpifuture.hh:107\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\bP_\bI_\bF_\bu_\bt_\bu_\br_\be_\b:_\b:_\bg_\be_\bt_\b__\bs_\be_\bn_\bd_\b__\bd_\ba_\bt_\ba\n-S get_send_data()\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mpifuture.hh:168\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\bP_\bI_\bF_\bu_\bt_\bu_\br_\be_\b:_\b:_\bM_\bP_\bI_\bF_\bu_\bt_\bu_\br_\be\n-MPIFuture(MPIFuture &&f)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mpifuture.hh:130\n+15#if HAVE_PARMETIS\n+16\n+17#if HAVE_MPI\n+18#include \n+19#endif\n+20\n+21#if HAVE_PTSCOTCH_PARMETIS\n+22extern \"C\" {\n+23 #include \n+24}\n+25#endif\n+26\n+27extern \"C\" {\n+28 #include \n+29}\n+30\n+31namespace Dune::ParMetis {\n+32\n+33#if defined(REALTYPEWIDTH)\n+34 using _\br_\be_\ba_\bl_\b__\bt = ::real_t;\n+35#else\n+36 using _\br_\be_\ba_\bl_\b__\bt = float;\n+37#endif\n+38\n+39#if defined(IDXTYPEWIDTH)\n+40 using idx_t = ::idx_t;\n+41#elif HAVE_PTSCOTCH_PARMETIS\n+42 using idx_t = SCOTCH_Num;\n+43#else\n+44 using idx_t = int;\n+45#endif\n+46\n+47} // end namespace Dune::ParMetis\n+48\n+49#endif // HAVE_PARMETIS\n+50#endif // DUNE_PARMETIS_HH\n+_\bD_\bu_\bn_\be_\b:_\b:_\br_\be_\ba_\bl_\b__\bt\n+typename FieldTraits< Type >::real_type real_t\n+Convenient access to FieldTraits::real_type.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn typetraits.hh:301\n ===============================================================================\n Generated by\u00a0_\b[_\bd_\bo_\bx_\by_\bg_\be_\bn_\b] 1.9.8\n"}]}, {"source1": "./usr/share/doc/libdune-common-doc/doxygen/a00077.html", "source2": "./usr/share/doc/libdune-common-doc/doxygen/a00077.html", "unified_diff": "@@ -1,15 +1,15 @@\n \n \n \n \n \n \n \n-dune-common: remoteindices.hh File Reference\n+dune-common: mpicommunication.hh File Reference\n \n \n \n \n \n \n \n@@ -72,83 +72,107 @@\n
  • dune
  • common
  • parallel
  • \n \n \n
    \n \n- \n+
    mpicommunication.hh File Reference
    \n
    \n
    \n \n-

    Classes describing a distributed indexset. \n+

    Implements an utility class that provides MPI's collective communication methods. \n More...

    \n-
    #include <cassert>
    \n-#include <iostream>
    \n-#include <ostream>
    \n-#include <map>
    \n+
    #include <algorithm>
    \n+#include <functional>
    \n #include <memory>
    \n-#include <set>
    \n-#include <tuple>
    \n-#include <utility>
    \n-#include <vector>
    \n #include <mpi.h>
    \n-#include <dune/common/exceptions.hh>
    \n-#include <dune/common/sllist.hh>
    \n-#include <dune/common/stdstreams.hh>
    \n-#include <dune/common/parallel/indexset.hh>
    \n-#include <dune/common/parallel/mpitraits.hh>
    \n-#include <dune/common/parallel/plocalindex.hh>
    \n+#include <dune/common/binaryfunctions.hh>
    \n+#include <dune/common/exceptions.hh>
    \n+#include <dune/common/parallel/communication.hh>
    \n+#include <dune/common/parallel/mpitraits.hh>
    \n+#include <dune/common/parallel/mpifuture.hh>
    \n+#include <dune/common/parallel/mpidata.hh>
    \n
    \n

    Go to the source code of this file.

    \n \n \n-\n+\n \n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n+\n+\n \n

    \n Classes

    class  Dune::MPITraits< IndexPair< TG, ParallelLocalIndex< TA > > >
    class  Dune::Generic_MPI_Op< Type, BinaryFunction, Enable >
     
    class  Dune::RemoteIndex< T1, T2 >
     Information about an index residing on another processor. More...
     
    class  Dune::RemoteIndices< T, A >
     The indices present on remote processes. More...
     
    class  Dune::RemoteIndexListModifier< T, A, mode >
     Modifier for adding and/or deleting remote indices from the remote index list. More...
     
    class  Dune::RemoteIndexListModifier< T, A, mode >::InvalidPosition
     
    class  Dune::CollectiveIterator< T, A >
     A collective iterator for moving over the remote indices for all processes collectively. More...
     
    class  Dune::CollectiveIterator< T, A >::iterator
     Iterator over the valid underlying iterators. More...
    class  Dune::Communication< MPI_Comm >
     Specialization of Communication for MPI. More...
     
    \n \n \n \n \n

    \n Namespaces

    namespace  Dune
     Dune namespace.
     
    \n+\n+\n+\n+

    \n+Macros

    #define ComposeMPIOp(func, op)
     
    \n \n-\n-\n-\n-\n-\n-\n-\n-\n-\n+\n+\n+\n+\n+\n+\n+\n+\n

    \n Functions

    template<typename T1 , typename T2 >
    std::ostream & Dune::operator<< (std::ostream &os, const RemoteIndex< T1, T2 > &index)
     
    template<class T , class A >
    std::ostream & Dune::operator<< (std::ostream &os, const RemoteIndices< T, A > &indices)
     
    template<typename TG , typename TA >
    std::ostream & Dune::operator<< (std::ostream &os, const RemoteIndex< TG, TA > &index)
     
     Dune::ComposeMPIOp (std::plus, MPI_SUM)
     
     Dune::ComposeMPIOp (std::multiplies, MPI_PROD)
     
     Dune::ComposeMPIOp (Min, MPI_MIN)
     
     Dune::ComposeMPIOp (Max, MPI_MAX)
     
    \n

    Detailed Description

    \n-

    Classes describing a distributed indexset.

    \n-
    Author
    Markus Blatt
    \n-
    \n+

    Implements an utility class that provides MPI's collective communication methods.

    \n+

    Macro Definition Documentation

    \n+\n+

    ◆ ComposeMPIOp

    \n+\n+
    \n+
    \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+
    #define ComposeMPIOp( func,
     op 
    )
    \n+
    \n+Value:
    template<class T, class S> \\
    \n+
    class Generic_MPI_Op<T, func<S>, std::enable_if_t<MPITraits<S>::is_intrinsic> >{ \\
    \n+
    public: \\
    \n+
    static MPI_Op get(){ \\
    \n+
    return op; \\
    \n+
    } \\
    \n+
    private: \\
    \n+
    Generic_MPI_Op () {} \\
    \n+
    Generic_MPI_Op (const Generic_MPI_Op & ) {} \\
    \n+
    }
    \n+
    STL namespace.
    \n+
    \n+
    \n+
    \n+
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,73 +1,69 @@\n dune-common\u00a02.10\n Loading...\n Searching...\n No Matches\n * _\bd_\bu_\bn_\be\n * _\bc_\bo_\bm_\bm_\bo_\bn\n * _\bp_\ba_\br_\ba_\bl_\bl_\be_\bl\n-_\bC_\bl_\ba_\bs_\bs_\be_\bs | _\bN_\ba_\bm_\be_\bs_\bp_\ba_\bc_\be_\bs | _\bF_\bu_\bn_\bc_\bt_\bi_\bo_\bn_\bs\n-remoteindices.hh File Reference\n-_\bC_\bo_\bm_\bm_\bo_\bn \u00bb _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\b _\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn \u00bb _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\b _\bC_\bo_\bm_\bp_\bu_\bt_\bi_\bn_\bg_\b _\bb_\ba_\bs_\be_\bd_\b _\bo_\bn_\b _\bI_\bn_\bd_\be_\bx_\bs_\be_\bt_\bs\n-Classes describing a distributed indexset. _\bM_\bo_\br_\be_\b._\b._\b.\n-#include \n-#include \n-#include \n-#include \n+_\bC_\bl_\ba_\bs_\bs_\be_\bs | _\bN_\ba_\bm_\be_\bs_\bp_\ba_\bc_\be_\bs | _\bM_\ba_\bc_\br_\bo_\bs | _\bF_\bu_\bn_\bc_\bt_\bi_\bo_\bn_\bs\n+mpicommunication.hh File Reference\n+_\bC_\bo_\bm_\bm_\bo_\bn \u00bb _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\b _\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn\n+Implements an utility class that provides MPI's collective communication\n+methods. _\bM_\bo_\br_\be_\b._\b._\b.\n+#include \n+#include \n #include \n-#include \n-#include \n-#include \n-#include \n #include \n+#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bb_\bi_\bn_\ba_\br_\by_\bf_\bu_\bn_\bc_\bt_\bi_\bo_\bn_\bs_\b._\bh_\bh>\n #include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\be_\bx_\bc_\be_\bp_\bt_\bi_\bo_\bn_\bs_\b._\bh_\bh>\n-#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bs_\bl_\bl_\bi_\bs_\bt_\b._\bh_\bh>\n-#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bs_\bt_\bd_\bs_\bt_\br_\be_\ba_\bm_\bs_\b._\bh_\bh>\n-#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bp_\ba_\br_\ba_\bl_\bl_\be_\bl_\b/_\bi_\bn_\bd_\be_\bx_\bs_\be_\bt_\b._\bh_\bh>\n+#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bp_\ba_\br_\ba_\bl_\bl_\be_\bl_\b/_\bc_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b._\bh_\bh>\n #include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bp_\ba_\br_\ba_\bl_\bl_\be_\bl_\b/_\bm_\bp_\bi_\bt_\br_\ba_\bi_\bt_\bs_\b._\bh_\bh>\n-#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bp_\ba_\br_\ba_\bl_\bl_\be_\bl_\b/_\bp_\bl_\bo_\bc_\ba_\bl_\bi_\bn_\bd_\be_\bx_\b._\bh_\bh>\n+#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bp_\ba_\br_\ba_\bl_\bl_\be_\bl_\b/_\bm_\bp_\bi_\bf_\bu_\bt_\bu_\br_\be_\b._\bh_\bh>\n+#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bp_\ba_\br_\ba_\bl_\bl_\be_\bl_\b/_\bm_\bp_\bi_\bd_\ba_\bt_\ba_\b._\bh_\bh>\n _\bG_\bo_\b _\bt_\bo_\b _\bt_\bh_\be_\b _\bs_\bo_\bu_\br_\bc_\be_\b _\bc_\bo_\bd_\be_\b _\bo_\bf_\b _\bt_\bh_\bi_\bs_\b _\bf_\bi_\bl_\be_\b.\n C\bCl\bla\bas\bss\bse\bes\bs\n-class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bM_\bP_\bI_\bT_\br_\ba_\bi_\bt_\bs_\b<_\b _\bI_\bn_\bd_\be_\bx_\bP_\ba_\bi_\br_\b<_\b _\bT_\bG_\b,_\b _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bL_\bo_\bc_\ba_\bl_\bI_\bn_\bd_\be_\bx_\b<_\b _\bT_\bA_\b _\b>_\b _\b>_\b _\b>\n+class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bG_\be_\bn_\be_\br_\bi_\bc_\b__\bM_\bP_\bI_\b__\bO_\bp_\b<_\b _\bT_\by_\bp_\be_\b,_\b _\bB_\bi_\bn_\ba_\br_\by_\bF_\bu_\bn_\bc_\bt_\bi_\bo_\bn_\b,_\b _\bE_\bn_\ba_\bb_\bl_\be_\b _\b>\n \u00a0\n-class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\be_\bx_\b<_\b _\bT_\b1_\b,_\b _\bT_\b2_\b _\b>\n-\u00a0 Information about an index residing on another processor. _\bM_\bo_\br_\be_\b._\b._\b.\n-\u00a0\n-class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\bi_\bc_\be_\bs_\b<_\b _\bT_\b,_\b _\bA_\b _\b>\n-\u00a0 The indices present on remote processes. _\bM_\bo_\br_\be_\b._\b._\b.\n-\u00a0\n-class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\be_\bx_\bL_\bi_\bs_\bt_\bM_\bo_\bd_\bi_\bf_\bi_\be_\br_\b<_\b _\bT_\b,_\b _\bA_\b,_\b _\bm_\bo_\bd_\be_\b _\b>\n-\u00a0 Modifier for adding and/or deleting remote indices from the remote\n- index list. _\bM_\bo_\br_\be_\b._\b._\b.\n-\u00a0\n-class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\be_\bx_\bL_\bi_\bs_\bt_\bM_\bo_\bd_\bi_\bf_\bi_\be_\br_\b<_\b _\bT_\b,_\b _\bA_\b,_\b _\bm_\bo_\bd_\be_\b _\b>_\b:_\b:_\bI_\bn_\bv_\ba_\bl_\bi_\bd_\bP_\bo_\bs_\bi_\bt_\bi_\bo_\bn\n-\u00a0\n-class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bl_\bl_\be_\bc_\bt_\bi_\bv_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b<_\b _\bT_\b,_\b _\bA_\b _\b>\n-\u00a0 A collective iterator for moving over the remote indices for all\n- processes collectively. _\bM_\bo_\br_\be_\b._\b._\b.\n-\u00a0\n-class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bl_\bl_\be_\bc_\bt_\bi_\bv_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b<_\b _\bT_\b,_\b _\bA_\b _\b>_\b:_\b:_\bi_\bt_\be_\br_\ba_\bt_\bo_\br\n-\u00a0 Iterator over the valid underlying iterators. _\bM_\bo_\br_\be_\b._\b._\b.\n+class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b<_\b _\bM_\bP_\bI_\b__\bC_\bo_\bm_\bm_\b _\b>\n+\u00a0 Specialization of _\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn for MPI. _\bM_\bo_\br_\be_\b._\b._\b.\n \u00a0\n N\bNa\bam\bme\bes\bsp\bpa\bac\bce\bes\bs\n namespace \u00a0 _\bD_\bu_\bn_\be\n \u00a0 _\bD_\bu_\bn_\be namespace.\n \u00a0\n+M\bMa\bac\bcr\bro\bos\bs\n+#define\u00a0 _\bC_\bo_\bm_\bp_\bo_\bs_\be_\bM_\bP_\bI_\bO_\bp(func, op)\n+\u00a0\n F\bFu\bun\bnc\bct\bti\bio\bon\bns\bs\n-template\n-std::ostream &\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b<_\b< (std::ostream &os, const _\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\be_\bx< T1, T2 >\n- &index)\n-\u00a0\n-template\n-std::ostream &\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b<_\b< (std::ostream &os, const _\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\bi_\bc_\be_\bs< T, A >\n- &indices)\n-\u00a0\n-template\n-std::ostream &\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b<_\b< (std::ostream &os, const _\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\be_\bx< TG, TA >\n- &index)\n+\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bm_\bp_\bo_\bs_\be_\bM_\bP_\bI_\bO_\bp (std::plus, MPI_SUM)\n+\u00a0\n+\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bm_\bp_\bo_\bs_\be_\bM_\bP_\bI_\bO_\bp (std::multiplies, MPI_PROD)\n+\u00a0\n+\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bm_\bp_\bo_\bs_\be_\bM_\bP_\bI_\bO_\bp (_\bM_\bi_\bn, MPI_MIN)\n+\u00a0\n+\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bm_\bp_\bo_\bs_\be_\bM_\bP_\bI_\bO_\bp (_\bM_\ba_\bx, MPI_MAX)\n \u00a0\n *\b**\b**\b**\b**\b* D\bDe\bet\bta\bai\bil\ble\bed\bd D\bDe\bes\bsc\bcr\bri\bip\bpt\bti\bio\bon\bn *\b**\b**\b**\b**\b*\n-Classes describing a distributed indexset.\n- Author\n- Markus Blatt\n+Implements an utility class that provides MPI's collective communication\n+methods.\n+*\b**\b**\b**\b**\b* M\bMa\bac\bcr\bro\bo D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn D\bDo\boc\bcu\bum\bme\ben\bnt\bta\bat\bti\bio\bon\bn *\b**\b**\b**\b**\b*\n+*\b**\b**\b**\b**\b* _\b?\b\u25c6_\b?\b\u00a0C\bCo\bom\bmp\bpo\bos\bse\beM\bMP\bPI\bIO\bOp\bp *\b**\b**\b**\b**\b*\n+#define ComposeMPIOp ( \u00a0 func,\n+ \u00a0 op\u00a0\n+ )\n+V\bVa\bal\blu\bue\be:\b:\n+template \\\n+class Generic_MPI_Op, _\bs_\bt_\bd::enable_if_t::is_intrinsic> >\n+{ \\\n+public: \\\n+static MPI_Op get(){ \\\n+return op; \\\n+} \\\n+private: \\\n+Generic_MPI_Op () {} \\\n+Generic_MPI_Op (const Generic_MPI_Op & ) {} \\\n+}\n+_\bs_\bt_\bd\n+STL namespace.\n ===============================================================================\n Generated by\u00a0_\b[_\bd_\bo_\bx_\by_\bg_\be_\bn_\b] 1.9.8\n"}]}, {"source1": "./usr/share/doc/libdune-common-doc/doxygen/a00077_source.html", "source2": "./usr/share/doc/libdune-common-doc/doxygen/a00077_source.html", "unified_diff": "@@ -1,15 +1,15 @@\n \n \n \n \n \n \n \n-dune-common: remoteindices.hh Source File\n+dune-common: mpicommunication.hh Source File\n \n \n \n \n \n \n \n@@ -74,1694 +74,584 @@\n \n \n \n
    \n-
    remoteindices.hh
    \n+
    mpicommunication.hh
    \n
    \n
    \n Go to the documentation of this file.
    1// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
    \n
    2// vi: set et ts=4 sw=2 sts=2:
    \n
    3// SPDX-FileCopyrightInfo: Copyright \u00a9 DUNE Project contributors, see file LICENSE.md in module root
    \n
    4// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception
    \n-
    5#ifndef DUNE_COMMON_PARALLEL_REMOTEINDICES_HH
    \n-
    6#define DUNE_COMMON_PARALLEL_REMOTEINDICES_HH
    \n+
    5#ifndef DUNE_COMMON_PARALLEL_MPICOMMUNICATION_HH
    \n+
    6#define DUNE_COMMON_PARALLEL_MPICOMMUNICATION_HH
    \n
    7
    \n-
    8#if HAVE_MPI
    \n-
    9
    \n-
    10#include <cassert>
    \n-
    11#include <iostream>
    \n-
    12#include <ostream>
    \n-
    13#include <map>
    \n-
    14#include <memory>
    \n-
    15#include <set>
    \n-
    16#include <tuple>
    \n-
    17#include <utility>
    \n-
    18#include <vector>
    \n-
    19
    \n-
    20#include <mpi.h>
    \n+
    16#if HAVE_MPI
    \n+
    17
    \n+
    18#include <algorithm>
    \n+
    19#include <functional>
    \n+
    20#include <memory>
    \n
    21
    \n-\n-
    23#include <dune/common/sllist.hh>
    \n-\n-\n-\n-\n-
    28
    \n-
    29namespace Dune {
    \n-
    41 template<typename TG, typename TA>
    \n-
    \n-\n-
    43 {
    \n-
    44 public:
    \n-
    45 inline static MPI_Datatype getType();
    \n-
    46 private:
    \n-
    47 static MPI_Datatype type;
    \n-
    48 };
    \n-
    \n-
    49
    \n-
    50
    \n-
    51 template<typename T, typename A>
    \n-
    52 class RemoteIndices;
    \n-
    53
    \n-
    54 template<typename T1, typename T2>
    \n-
    55 class RemoteIndex;
    \n-
    56
    \n-
    57 // forward declaration needed for friend declaration.
    \n-
    58 template<typename T>
    \n-
    59 class IndicesSyncer;
    \n-
    60
    \n-
    61 template<typename T1, typename T2>
    \n-
    62 std::ostream& operator<<(std::ostream& os, const RemoteIndex<T1,T2>& index);
    \n-
    63
    \n-
    64
    \n-
    65 template<typename T, typename A, bool mode>
    \n-\n-
    67
    \n-
    68
    \n-
    72 template<typename T1, typename T2>
    \n-
    \n-\n-
    74 {
    \n-
    75 template<typename T>
    \n-
    76 friend class IndicesSyncer;
    \n-
    77
    \n-
    78 template<typename T, typename A, typename A1>
    \n-
    79 friend void repairLocalIndexPointers(std::map<int,SLList<std::pair<typename T::GlobalIndex, typename T::LocalIndex::Attribute>,A> >&,
    \n-\n-
    81 const T&);
    \n-
    82
    \n-
    83 template<typename T, typename A, bool mode>
    \n-\n-
    85
    \n-
    86 public:
    \n-
    91 typedef T1 GlobalIndex;
    \n-
    100 typedef T2 Attribute;
    \n-
    101
    \n-\n-\n-
    107
    \n-
    112 const Attribute attribute() const;
    \n-
    113
    \n-
    119 const PairType& localIndexPair() const;
    \n-
    120
    \n-
    124 RemoteIndex();
    \n-
    125
    \n+
    22#include <mpi.h>
    \n+
    23
    \n+\n+\n+\n+\n+\n+\n+
    30
    \n+
    31namespace Dune
    \n+
    32{
    \n+
    33
    \n+
    34 //=======================================================
    \n+
    35 // use singleton pattern and template specialization to
    \n+
    36 // generate MPI operations
    \n+
    37 //=======================================================
    \n+
    38
    \n+
    39 template<typename Type, typename BinaryFunction, typename Enable=void>
    \n+
    \n+\n+
    41 {
    \n+
    42
    \n+
    43 public:
    \n+
    \n+
    44 static MPI_Op get ()
    \n+
    45 {
    \n+
    46 if (!op)
    \n+
    47 {
    \n+
    48 op = std::make_unique<MPI_Op>();
    \n+
    49 // The following line leaks an MPI operation object, because the corresponding
    \n+
    50 //`MPI_Op_free` is never called. It is never called because there is no easy
    \n+
    51 // way to call it at the right moment: right before the call to MPI_Finalize.
    \n+
    52 // See https://gitlab.dune-project.org/core/dune-istl/issues/80
    \n+
    53 MPI_Op_create((void (*)(void*, void*, int*, MPI_Datatype*))&operation,true,op.get());
    \n+
    54 }
    \n+
    55 return *op;
    \n+
    56 }
    \n+
    \n+
    57 private:
    \n+
    58 static void operation (Type *in, Type *inout, int *len, MPI_Datatype*)
    \n+
    59 {
    \n+
    60 BinaryFunction func;
    \n+
    61
    \n+
    62 for (int i=0; i< *len; ++i, ++in, ++inout) {
    \n+
    63 Type temp;
    \n+
    64 temp = func(*in, *inout);
    \n+
    65 *inout = temp;
    \n+
    66 }
    \n+
    67 }
    \n+
    68 Generic_MPI_Op () {}
    \n+
    69 Generic_MPI_Op (const Generic_MPI_Op& ) {}
    \n+
    70 static std::unique_ptr<MPI_Op> op;
    \n+
    71 };
    \n+
    \n+
    72
    \n+
    73
    \n+
    74 template<typename Type, typename BinaryFunction, typename Enable>
    \n+
    75 std::unique_ptr<MPI_Op> Generic_MPI_Op<Type,BinaryFunction, Enable>::op;
    \n+
    76
    \n+
    \n+
    77#define ComposeMPIOp(func,op) \\
    \n+
    78 template<class T, class S> \\
    \n+
    79 class Generic_MPI_Op<T, func<S>, std::enable_if_t<MPITraits<S>::is_intrinsic> >{ \\
    \n+
    80 public: \\
    \n+
    81 static MPI_Op get(){ \\
    \n+
    82 return op; \\
    \n+
    83 } \\
    \n+
    84 private: \\
    \n+
    85 Generic_MPI_Op () {} \\
    \n+
    86 Generic_MPI_Op (const Generic_MPI_Op & ) {} \\
    \n+
    87 }
    \n+
    \n+
    88
    \n+
    89
    \n+
    90 ComposeMPIOp(std::plus, MPI_SUM);
    \n+
    91 ComposeMPIOp(std::multiplies, MPI_PROD);
    \n+
    92 ComposeMPIOp(Min, MPI_MIN);
    \n+
    93 ComposeMPIOp(Max, MPI_MAX);
    \n+
    94
    \n+
    95#undef ComposeMPIOp
    \n+
    96
    \n+
    97
    \n+
    98 //=======================================================
    \n+
    99 // use singleton pattern and template specialization to
    \n+
    100 // generate MPI operations
    \n+
    101 //=======================================================
    \n+
    102
    \n+
    106 template<>
    \n+
    \n+
    107 class Communication<MPI_Comm>
    \n+
    108 {
    \n+
    109 public:
    \n+
    \n+
    111 Communication (const MPI_Comm& c = MPI_COMM_WORLD)
    \n+
    112 : communicator(c)
    \n+
    113 {
    \n+
    114 if(communicator!=MPI_COMM_NULL) {
    \n+
    115 int initialized = 0;
    \n+
    116 MPI_Initialized(&initialized);
    \n+
    117 if (!initialized)
    \n+
    118 DUNE_THROW(ParallelError,"You must call MPIHelper::instance(argc,argv) in your main() function before using the MPI Communication!");
    \n+
    119 MPI_Comm_rank(communicator,&me);
    \n+
    120 MPI_Comm_size(communicator,&procs);
    \n+
    121 }else{
    \n+
    122 procs=0;
    \n+
    123 me=-1;
    \n+
    124 }
    \n+
    125 }
    \n+
    \n
    126
    \n-
    132 RemoteIndex(const T2& attribute,
    \n-
    133 const PairType* local);
    \n-
    134
    \n-
    135
    \n-
    141 RemoteIndex(const T2& attribute);
    \n-
    142
    \n-
    143 bool operator==(const RemoteIndex& ri) const;
    \n-
    144
    \n-
    145 bool operator!=(const RemoteIndex& ri) const;
    \n-
    146 private:
    \n-
    148 const PairType* localIndex_;
    \n-
    149
    \n-
    151 char attribute_;
    \n-
    152 };
    \n-
    \n-
    153
    \n-
    154 template<class T, class A>
    \n-
    155 std::ostream& operator<<(std::ostream& os, const RemoteIndices<T,A>& indices);
    \n-
    156
    \n-
    157 class InterfaceBuilder;
    \n-
    158
    \n-
    159 template<class T, class A>
    \n-
    160 class CollectiveIterator;
    \n-
    161
    \n-
    162 // forward declaration needed for friend declaration.
    \n-
    163 template<class T>
    \n-
    164 class IndicesSyncer;
    \n-
    165
    \n-
    166 // forward declaration needed for friend declaration.
    \n-
    167 template<typename T1, typename T2>
    \n-\n-
    169
    \n-
    170
    \n-
    187 template<class T, class A=std::allocator<RemoteIndex<typename T::GlobalIndex,
    \n-
    188 typename T::LocalIndex::Attribute> > >
    \n-
    \n-\n-
    190 {
    \n-
    191 friend class InterfaceBuilder;
    \n-
    192 friend class IndicesSyncer<T>;
    \n-
    193 template<typename T1, typename A2, typename A1>
    \n-
    194 friend void repairLocalIndexPointers(std::map<int,SLList<std::pair<typename T1::GlobalIndex, typename T1::LocalIndex::Attribute>,A2> >&,
    \n-\n-
    196 const T1&);
    \n-
    197
    \n-
    198 template<class G, class T1, class T2>
    \n-\n-
    200 friend std::ostream& operator<<<>(std::ostream&, const RemoteIndices<T>&);
    \n-
    201
    \n-
    202 public:
    \n-
    203
    \n-\n-
    208
    \n-\n-
    212
    \n-\n-
    217
    \n-
    218
    \n-\n-
    223
    \n-
    227 typedef typename LocalIndex::Attribute Attribute;
    \n-
    228
    \n-\n-
    233
    \n-
    234
    \n-
    238 using Allocator = typename std::allocator_traits<A>::template rebind_alloc<RemoteIndex>;
    \n-
    239
    \n-\n-\n-
    243
    \n-
    245 typedef std::map<int, std::pair<RemoteIndexList*,RemoteIndexList*> >
    \n-\n-
    247
    \n-
    248 typedef typename RemoteIndexMap::const_iterator const_iterator;
    \n-
    249
    \n-
    267 inline RemoteIndices(const ParallelIndexSet& source, const ParallelIndexSet& destination,
    \n-
    268 const MPI_Comm& comm, const std::vector<int>& neighbours=std::vector<int>(), bool includeSelf=false);
    \n-
    269
    \n-\n-
    271
    \n-
    279 void setIncludeSelf(bool includeSelf);
    \n-
    280
    \n-
    297 void setIndexSets(const ParallelIndexSet& source, const ParallelIndexSet& destination,
    \n-
    298 const MPI_Comm& comm, const std::vector<int>& neighbours=std::vector<int>());
    \n-
    299
    \n-
    300 template<typename C>
    \n-
    \n-\n-
    302 {
    \n-
    303 neighbourIds.clear();
    \n-
    304 neighbourIds.insert(neighbours.begin(), neighbours.end());
    \n-
    305
    \n-
    306 }
    \n-
    \n-
    307
    \n-
    \n-
    308 const std::set<int>& getNeighbours() const
    \n-
    309 {
    \n-
    310 return neighbourIds;
    \n-
    311 }
    \n-
    \n-
    312
    \n-\n-
    317
    \n-
    327 template<bool ignorePublic>
    \n-
    328 void rebuild();
    \n-
    329
    \n-
    330 bool operator==(const RemoteIndices& ri) const;
    \n-
    331
    \n-
    339 inline bool isSynced() const;
    \n-
    340
    \n-
    344 inline MPI_Comm communicator() const;
    \n-
    345
    \n-
    360 template<bool mode, bool send>
    \n-\n-
    362
    \n-
    369 inline const_iterator find(int proc) const;
    \n-
    370
    \n-
    375 inline const_iterator begin() const;
    \n-
    376
    \n-
    381 inline const_iterator end() const;
    \n-
    382
    \n-
    386 template<bool send>
    \n-
    387 inline CollectiveIteratorT iterator() const;
    \n-
    388
    \n-
    392 inline void free();
    \n-
    393
    \n-
    398 inline int neighbours() const;
    \n-
    399
    \n-
    401 inline const ParallelIndexSet& sourceIndexSet() const;
    \n+
    \n+\n+
    129 : Communication(MPI_COMM_SELF)
    \n+
    130 {}
    \n+
    \n+
    131
    \n+
    \n+
    133 int rank () const
    \n+
    134 {
    \n+
    135 return me;
    \n+
    136 }
    \n+
    \n+
    137
    \n+
    \n+
    139 int size () const
    \n+
    140 {
    \n+
    141 return procs;
    \n+
    142 }
    \n+
    \n+
    143
    \n+
    145 template<class T>
    \n+
    \n+
    146 int send(const T& data, int dest_rank, int tag) const
    \n+
    147 {
    \n+
    148 auto mpi_data = getMPIData(data);
    \n+
    149 return MPI_Send(mpi_data.ptr(), mpi_data.size(), mpi_data.type(),
    \n+
    150 dest_rank, tag, communicator);
    \n+
    151 }
    \n+
    \n+
    152
    \n+
    154 template<class T>
    \n+
    \n+
    155 MPIFuture<T> isend(T&& data, int dest_rank, int tag) const
    \n+
    156 {
    \n+
    157 MPIFuture<T> future(std::forward<T>(data));
    \n+
    158 auto mpidata = future.get_mpidata();
    \n+
    159 MPI_Isend(mpidata.ptr(), mpidata.size(), mpidata.type(),
    \n+
    160 dest_rank, tag, communicator, &future.req_);
    \n+
    161 return future;
    \n+
    162 }
    \n+
    \n+
    163
    \n+
    165 template<class T>
    \n+
    \n+
    166 T recv(T&& data, int source_rank, int tag, MPI_Status* status = MPI_STATUS_IGNORE) const
    \n+
    167 {
    \n+
    168 T lvalue_data(std::forward<T>(data));
    \n+
    169 auto mpi_data = getMPIData(lvalue_data);
    \n+
    170 MPI_Recv(mpi_data.ptr(), mpi_data.size(), mpi_data.type(),
    \n+
    171 source_rank, tag, communicator, status);
    \n+
    172 return lvalue_data;
    \n+
    173 }
    \n+
    \n+
    174
    \n+
    176 template<class T>
    \n+
    \n+
    177 MPIFuture<T> irecv(T&& data, int source_rank, int tag) const
    \n+
    178 {
    \n+
    179 MPIFuture<T> future(std::forward<T>(data));
    \n+
    180 auto mpidata = future.get_mpidata();
    \n+
    181 if (mpidata.size() == 0)
    \n+
    182 DUNE_THROW(ParallelError, "Size if irecv data object is zero. Reserve sufficient size for the whole message");
    \n+
    183 MPI_Irecv(mpidata.ptr(), mpidata.size(), mpidata.type(),
    \n+
    184 source_rank, tag, communicator, &future.req_);
    \n+
    185 return future;
    \n+
    186 }
    \n+
    \n+
    187
    \n+
    188 template<class T>
    \n+
    \n+
    189 T rrecv(T&& data, int source_rank, int tag, MPI_Status* status = MPI_STATUS_IGNORE) const
    \n+
    190 {
    \n+
    191 MPI_Status _status;
    \n+
    192 MPI_Message _message;
    \n+
    193 T lvalue_data(std::forward<T>(data));
    \n+
    194 auto mpi_data = getMPIData(lvalue_data);
    \n+
    195 static_assert(!mpi_data.static_size, "rrecv work only for non-static-sized types.");
    \n+
    196 if(status == MPI_STATUS_IGNORE)
    \n+
    197 status = &_status;
    \n+
    198 MPI_Mprobe(source_rank, tag, communicator, &_message, status);
    \n+
    199 int size;
    \n+
    200 MPI_Get_count(status, mpi_data.type(), &size);
    \n+
    201 mpi_data.resize(size);
    \n+
    202 MPI_Mrecv(mpi_data.ptr(), mpi_data.size(), mpi_data.type(), &_message, status);
    \n+
    203 return lvalue_data;
    \n+
    204 }
    \n+
    \n+
    205
    \n+
    207 template<typename T>
    \n+
    \n+
    208 T sum (const T& in) const
    \n+
    209 {
    \n+
    210 T out;
    \n+
    211 allreduce<std::plus<T> >(&in,&out,1);
    \n+
    212 return out;
    \n+
    213 }
    \n+
    \n+
    214
    \n+
    216 template<typename T>
    \n+
    \n+
    217 int sum (T* inout, int len) const
    \n+
    218 {
    \n+
    219 return allreduce<std::plus<T> >(inout,len);
    \n+
    220 }
    \n+
    \n+
    221
    \n+
    223 template<typename T>
    \n+
    \n+
    224 T prod (const T& in) const
    \n+
    225 {
    \n+
    226 T out;
    \n+
    227 allreduce<std::multiplies<T> >(&in,&out,1);
    \n+
    228 return out;
    \n+
    229 }
    \n+
    \n+
    230
    \n+
    232 template<typename T>
    \n+
    \n+
    233 int prod (T* inout, int len) const
    \n+
    234 {
    \n+
    235 return allreduce<std::multiplies<T> >(inout,len);
    \n+
    236 }
    \n+
    \n+
    237
    \n+
    239 template<typename T>
    \n+
    \n+
    240 T min (const T& in) const
    \n+
    241 {
    \n+
    242 T out;
    \n+
    243 allreduce<Min<T> >(&in,&out,1);
    \n+
    244 return out;
    \n+
    245 }
    \n+
    \n+
    246
    \n+
    248 template<typename T>
    \n+
    \n+
    249 int min (T* inout, int len) const
    \n+
    250 {
    \n+
    251 return allreduce<Min<T> >(inout,len);
    \n+
    252 }
    \n+
    \n+
    253
    \n+
    254
    \n+
    256 template<typename T>
    \n+
    \n+
    257 T max (const T& in) const
    \n+
    258 {
    \n+
    259 T out;
    \n+
    260 allreduce<Max<T> >(&in,&out,1);
    \n+
    261 return out;
    \n+
    262 }
    \n+
    \n+
    263
    \n+
    265 template<typename T>
    \n+
    \n+
    266 int max (T* inout, int len) const
    \n+
    267 {
    \n+
    268 return allreduce<Max<T> >(inout,len);
    \n+
    269 }
    \n+
    \n+
    270
    \n+
    \n+
    272 int barrier () const
    \n+
    273 {
    \n+
    274 return MPI_Barrier(communicator);
    \n+
    275 }
    \n+
    \n+
    276
    \n+
    \n+\n+
    279 {
    \n+
    280 MPIFuture<void> future(true); // make a valid MPIFuture<void>
    \n+
    281 MPI_Ibarrier(communicator, &future.req_);
    \n+
    282 return future;
    \n+
    283 }
    \n+
    \n+
    284
    \n+
    285
    \n+
    287 template<typename T>
    \n+
    \n+
    288 int broadcast (T* inout, int len, int root) const
    \n+
    289 {
    \n+
    290 return MPI_Bcast(inout,len,MPITraits<T>::getType(),root,communicator);
    \n+
    291 }
    \n+
    \n+
    292
    \n+
    294 template<class T>
    \n+
    \n+
    295 MPIFuture<T> ibroadcast(T&& data, int root) const{
    \n+
    296 MPIFuture<T> future(std::forward<T>(data));
    \n+
    297 auto mpidata = future.get_mpidata();
    \n+
    298 MPI_Ibcast(mpidata.ptr(),
    \n+
    299 mpidata.size(),
    \n+
    300 mpidata.type(),
    \n+
    301 root,
    \n+
    302 communicator,
    \n+
    303 &future.req_);
    \n+
    304 return future;
    \n+
    305 }
    \n+
    \n+
    306
    \n+
    309 template<typename T>
    \n+
    \n+
    310 int gather (const T* in, T* out, int len, int root) const
    \n+
    311 {
    \n+
    312 return MPI_Gather(const_cast<T*>(in),len,MPITraits<T>::getType(),
    \n+
    313 out,len,MPITraits<T>::getType(),
    \n+
    314 root,communicator);
    \n+
    315 }
    \n+
    \n+
    316
    \n+
    318 template<class TIN, class TOUT = std::vector<TIN>>
    \n+
    \n+
    319 MPIFuture<TOUT, TIN> igather(TIN&& data_in, TOUT&& data_out, int root) const{
    \n+
    320 MPIFuture<TOUT, TIN> future(std::forward<TOUT>(data_out), std::forward<TIN>(data_in));
    \n+
    321 auto mpidata_in = future.get_send_mpidata();
    \n+
    322 auto mpidata_out = future.get_mpidata();
    \n+
    323 assert(root != me || mpidata_in.size()*procs <= mpidata_out.size());
    \n+
    324 int outlen = (me==root) * mpidata_in.size();
    \n+
    325 MPI_Igather(mpidata_in.ptr(), mpidata_in.size(), mpidata_in.type(),
    \n+
    326 mpidata_out.ptr(), outlen, mpidata_out.type(),
    \n+
    327 root, communicator, &future.req_);
    \n+
    328 return future;
    \n+
    329 }
    \n+
    \n+
    330
    \n+
    332 template<typename T>
    \n+
    \n+
    333 int gatherv (const T* in, int sendDataLen, T* out, int* recvDataLen, int* displ, int root) const
    \n+
    334 {
    \n+
    335 return MPI_Gatherv(const_cast<T*>(in),sendDataLen,MPITraits<T>::getType(),
    \n+
    336 out,recvDataLen,displ,MPITraits<T>::getType(),
    \n+
    337 root,communicator);
    \n+
    338 }
    \n+
    \n+
    339
    \n+
    342 template<typename T>
    \n+
    \n+
    343 int scatter (const T* sendData, T* recvData, int len, int root) const
    \n+
    344 {
    \n+
    345 return MPI_Scatter(const_cast<T*>(sendData),len,MPITraits<T>::getType(),
    \n+
    346 recvData,len,MPITraits<T>::getType(),
    \n+
    347 root,communicator);
    \n+
    348 }
    \n+
    \n+
    349
    \n+
    351 template<class TIN, class TOUT = TIN>
    \n+
    \n+
    352 MPIFuture<TOUT, TIN> iscatter(TIN&& data_in, TOUT&& data_out, int root) const
    \n+
    353 {
    \n+
    354 MPIFuture<TOUT, TIN> future(std::forward<TOUT>(data_out), std::forward<TIN>(data_in));
    \n+
    355 auto mpidata_in = future.get_send_mpidata();
    \n+
    356 auto mpidata_out = future.get_mpidata();
    \n+
    357 int inlen = (me==root) * mpidata_in.size()/procs;
    \n+
    358 MPI_Iscatter(mpidata_in.ptr(), inlen, mpidata_in.type(),
    \n+
    359 mpidata_out.ptr(), mpidata_out.size(), mpidata_out.type(),
    \n+
    360 root, communicator, &future.req_);
    \n+
    361 return future;
    \n+
    362 }
    \n+
    \n+
    363
    \n+
    365 template<typename T>
    \n+
    \n+
    366 int scatterv (const T* sendData, int* sendDataLen, int* displ, T* recvData, int recvDataLen, int root) const
    \n+
    367 {
    \n+
    368 return MPI_Scatterv(const_cast<T*>(sendData),sendDataLen,displ,MPITraits<T>::getType(),
    \n+
    369 recvData,recvDataLen,MPITraits<T>::getType(),
    \n+
    370 root,communicator);
    \n+
    371 }
    \n+
    \n+
    372
    \n+
    373
    \n+
    \n+
    374 operator MPI_Comm () const
    \n+
    375 {
    \n+
    376 return communicator;
    \n+
    377 }
    \n+
    \n+
    378
    \n+
    380 template<typename T, typename T1>
    \n+
    \n+
    381 int allgather(const T* sbuf, int count, T1* rbuf) const
    \n+
    382 {
    \n+
    383 return MPI_Allgather(const_cast<T*>(sbuf), count, MPITraits<T>::getType(),
    \n+
    384 rbuf, count, MPITraits<T1>::getType(),
    \n+
    385 communicator);
    \n+
    386 }
    \n+
    \n+
    387
    \n+
    389 template<class TIN, class TOUT = TIN>
    \n+
    \n+
    390 MPIFuture<TOUT, TIN> iallgather(TIN&& data_in, TOUT&& data_out) const
    \n+
    391 {
    \n+
    392 MPIFuture<TOUT, TIN> future(std::forward<TOUT>(data_out), std::forward<TIN>(data_in));
    \n+
    393 auto mpidata_in = future.get_send_mpidata();
    \n+
    394 auto mpidata_out = future.get_mpidata();
    \n+
    395 assert(mpidata_in.size()*procs <= mpidata_out.size());
    \n+
    396 int outlen = mpidata_in.size();
    \n+
    397 MPI_Iallgather(mpidata_in.ptr(), mpidata_in.size(), mpidata_in.type(),
    \n+
    398 mpidata_out.ptr(), outlen, mpidata_out.type(),
    \n+
    399 communicator, &future.req_);
    \n+
    400 return future;
    \n+
    401 }
    \n+
    \n
    402
    \n-
    404 inline const ParallelIndexSet& destinationIndexSet() const;
    \n-
    405
    \n-
    406 private:
    \n-
    408 RemoteIndices(const RemoteIndices&) = delete;
    \n-
    409
    \n-
    411 const ParallelIndexSet* source_;
    \n-
    412
    \n-
    414 const ParallelIndexSet* target_;
    \n-
    415
    \n-
    417 MPI_Comm comm_;
    \n-
    418
    \n-
    421 std::set<int> neighbourIds;
    \n+
    404 template<typename T>
    \n+
    \n+
    405 int allgatherv (const T* in, int sendDataLen, T* out, int* recvDataLen, int* displ) const
    \n+
    406 {
    \n+
    407 return MPI_Allgatherv(const_cast<T*>(in),sendDataLen,MPITraits<T>::getType(),
    \n+
    408 out,recvDataLen,displ,MPITraits<T>::getType(),
    \n+
    409 communicator);
    \n+
    410 }
    \n+
    \n+
    411
    \n+
    413 template<typename BinaryFunction, typename Type>
    \n+
    \n+
    414 int allreduce(Type* inout, int len) const
    \n+
    415 {
    \n+
    416 Type* out = new Type[len];
    \n+
    417 int ret = allreduce<BinaryFunction>(inout,out,len);
    \n+
    418 std::copy(out, out+len, inout);
    \n+
    419 delete[] out;
    \n+
    420 return ret;
    \n+
    421 }
    \n+
    \n
    422
    \n-
    424 const static int commTag_=333;
    \n-
    425
    \n-
    430 int sourceSeqNo_;
    \n-
    431
    \n-
    436 int destSeqNo_;
    \n-
    437
    \n-
    441 bool publicIgnored;
    \n-
    442
    \n-
    446 bool firstBuild;
    \n+
    423 template<typename BinaryFunction, typename Type>
    \n+
    \n+
    424 Type allreduce(Type&& in) const{
    \n+
    425 Type lvalue_data = std::forward<Type>(in);
    \n+
    426 auto data = getMPIData(lvalue_data);
    \n+
    427 MPI_Allreduce(MPI_IN_PLACE, data.ptr(), data.size(), data.type(),
    \n+\n+
    429 communicator);
    \n+
    430 return lvalue_data;
    \n+
    431 }
    \n+
    \n+
    432
    \n+
    434 template<class BinaryFunction, class TIN, class TOUT = TIN>
    \n+
    \n+
    435 MPIFuture<TOUT, TIN> iallreduce(TIN&& data_in, TOUT&& data_out) const {
    \n+
    436 MPIFuture<TOUT, TIN> future(std::forward<TOUT>(data_out), std::forward<TIN>(data_in));
    \n+
    437 auto mpidata_in = future.get_send_mpidata();
    \n+
    438 auto mpidata_out = future.get_mpidata();
    \n+
    439 assert(mpidata_out.size() == mpidata_in.size());
    \n+
    440 assert(mpidata_out.type() == mpidata_in.type());
    \n+
    441 MPI_Iallreduce(mpidata_in.ptr(), mpidata_out.ptr(),
    \n+
    442 mpidata_out.size(), mpidata_out.type(),
    \n+\n+
    444 communicator, &future.req_);
    \n+
    445 return future;
    \n+
    446 }
    \n+
    \n
    447
    \n-
    448 /*
    \n-
    449 * @brief If true, sending from indices of the processor to other
    \n-
    450 * indices on the same processor is enabled even if the same indexset is used
    \n-
    451 * on both the
    \n-
    452 * sending and receiving side.
    \n-
    453 */
    \n-
    454 bool includeSelf;
    \n-
    455
    \n-\n-
    458 PairType;
    \n+
    449 template<class BinaryFunction, class T>
    \n+
    \n+
    450 MPIFuture<T> iallreduce(T&& data) const{
    \n+
    451 MPIFuture<T> future(std::forward<T>(data));
    \n+
    452 auto mpidata = future.get_mpidata();
    \n+
    453 MPI_Iallreduce(MPI_IN_PLACE, mpidata.ptr(),
    \n+
    454 mpidata.size(), mpidata.type(),
    \n+\n+
    456 communicator, &future.req_);
    \n+
    457 return future;
    \n+
    458 }
    \n+
    \n
    459
    \n-
    466 RemoteIndexMap remoteIndices_;
    \n+
    461 template<typename BinaryFunction, typename Type>
    \n+
    \n+
    462 int allreduce(const Type* in, Type* out, int len) const
    \n+
    463 {
    \n+
    464 return MPI_Allreduce(const_cast<Type*>(in), out, len, MPITraits<Type>::getType(),
    \n+\n+
    466 }
    \n+
    \n
    467
    \n-
    478 template<bool ignorePublic>
    \n-
    479 inline void buildRemote(bool includeSelf);
    \n-
    480
    \n-
    486 inline int noPublic(const ParallelIndexSet& indexSet);
    \n-
    487
    \n-
    499 template<bool ignorePublic>
    \n-
    500 inline void packEntries(PairType** myPairs, const ParallelIndexSet& indexSet,
    \n-
    501 char* p_out, MPI_Datatype type, int bufferSize,
    \n-
    502 int* position, int n);
    \n-
    503
    \n-
    517 inline void unpackIndices(RemoteIndexList& remote, int remoteEntries,
    \n-
    518 PairType** local, int localEntries, char* p_in,
    \n-
    519 MPI_Datatype type, int* position, int bufferSize,
    \n-
    520 bool fromOurself);
    \n-
    521
    \n-
    522 inline void unpackIndices(RemoteIndexList& send, RemoteIndexList& receive,
    \n-
    523 int remoteEntries, PairType** localSource,
    \n-
    524 int localSourceEntries, PairType** localDest,
    \n-
    525 int localDestEntries, char* p_in,
    \n-
    526 MPI_Datatype type, int* position, int bufferSize);
    \n-
    527
    \n-
    528 void unpackCreateRemote(char* p_in, PairType** sourcePairs, PairType** DestPairs,
    \n-
    529 int remoteProc, int sourcePublish, int destPublish,
    \n-
    530 int bufferSize, bool sendTwo, bool fromOurSelf=false);
    \n-
    531 };
    \n-
    \n-
    532
    \n-
    548 template<class T, class A, bool mode>
    \n-
    \n-\n-
    550 {
    \n-
    551
    \n-
    552 template<typename T1, typename A1>
    \n-
    553 friend class RemoteIndices;
    \n-
    554
    \n-
    555 public:
    \n-
    \n-\n-
    557 {};
    \n-
    \n-
    558
    \n-
    567 constexpr static bool MODIFYINDEXSET = mode;
    \n-
    568
    \n-\n-
    573
    \n-\n-
    578
    \n-\n-
    583
    \n-
    587 typedef typename LocalIndex::Attribute Attribute;
    \n-
    588
    \n-\n-
    593
    \n-
    597 typedef A Allocator;
    \n-
    598
    \n-\n-\n-
    602
    \n-\n-
    607
    \n-\n-
    612
    \n-
    626 void insert(const RemoteIndex& index);
    \n-
    627
    \n-
    628
    \n-
    643 void insert(const RemoteIndex& index, const GlobalIndex& global);
    \n-
    644
    \n-
    652 bool remove(const GlobalIndex& global);
    \n-
    653
    \n-\n-
    667
    \n-
    668
    \n-\n-
    670
    \n-
    \n-\n-
    676 : glist_()
    \n-
    677 {}
    \n-
    \n-
    678
    \n-
    679 private:
    \n-
    680
    \n-\n-
    687 RemoteIndexList& rList);
    \n-
    688
    \n-
    689 typedef SLList<GlobalIndex,Allocator> GlobalList;
    \n-
    690 typedef typename GlobalList::ModifyIterator GlobalModifyIterator;
    \n-
    691 RemoteIndexList* rList_;
    \n-
    692 const ParallelIndexSet* indexSet_;
    \n-
    693 GlobalList glist_;
    \n-
    694 ModifyIterator iter_;
    \n-
    695 GlobalModifyIterator giter_;
    \n-
    696 ConstIterator end_;
    \n-
    697 bool first_;
    \n-
    698 GlobalIndex last_;
    \n-
    699 };
    \n-
    \n-
    700
    \n-
    705 template<class T, class A>
    \n-
    \n-\n-
    707 {
    \n-
    708
    \n-
    712 typedef T ParallelIndexSet;
    \n-
    713
    \n-
    717 typedef typename ParallelIndexSet::GlobalIndex GlobalIndex;
    \n-
    718
    \n-
    722 typedef typename ParallelIndexSet::LocalIndex LocalIndex;
    \n-
    723
    \n-
    727 typedef typename LocalIndex::Attribute Attribute;
    \n-
    728
    \n-\n-
    731
    \n-
    733 using Allocator = typename std::allocator_traits<A>::template rebind_alloc<RemoteIndex>;
    \n-
    734
    \n-\n-
    737
    \n-
    739 typedef std::map<int,std::pair<typename RemoteIndexList::const_iterator,
    \n-
    740 const typename RemoteIndexList::const_iterator> >
    \n-
    741 Map;
    \n-
    742
    \n-
    743 public:
    \n-
    744
    \n-
    746 typedef std::map<int, std::pair<RemoteIndexList*,RemoteIndexList*> >
    \n-\n-
    748
    \n-
    754 inline CollectiveIterator(const RemoteIndexMap& map_, bool send);
    \n-
    755
    \n-
    764 inline void advance(const GlobalIndex& global);
    \n-
    765
    \n-
    775 inline void advance(const GlobalIndex& global, const Attribute& attribute);
    \n-
    776
    \n-\n-
    778
    \n-
    782 inline bool empty() const;
    \n-
    783
    \n-
    \n-\n-
    791 {
    \n-
    792 public:
    \n-
    793 typedef typename Map::iterator RealIterator;
    \n-
    794 typedef typename Map::iterator ConstRealIterator;
    \n-
    795
    \n-
    796
    \n-
    \n-
    798 iterator(const RealIterator& iter, const ConstRealIterator& end, GlobalIndex& index)
    \n-
    799 : iter_(iter), end_(end), index_(index), hasAttribute(false)
    \n-
    800 {
    \n-
    801 // Move to the first valid entry
    \n-
    802 while(iter_!=end_ && iter_->second.first->localIndexPair().global()!=index_)
    \n-
    803 ++iter_;
    \n-
    804 }
    \n-
    \n-
    805
    \n-
    \n-
    806 iterator(const RealIterator& iter, const ConstRealIterator& end, GlobalIndex index,
    \n-
    807 Attribute attribute)
    \n-
    808 : iter_(iter), end_(end), index_(index), attribute_(attribute), hasAttribute(true)
    \n-
    809 {
    \n-
    810 // Move to the first valid entry or the end
    \n-
    811 while(iter_!=end_ && (iter_->second.first->localIndexPair().global()!=index_
    \n-
    812 || iter_->second.first->localIndexPair().local().attribute()!=attribute))
    \n-
    813 ++iter_;
    \n-
    814 }
    \n-
    \n-
    \n-
    816 iterator(const iterator& other)
    \n-
    817 : iter_(other.iter_), end_(other.end_), index_(other.index_)
    \n-
    818 { }
    \n-
    \n-
    819
    \n-
    \n-\n-
    822 {
    \n-
    823 ++iter_;
    \n-
    824 // If entry is not valid move on
    \n-
    825 while(iter_!=end_ && (iter_->second.first->localIndexPair().global()!=index_ ||
    \n-
    826 (hasAttribute &&
    \n-
    827 iter_->second.first->localIndexPair().local().attribute()!=attribute_)))
    \n-
    828 ++iter_;
    \n-
    829 assert(iter_==end_ ||
    \n-
    830 (iter_->second.first->localIndexPair().global()==index_));
    \n-
    831 assert(iter_==end_ || !hasAttribute ||
    \n-
    832 (iter_->second.first->localIndexPair().local().attribute()==attribute_));
    \n-
    833 return *this;
    \n-
    834 }
    \n-
    \n-
    835
    \n-
    \n-
    837 const RemoteIndex& operator*() const
    \n-
    838 {
    \n-
    839 return *(iter_->second.first);
    \n-
    840 }
    \n-
    \n-
    841
    \n-
    \n-
    843 int process() const
    \n-
    844 {
    \n-
    845 return iter_->first;
    \n-
    846 }
    \n-
    \n-
    847
    \n-
    \n-
    849 const RemoteIndex* operator->() const
    \n-
    850 {
    \n-
    851 return iter_->second.first.operator->();
    \n-
    852 }
    \n-
    \n-
    853
    \n-
    \n-
    855 bool operator==(const iterator& other) const
    \n-
    856 {
    \n-
    857 return other.iter_==iter_;
    \n-
    858 }
    \n-
    \n-
    859
    \n-
    \n-
    861 bool operator!=(const iterator& other) const
    \n-
    862 {
    \n-
    863 return other.iter_!=iter_;
    \n-
    864 }
    \n-
    \n-
    865
    \n-
    866 private:
    \n-
    867 iterator();
    \n-
    868
    \n-
    869 RealIterator iter_;
    \n-
    870 RealIterator end_;
    \n-
    871 GlobalIndex index_;
    \n-
    872 Attribute attribute_;
    \n-
    873 bool hasAttribute;
    \n-
    874 };
    \n-
    \n-
    875
    \n-
    876 iterator begin();
    \n-
    877
    \n-
    878 iterator end();
    \n-
    879
    \n-
    880 private:
    \n-
    881
    \n-
    882 Map map_;
    \n-
    883 GlobalIndex index_;
    \n-
    884 Attribute attribute_;
    \n-
    885 bool noattribute;
    \n-
    886 };
    \n-
    \n-
    887
    \n-
    888 template<typename TG, typename TA>
    \n-
    \n-\n-
    890 {
    \n-
    891 if(type==MPI_DATATYPE_NULL) {
    \n-
    892 int length[2] = {1, 1};
    \n-
    893 MPI_Aint base;
    \n-
    894 MPI_Aint disp[2];
    \n-
    895 MPI_Datatype types[2] = {MPITraits<TG>::getType(),
    \n-\n-\n-
    898 MPI_Get_address(&rep, &base); // lower bound of the datatype
    \n-
    899 MPI_Get_address(&(rep.global_), &disp[0]);
    \n-
    900 MPI_Get_address(&(rep.local_), &disp[1]);
    \n-
    901 for (MPI_Aint& d : disp)
    \n-
    902 d -= base;
    \n-
    903
    \n-
    904 MPI_Datatype tmp;
    \n-
    905 MPI_Type_create_struct(2, length, disp, types, &tmp);
    \n-
    906
    \n-
    907 MPI_Type_create_resized(tmp, 0, sizeof(IndexPair<TG,ParallelLocalIndex<TA> >), &type);
    \n-
    908 MPI_Type_commit(&type);
    \n-
    909
    \n-
    910 MPI_Type_free(&tmp);
    \n-
    911 }
    \n-
    912 return type;
    \n-
    913 }
    \n-
    \n-
    914
    \n-
    915 template<typename TG, typename TA>
    \n-
    916 MPI_Datatype MPITraits<IndexPair<TG,ParallelLocalIndex<TA> > >::type=MPI_DATATYPE_NULL;
    \n-
    917
    \n-
    918 template<typename T1, typename T2>
    \n-
    \n-
    919 RemoteIndex<T1,T2>::RemoteIndex(const T2& attribute, const PairType* local)
    \n-
    920 : localIndex_(local), attribute_(static_cast<std::underlying_type_t<T2>>(attribute))
    \n-
    921 {}
    \n-
    \n-
    922
    \n-
    923 template<typename T1, typename T2>
    \n-
    \n-\n-
    925 : localIndex_(0), attribute_(static_cast<std::underlying_type_t<T2>>(attribute))
    \n-
    926 {}
    \n-
    \n-
    927
    \n-
    928 template<typename T1, typename T2>
    \n-
    \n-\n-
    930 : localIndex_(0), attribute_()
    \n-
    931 {}
    \n-
    \n-
    932 template<typename T1, typename T2>
    \n-
    \n-
    933 inline bool RemoteIndex<T1,T2>::operator==(const RemoteIndex& ri) const
    \n-
    934 {
    \n-
    935 return localIndex_==ri.localIndex_ && attribute_==ri.attribute_;
    \n-
    936 }
    \n-
    \n-
    937
    \n-
    938 template<typename T1, typename T2>
    \n-
    \n-
    939 inline bool RemoteIndex<T1,T2>::operator!=(const RemoteIndex& ri) const
    \n-
    940 {
    \n-
    941 return localIndex_!=ri.localIndex_ || attribute_!=ri.attribute_;
    \n-
    942 }
    \n-
    \n-
    943
    \n-
    944 template<typename T1, typename T2>
    \n-
    \n-
    945 inline const T2 RemoteIndex<T1,T2>::attribute() const
    \n-
    946 {
    \n-
    947 return T2(attribute_);
    \n-
    948 }
    \n-
    \n-
    949
    \n-
    950 template<typename T1, typename T2>
    \n-
    \n-\n-
    952 {
    \n-
    953 return *localIndex_;
    \n-
    954 }
    \n-
    \n-
    955
    \n-
    956 template<typename T, typename A>
    \n-
    \n-\n-
    958 const ParallelIndexSet& destination,
    \n-
    959 const MPI_Comm& comm,
    \n-
    960 const std::vector<int>& neighbours,
    \n-
    961 bool includeSelf_)
    \n-
    962 : source_(&source), target_(&destination), comm_(comm),
    \n-
    963 sourceSeqNo_(-1), destSeqNo_(-1), publicIgnored(false), firstBuild(true),
    \n-
    964 includeSelf(includeSelf_)
    \n-
    965 {
    \n-\n-
    967 }
    \n-
    \n-
    968
    \n-
    969 template<typename T, typename A>
    \n-
    \n-\n-
    971 {
    \n-
    972 includeSelf=b;
    \n-
    973 }
    \n-
    \n-
    974
    \n-
    975 template<typename T, typename A>
    \n-
    \n-\n-
    977 : source_(0), target_(0), sourceSeqNo_(-1),
    \n-
    978 destSeqNo_(-1), publicIgnored(false), firstBuild(true),
    \n-
    979 includeSelf(false)
    \n-
    980 {}
    \n-
    \n-
    981
    \n-
    982 template<class T, typename A>
    \n-
    \n-\n-
    984 const ParallelIndexSet& destination,
    \n-
    985 const MPI_Comm& comm,
    \n-
    986 const std::vector<int>& neighbours)
    \n-
    987 {
    \n-
    988 free();
    \n-
    989 source_ = &source;
    \n-
    990 target_ = &destination;
    \n-
    991 comm_ = comm;
    \n-
    992 firstBuild = true;
    \n-
    993 setNeighbours(neighbours);
    \n-
    994 }
    \n-
    \n-
    995
    \n-
    996 template<typename T, typename A>
    \n-\n-
    \n-\n-
    999 {
    \n-
    1000 return *source_;
    \n-
    1001 }
    \n-
    \n-
    1002
    \n-
    1003
    \n-
    1004 template<typename T, typename A>
    \n-\n-
    \n-\n-
    1007 {
    \n-
    1008 return *target_;
    \n-
    1009 }
    \n-
    \n-
    1010
    \n-
    1011
    \n-
    1012 template<typename T, typename A>
    \n-
    \n-\n-
    1014 {
    \n-
    1015 free();
    \n-
    1016 }
    \n-
    \n-
    1017
    \n-
    1018 template<typename T, typename A>
    \n-
    1019 template<bool ignorePublic>
    \n-
    \n-\n-
    1021 const ParallelIndexSet& indexSet,
    \n-
    1022 char* p_out, MPI_Datatype type,
    \n-
    1023 int bufferSize,
    \n-
    1024 int *position,
    \n-
    1025 [[maybe_unused]] int n)
    \n-
    1026 {
    \n-
    1027 // fill with own indices
    \n-
    1028 const auto end = indexSet.end();
    \n-
    1029
    \n-
    1030 //Now pack the source indices
    \n-
    1031 int i=0;
    \n-
    1032 for(auto index = indexSet.begin(); index != end; ++index)
    \n-
    1033 if(ignorePublic || index->local().isPublic()) {
    \n-
    1034
    \n-
    1035 MPI_Pack(const_cast<PairType*>(&(*index)), 1,
    \n-
    1036 type,
    \n-
    1037 p_out, bufferSize, position, comm_);
    \n-
    1038 pairs[i++] = const_cast<PairType*>(&(*index));
    \n-
    1039
    \n-
    1040 }
    \n-
    1041 assert(i==n);
    \n-
    1042 }
    \n-
    \n-
    1043
    \n-
    1044 template<typename T, typename A>
    \n-
    1045 inline int RemoteIndices<T,A>::noPublic(const ParallelIndexSet& indexSet)
    \n-
    1046 {
    \n-
    1047
    \n-
    1048 int noPublic=0;
    \n-
    1049
    \n-
    1050 const auto end=indexSet.end();
    \n-
    1051 for(auto index=indexSet.begin(); index!=end; ++index)
    \n-
    1052 if(index->local().isPublic())
    \n-
    1053 noPublic++;
    \n-
    1054
    \n-
    1055 return noPublic;
    \n-
    1056
    \n-
    1057 }
    \n-
    1058
    \n-
    1059
    \n-
    1060 template<typename T, typename A>
    \n-
    1061 inline void RemoteIndices<T,A>::unpackCreateRemote(char* p_in, PairType** sourcePairs,
    \n-
    1062 PairType** destPairs, int remoteProc,
    \n-
    1063 int sourcePublish, int destPublish,
    \n-
    1064 int bufferSize, bool sendTwo,
    \n-
    1065 bool fromOurSelf)
    \n-
    1066 {
    \n-
    1067
    \n-
    1068 // unpack the number of indices we received
    \n-
    1069 int noRemoteSource=-1, noRemoteDest=-1;
    \n-
    1070 char twoIndexSets=0;
    \n-
    1071 int position=0;
    \n-
    1072 // Did we receive two index sets?
    \n-
    1073 MPI_Unpack(p_in, bufferSize, &position, &twoIndexSets, 1, MPI_CHAR, comm_);
    \n-
    1074 // The number of source indices received
    \n-
    1075 MPI_Unpack(p_in, bufferSize, &position, &noRemoteSource, 1, MPI_INT, comm_);
    \n-
    1076 // The number of destination indices received
    \n-
    1077 MPI_Unpack(p_in, bufferSize, &position, &noRemoteDest, 1, MPI_INT, comm_);
    \n-
    1078
    \n-
    1079
    \n-
    1080 // Indices for which we receive
    \n-
    1081 RemoteIndexList* receive= new RemoteIndexList();
    \n-
    1082 // Indices for which we send
    \n-
    1083 RemoteIndexList* send=0;
    \n-
    1084
    \n-
    1085 MPI_Datatype type= MPITraits<PairType>::getType();
    \n-
    1086
    \n-
    1087 if(!twoIndexSets) {
    \n-
    1088 if(sendTwo) {
    \n-
    1089 send = new RemoteIndexList();
    \n-
    1090 // Create both remote index sets simultaneously
    \n-
    1091 unpackIndices(*send, *receive, noRemoteSource, sourcePairs, sourcePublish,
    \n-
    1092 destPairs, destPublish, p_in, type, &position, bufferSize);
    \n-
    1093 }else{
    \n-
    1094 // we only need one list
    \n-
    1095 unpackIndices(*receive, noRemoteSource, sourcePairs, sourcePublish,
    \n-
    1096 p_in, type, &position, bufferSize, fromOurSelf);
    \n-
    1097 send=receive;
    \n-
    1098 }
    \n-
    1099 }else{
    \n-
    1100
    \n-
    1101 int oldPos=position;
    \n-
    1102 // Two index sets received
    \n-
    1103 unpackIndices(*receive, noRemoteSource, destPairs, destPublish,
    \n-
    1104 p_in, type, &position, bufferSize, fromOurSelf);
    \n-
    1105 if(!sendTwo)
    \n-
    1106 //unpack source entries again as destination entries
    \n-
    1107 position=oldPos;
    \n-
    1108
    \n-
    1109 send = new RemoteIndexList();
    \n-
    1110 unpackIndices(*send, noRemoteDest, sourcePairs, sourcePublish,
    \n-
    1111 p_in, type, &position, bufferSize, fromOurSelf);
    \n-
    1112 }
    \n-
    1113
    \n-
    1114 if(receive->empty() && send->empty()) {
    \n-
    1115 if(send==receive) {
    \n-
    1116 delete send;
    \n-
    1117 }else{
    \n-
    1118 delete send;
    \n-
    1119 delete receive;
    \n-
    1120 }
    \n-
    1121 }else{
    \n-
    1122 remoteIndices_.insert(std::make_pair(remoteProc,
    \n-
    1123 std::make_pair(send,receive)));
    \n-
    1124 }
    \n-
    1125 }
    \n-
    1126
    \n-
    1127
    \n-
    1128 template<typename T, typename A>
    \n-
    1129 template<bool ignorePublic>
    \n-
    1130 inline void RemoteIndices<T,A>::buildRemote(bool includeSelf_)
    \n-
    1131 {
    \n-
    1132 // Processor configuration
    \n-
    1133 int rank, procs;
    \n-
    1134 MPI_Comm_rank(comm_, &rank);
    \n-
    1135 MPI_Comm_size(comm_, &procs);
    \n-
    1136
    \n-
    1137 // number of local indices to publish
    \n-
    1138 // The indices of the destination will be send.
    \n-
    1139 int sourcePublish, destPublish;
    \n-
    1140
    \n-
    1141 // Do we need to send two index sets?
    \n-
    1142 char sendTwo = (source_ != target_);
    \n-
    1143
    \n-
    1144 if(procs==1 && !(sendTwo || includeSelf_))
    \n-
    1145 // Nothing to communicate
    \n-
    1146 return;
    \n-
    1147
    \n-
    1148 sourcePublish = (ignorePublic) ? source_->size() : noPublic(*source_);
    \n-
    1149
    \n-
    1150 if(sendTwo)
    \n-
    1151 destPublish = (ignorePublic) ? target_->size() : noPublic(*target_);
    \n-
    1152 else
    \n-
    1153 // we only need to send one set of indices
    \n-
    1154 destPublish = 0;
    \n-
    1155
    \n-
    1156 int maxPublish, publish=sourcePublish+destPublish;
    \n-
    1157
    \n-
    1158 // Calculate maximum number of indices send
    \n-
    1159 MPI_Allreduce(&publish, &maxPublish, 1, MPI_INT, MPI_MAX, comm_);
    \n-
    1160
    \n-
    1161 // allocate buffers
    \n-
    1162 PairType** destPairs;
    \n-
    1163 PairType** sourcePairs = new PairType*[sourcePublish>0 ? sourcePublish : 1];
    \n-
    1164
    \n-
    1165 if(sendTwo)
    \n-
    1166 destPairs = new PairType*[destPublish>0 ? destPublish : 1];
    \n-
    1167 else
    \n-
    1168 destPairs=sourcePairs;
    \n-
    1169
    \n-
    1170 char** buffer = new char*[2];
    \n-
    1171 int bufferSize;
    \n-
    1172 int position=0;
    \n-
    1173 int intSize;
    \n-
    1174 int charSize;
    \n-
    1175
    \n-
    1176 // calculate buffer size
    \n-
    1177 MPI_Datatype type = MPITraits<PairType>::getType();
    \n-
    1178
    \n-
    1179 MPI_Pack_size(maxPublish, type, comm_,
    \n-
    1180 &bufferSize);
    \n-
    1181 MPI_Pack_size(1, MPI_INT, comm_,
    \n-
    1182 &intSize);
    \n-
    1183 MPI_Pack_size(1, MPI_CHAR, comm_,
    \n-
    1184 &charSize);
    \n-
    1185 // Our message will contain the following:
    \n-
    1186 // a bool whether two index sets where sent
    \n-
    1187 // the size of the source and the dest indexset,
    \n-
    1188 // then the source and destination indices
    \n-
    1189 bufferSize += 2 * intSize + charSize;
    \n-
    1190
    \n-
    1191 if(bufferSize<=0) bufferSize=1;
    \n-
    1192
    \n-
    1193 buffer[0] = new char[bufferSize];
    \n-
    1194 buffer[1] = new char[bufferSize];
    \n-
    1195
    \n-
    1196
    \n-
    1197 // pack entries into buffer[0], p_out below!
    \n-
    1198 MPI_Pack(&sendTwo, 1, MPI_CHAR, buffer[0], bufferSize, &position,
    \n-
    1199 comm_);
    \n-
    1200
    \n-
    1201 // The number of indices we send for each index set
    \n-
    1202 MPI_Pack(&sourcePublish, 1, MPI_INT, buffer[0], bufferSize, &position,
    \n-
    1203 comm_);
    \n-
    1204 MPI_Pack(&destPublish, 1, MPI_INT, buffer[0], bufferSize, &position,
    \n-
    1205 comm_);
    \n-
    1206
    \n-
    1207 // Now pack the source indices and setup the destination pairs
    \n-
    1208 packEntries<ignorePublic>(sourcePairs, *source_, buffer[0], type,
    \n-
    1209 bufferSize, &position, sourcePublish);
    \n-
    1210 // If necessary send the dest indices and setup the source pairs
    \n-
    1211 if(sendTwo)
    \n-
    1212 packEntries<ignorePublic>(destPairs, *target_, buffer[0], type,
    \n-
    1213 bufferSize, &position, destPublish);
    \n-
    1214
    \n-
    1215
    \n-
    1216 // Update remote indices for ourself
    \n-
    1217 if(sendTwo|| includeSelf_)
    \n-
    1218 unpackCreateRemote(buffer[0], sourcePairs, destPairs, rank, sourcePublish,
    \n-
    1219 destPublish, bufferSize, sendTwo, includeSelf_);
    \n-
    1220
    \n-
    1221 neighbourIds.erase(rank);
    \n-
    1222
    \n-
    1223 if(neighbourIds.size()==0)
    \n-
    1224 {
    \n-
    1225 Dune::dvverb<<rank<<": Sending messages in a ring"<<std::endl;
    \n-
    1226 // send messages in ring
    \n-
    1227 for(int proc=1; proc<procs; proc++) {
    \n-
    1228 // pointers to the current input and output buffers
    \n-
    1229 char* p_out = buffer[1-(proc%2)];
    \n-
    1230 char* p_in = buffer[proc%2];
    \n-
    1231
    \n-
    1232 MPI_Status status;
    \n-
    1233 if(rank%2==0) {
    \n-
    1234 MPI_Ssend(p_out, bufferSize, MPI_PACKED, (rank+1)%procs,
    \n-
    1235 commTag_, comm_);
    \n-
    1236 MPI_Recv(p_in, bufferSize, MPI_PACKED, (rank+procs-1)%procs,
    \n-
    1237 commTag_, comm_, &status);
    \n-
    1238 }else{
    \n-
    1239 MPI_Recv(p_in, bufferSize, MPI_PACKED, (rank+procs-1)%procs,
    \n-
    1240 commTag_, comm_, &status);
    \n-
    1241 MPI_Ssend(p_out, bufferSize, MPI_PACKED, (rank+1)%procs,
    \n-
    1242 commTag_, comm_);
    \n-
    1243 }
    \n-
    1244
    \n-
    1245
    \n-
    1246 // The process these indices are from
    \n-
    1247 int remoteProc = (rank+procs-proc)%procs;
    \n-
    1248
    \n-
    1249 unpackCreateRemote(p_in, sourcePairs, destPairs, remoteProc, sourcePublish,
    \n-
    1250 destPublish, bufferSize, sendTwo);
    \n-
    1251
    \n-
    1252 }
    \n-
    1253
    \n-
    1254 }
    \n-
    1255 else
    \n-
    1256 {
    \n-
    1257 MPI_Request* requests=new MPI_Request[neighbourIds.size()];
    \n-
    1258 MPI_Request* req=requests;
    \n-
    1259
    \n-
    1260 typedef typename std::set<int>::size_type size_type;
    \n-
    1261 size_type noNeighbours=neighbourIds.size();
    \n-
    1262
    \n-
    1263 // setup sends
    \n-
    1264 for(std::set<int>::iterator neighbour=neighbourIds.begin();
    \n-
    1265 neighbour!= neighbourIds.end(); ++neighbour) {
    \n-
    1266 // Only send the information to the neighbouring processors
    \n-
    1267 MPI_Issend(buffer[0], position , MPI_PACKED, *neighbour, commTag_, comm_, req++);
    \n-
    1268 }
    \n-
    1269
    \n-
    1270 //Test for received messages
    \n-
    1271
    \n-
    1272 for(size_type received=0; received <noNeighbours; ++received)
    \n-
    1273 {
    \n-
    1274 MPI_Status status;
    \n-
    1275 // probe for next message
    \n-
    1276 MPI_Probe(MPI_ANY_SOURCE, commTag_, comm_, &status);
    \n-
    1277 int remoteProc=status.MPI_SOURCE;
    \n-
    1278 int size;
    \n-
    1279 MPI_Get_count(&status, MPI_PACKED, &size);
    \n-
    1280 // receive message
    \n-
    1281 MPI_Recv(buffer[1], size, MPI_PACKED, remoteProc,
    \n-
    1282 commTag_, comm_, &status);
    \n-
    1283
    \n-
    1284 unpackCreateRemote(buffer[1], sourcePairs, destPairs, remoteProc, sourcePublish,
    \n-
    1285 destPublish, bufferSize, sendTwo);
    \n-
    1286 }
    \n-
    1287 // wait for completion of pending requests
    \n-
    1288 MPI_Status* statuses = new MPI_Status[neighbourIds.size()];
    \n-
    1289
    \n-
    1290 if(int(MPI_ERR_IN_STATUS)==MPI_Waitall(neighbourIds.size(), requests, statuses)) {
    \n-
    1291 for(size_type i=0; i < neighbourIds.size(); ++i)
    \n-
    1292 if(statuses[i].MPI_ERROR!=MPI_SUCCESS) {
    \n-
    1293 std::cerr<<rank<<": MPI_Error occurred while receiving message."<<std::endl;
    \n-
    1294 MPI_Abort(comm_, 999);
    \n-
    1295 }
    \n-
    1296 }
    \n-
    1297 delete[] requests;
    \n-
    1298 delete[] statuses;
    \n-
    1299 }
    \n-
    1300
    \n-
    1301
    \n-
    1302 // delete allocated memory
    \n-
    1303 if(destPairs!=sourcePairs)
    \n-
    1304 delete[] destPairs;
    \n-
    1305
    \n-
    1306 delete[] sourcePairs;
    \n-
    1307 delete[] buffer[0];
    \n-
    1308 delete[] buffer[1];
    \n-
    1309 delete[] buffer;
    \n-
    1310 }
    \n-
    1311
    \n-
    1312 template<typename T, typename A>
    \n-
    1313 inline void RemoteIndices<T,A>::unpackIndices(RemoteIndexList& remote,
    \n-
    1314 int remoteEntries,
    \n-
    1315 PairType** local,
    \n-
    1316 int localEntries,
    \n-
    1317 char* p_in,
    \n-
    1318 MPI_Datatype type,
    \n-
    1319 int* position,
    \n-
    1320 int bufferSize,
    \n-
    1321 bool fromOurSelf)
    \n-
    1322 {
    \n-
    1323 if(remoteEntries==0)
    \n-
    1324 return;
    \n-
    1325
    \n-
    1326 PairType index;
    \n-
    1327 MPI_Unpack(p_in, bufferSize, position, &index, 1,
    \n-
    1328 type, comm_);
    \n-
    1329 GlobalIndex oldGlobal=index.global();
    \n-
    1330 int n_in=0, localIndex=0;
    \n-
    1331
    \n-
    1332 //Check if we know the global index
    \n-
    1333 while(localIndex<localEntries) {
    \n-
    1334 if(local[localIndex]->global()==index.global()) {
    \n-
    1335 int oldLocalIndex=localIndex;
    \n-
    1336
    \n-
    1337 while(localIndex<localEntries &&
    \n-
    1338 local[localIndex]->global()==index.global()) {
    \n-
    1339 if(!fromOurSelf || index.local().attribute() !=
    \n-
    1340 local[localIndex]->local().attribute())
    \n-
    1341 // if index is from us it has to have a different attribute
    \n-
    1342 remote.push_back(RemoteIndex(index.local().attribute(),
    \n-
    1343 local[localIndex]));
    \n-
    1344 localIndex++;
    \n-
    1345 }
    \n-
    1346
    \n-
    1347 // unpack next remote index
    \n-
    1348 if((++n_in) < remoteEntries) {
    \n-
    1349 MPI_Unpack(p_in, bufferSize, position, &index, 1,
    \n-
    1350 type, comm_);
    \n-
    1351 if(index.global()==oldGlobal)
    \n-
    1352 // Restart comparison for the same global indices
    \n-
    1353 localIndex=oldLocalIndex;
    \n-
    1354 else
    \n-
    1355 oldGlobal=index.global();
    \n-
    1356 }else{
    \n-
    1357 // No more received indices
    \n-
    1358 break;
    \n-
    1359 }
    \n-
    1360 continue;
    \n-
    1361 }
    \n-
    1362
    \n-
    1363 if (local[localIndex]->global()<index.global()) {
    \n-
    1364 // compare with next entry in our list
    \n-
    1365 ++localIndex;
    \n-
    1366 }else{
    \n-
    1367 // We do not know the index, unpack next
    \n-
    1368 if((++n_in) < remoteEntries) {
    \n-
    1369 MPI_Unpack(p_in, bufferSize, position, &index, 1,
    \n-
    1370 type, comm_);
    \n-
    1371 oldGlobal=index.global();
    \n-
    1372 }else
    \n-
    1373 // No more received indices
    \n-
    1374 break;
    \n-
    1375 }
    \n-
    1376 }
    \n-
    1377
    \n-
    1378 // Unpack the other received indices without doing anything
    \n-
    1379 while(++n_in < remoteEntries)
    \n-
    1380 MPI_Unpack(p_in, bufferSize, position, &index, 1,
    \n-
    1381 type, comm_);
    \n-
    1382 }
    \n-
    1383
    \n-
    1384
    \n-
    1385 template<typename T, typename A>
    \n-
    1386 inline void RemoteIndices<T,A>::unpackIndices(RemoteIndexList& send,
    \n-
    1387 RemoteIndexList& receive,
    \n-
    1388 int remoteEntries,
    \n-
    1389 PairType** localSource,
    \n-
    1390 int localSourceEntries,
    \n-
    1391 PairType** localDest,
    \n-
    1392 int localDestEntries,
    \n-
    1393 char* p_in,
    \n-
    1394 MPI_Datatype type,
    \n-
    1395 int* position,
    \n-
    1396 int bufferSize)
    \n-
    1397 {
    \n-
    1398 int n_in=0, sourceIndex=0, destIndex=0;
    \n-
    1399
    \n-
    1400 //Check if we know the global index
    \n-
    1401 while(n_in<remoteEntries && (sourceIndex<localSourceEntries || destIndex<localDestEntries)) {
    \n-
    1402 // Unpack next index
    \n-
    1403 PairType index;
    \n-
    1404 MPI_Unpack(p_in, bufferSize, position, &index, 1,
    \n-
    1405 type, comm_);
    \n-
    1406 n_in++;
    \n-
    1407
    \n-
    1408 // Advance until global index in localSource and localDest are >= than the one in the unpacked index
    \n-
    1409 while(sourceIndex<localSourceEntries && localSource[sourceIndex]->global()<index.global())
    \n-
    1410 sourceIndex++;
    \n-
    1411
    \n-
    1412 while(destIndex<localDestEntries && localDest[destIndex]->global()<index.global())
    \n-
    1413 destIndex++;
    \n-
    1414
    \n-
    1415 // Add a remote index if we found the global index.
    \n-
    1416 if(sourceIndex<localSourceEntries && localSource[sourceIndex]->global()==index.global())
    \n-
    1417 send.push_back(RemoteIndex(index.local().attribute(),
    \n-
    1418 localSource[sourceIndex]));
    \n-
    1419
    \n-
    1420 if(destIndex < localDestEntries && localDest[destIndex]->global() == index.global())
    \n-
    1421 receive.push_back(RemoteIndex(index.local().attribute(),
    \n-
    1422 localDest[sourceIndex]));
    \n-
    1423 }
    \n-
    1424
    \n-
    1425 }
    \n-
    1426
    \n-
    1427 template<typename T, typename A>
    \n-
    \n-\n-
    1429 {
    \n-
    1430 auto lend = remoteIndices_.end();
    \n-
    1431 for(auto lists=remoteIndices_.begin(); lists != lend; ++lists) {
    \n-
    1432 if(lists->second.first==lists->second.second) {
    \n-
    1433 // there is only one remote index list.
    \n-
    1434 delete lists->second.first;
    \n-
    1435 }else{
    \n-
    1436 delete lists->second.first;
    \n-
    1437 delete lists->second.second;
    \n-
    1438 }
    \n-
    1439 }
    \n-
    1440 remoteIndices_.clear();
    \n-
    1441 firstBuild=true;
    \n-
    1442 }
    \n-
    \n-
    1443
    \n-
    1444 template<typename T, typename A>
    \n-
    \n-\n-
    1446 {
    \n-
    1447 return remoteIndices_.size();
    \n-
    1448 }
    \n-
    \n-
    1449
    \n-
    1450 template<typename T, typename A>
    \n-
    1451 template<bool ignorePublic>
    \n-
    \n-\n-
    1453 {
    \n-
    1454 // Test whether a rebuild is Needed.
    \n-
    1455 if(firstBuild ||
    \n-
    1456 ignorePublic!=publicIgnored || !
    \n-
    1457 isSynced()) {
    \n-
    1458 free();
    \n-
    1459
    \n-
    1460 buildRemote<ignorePublic>(includeSelf);
    \n-
    1461
    \n-
    1462 sourceSeqNo_ = source_->seqNo();
    \n-
    1463 destSeqNo_ = target_->seqNo();
    \n-
    1464 firstBuild=false;
    \n-
    1465 publicIgnored=ignorePublic;
    \n-
    1466 }
    \n-
    1467
    \n-
    1468
    \n-
    1469 }
    \n-
    \n-
    1470
    \n-
    1471 template<typename T, typename A>
    \n-
    \n-\n-
    1473 {
    \n-
    1474 return sourceSeqNo_==source_->seqNo() && destSeqNo_ ==target_->seqNo();
    \n-
    1475 }
    \n-
    \n-
    1476
    \n-
    1477 template<typename T, typename A>
    \n-
    1478 template<bool mode, bool send>
    \n-
    \n-\n-
    1480 {
    \n-
    1481
    \n-
    1482 // The user are on their own now!
    \n-
    1483 // We assume they know what they are doing and just set the
    \n-
    1484 // remote indices to synced status.
    \n-
    1485 sourceSeqNo_ = source_->seqNo();
    \n-
    1486 destSeqNo_ = target_->seqNo();
    \n-
    1487
    \n-
    1488 typename RemoteIndexMap::iterator found = remoteIndices_.find(process);
    \n-
    1489
    \n-
    1490 if(found == remoteIndices_.end())
    \n-
    1491 {
    \n-
    1492 if(source_ != target_)
    \n-
    1493 found = remoteIndices_.insert(found, std::make_pair(process,
    \n-
    1494 std::make_pair(new RemoteIndexList(),
    \n-
    1495 new RemoteIndexList())));
    \n-
    1496 else{
    \n-
    1497 RemoteIndexList* rlist = new RemoteIndexList();
    \n-
    1498 found = remoteIndices_.insert(found,
    \n-
    1499 std::make_pair(process,
    \n-
    1500 std::make_pair(rlist, rlist)));
    \n-
    1501 }
    \n-
    1502 }
    \n-
    1503
    \n-
    1504 firstBuild = false;
    \n-
    1505
    \n-
    1506 if(send)
    \n-
    1507 return RemoteIndexListModifier<T,A,mode>(*source_, *(found->second.first));
    \n-
    1508 else
    \n-
    1509 return RemoteIndexListModifier<T,A,mode>(*target_, *(found->second.second));
    \n-
    1510 }
    \n-
    \n-
    1511
    \n-
    1512 template<typename T, typename A>
    \n-\n-
    \n-\n-
    1515 {
    \n-
    1516 return remoteIndices_.find(proc);
    \n-
    1517 }
    \n-
    \n-
    1518
    \n-
    1519 template<typename T, typename A>
    \n-\n-
    \n-\n-
    1522 {
    \n-
    1523 return remoteIndices_.begin();
    \n-
    1524 }
    \n-
    \n-
    1525
    \n-
    1526 template<typename T, typename A>
    \n-\n-
    \n-\n-
    1529 {
    \n-
    1530 return remoteIndices_.end();
    \n-
    1531 }
    \n-
    \n-
    1532
    \n-
    1533
    \n-
    1534 template<typename T, typename A>
    \n-
    \n-\n-
    1536 {
    \n-
    1537 if(neighbours()!=ri.neighbours())
    \n-
    1538 return false;
    \n-
    1539
    \n-
    1540 const auto rend = remoteIndices_.end();
    \n-
    1541
    \n-
    1542 for(auto rindex = remoteIndices_.begin(), rindex1=ri.remoteIndices_.begin(); rindex!=rend; ++rindex, ++rindex1) {
    \n-
    1543 if(rindex->first != rindex1->first)
    \n-
    1544 return false;
    \n-
    1545 if(*(rindex->second.first) != *(rindex1->second.first))
    \n-
    1546 return false;
    \n-
    1547 if(*(rindex->second.second) != *(rindex1->second.second))
    \n-
    1548 return false;
    \n-
    1549 }
    \n-
    1550 return true;
    \n-
    1551 }
    \n-
    \n-
    1552
    \n-
    1553 template<class T, class A, bool mode>
    \n-\n-
    1555 RemoteIndexList& rList)
    \n-
    1556 : rList_(&rList), indexSet_(&indexSet), iter_(rList.beginModify()), end_(rList.end()), first_(true)
    \n-
    1557 {
    \n-
    1558 if(MODIFYINDEXSET) {
    \n-
    1559 assert(indexSet_);
    \n-
    1560 for(ConstIterator iter=iter_; iter != end_; ++iter)
    \n-
    1561 glist_.push_back(iter->localIndexPair().global());
    \n-
    1562 giter_ = glist_.beginModify();
    \n-
    1563 }
    \n-
    1564 }
    \n-
    1565
    \n-
    1566 template<typename T, typename A, bool mode>
    \n-
    \n-\n-
    1568 : rList_(other.rList_), indexSet_(other.indexSet_),
    \n-
    1569 glist_(other.glist_), iter_(other.iter_), giter_(other.giter_), end_(other.end_),
    \n-
    1570 first_(other.first_), last_(other.last_)
    \n-
    1571 {}
    \n-
    \n-
    1572
    \n-
    1573 template<typename T, typename A, bool mode>
    \n-
    \n-\n-
    1575 {
    \n-
    1576 if(MODIFYINDEXSET) {
    \n-
    1577 // repair pointers to local index set.
    \n-
    1578#ifdef DUNE_ISTL_WITH_CHECKING
    \n-
    1579 if(indexSet_->state()!=GROUND)
    \n-
    1580 DUNE_THROW(InvalidIndexSetState, "Index has to be in ground mode for repairing pointers to indices");
    \n-
    1581#endif
    \n-
    1582 auto giter = glist_.begin();
    \n-
    1583 auto index = indexSet_->begin();
    \n-
    1584
    \n-
    1585 for(auto iter=rList_->begin(); iter != end_; ++iter) {
    \n-
    1586 while(index->global()<*giter) {
    \n-
    1587 ++index;
    \n-
    1588#ifdef DUNE_ISTL_WITH_CHECKING
    \n-
    1589 if(index == indexSet_->end())
    \n-
    1590 DUNE_THROW(InvalidPosition, "No such global index in set!");
    \n-
    1591#endif
    \n-
    1592 }
    \n-
    1593
    \n-
    1594#ifdef DUNE_ISTL_WITH_CHECKING
    \n-
    1595 if(index->global() != *giter)
    \n-
    1596 DUNE_THROW(InvalidPosition, "No such global index in set!");
    \n-
    1597#endif
    \n-
    1598 iter->localIndex_ = &(*index);
    \n-
    1599 }
    \n-
    1600 }
    \n-
    1601 }
    \n-
    \n-
    1602
    \n-
    1603 template<typename T, typename A, bool mode>
    \n-
    \n-\n-
    1605 {
    \n-
    1606 static_assert(!mode,"Not allowed if the mode indicates that new indices"
    \n-
    1607 "might be added to the underlying index set. Use "
    \n-
    1608 "insert(const RemoteIndex&, const GlobalIndex&) instead");
    \n-
    1609
    \n-
    1610#ifdef DUNE_ISTL_WITH_CHECKING
    \n-
    1611 if(!first_ && index.localIndexPair().global()<last_)
    \n-
    1612 DUNE_THROW(InvalidPosition, "Modification of remote indices have to occur with ascending global index.");
    \n-
    1613#endif
    \n-
    1614 // Move to the correct position
    \n-
    1615 while(iter_ != end_ && iter_->localIndexPair().global() < index.localIndexPair().global()) {
    \n-
    1616 ++iter_;
    \n-
    1617 }
    \n-
    1618
    \n-
    1619 // No duplicate entries allowed
    \n-
    1620 assert(iter_==end_ || iter_->localIndexPair().global() != index.localIndexPair().global());
    \n-
    1621 iter_.insert(index);
    \n-
    1622 last_ = index.localIndexPair().global();
    \n-
    1623 first_ = false;
    \n-
    1624 }
    \n-
    \n-
    1625
    \n-
    1626 template<typename T, typename A, bool mode>
    \n-
    \n-\n-
    1628 {
    \n-
    1629 static_assert(mode,"Not allowed if the mode indicates that no new indices"
    \n-
    1630 "might be added to the underlying index set. Use "
    \n-
    1631 "insert(const RemoteIndex&) instead");
    \n-
    1632#ifdef DUNE_ISTL_WITH_CHECKING
    \n-
    1633 if(!first_ && global<last_)
    \n-
    1634 DUNE_THROW(InvalidPosition, "Modification of remote indices have to occur with ascending global index.");
    \n-
    1635#endif
    \n-
    1636 // Move to the correct position
    \n-
    1637 while(iter_ != end_ && *giter_ < global) {
    \n-
    1638 ++giter_;
    \n-
    1639 ++iter_;
    \n-
    1640 }
    \n-
    1641
    \n-
    1642 // No duplicate entries allowed
    \n-
    1643 assert(iter_->localIndexPair().global() != global);
    \n-
    1644 iter_.insert(index);
    \n-
    1645 giter_.insert(global);
    \n-
    1646
    \n-
    1647 last_ = global;
    \n-
    1648 first_ = false;
    \n-
    1649 }
    \n-
    \n-
    1650
    \n-
    1651 template<typename T, typename A, bool mode>
    \n-
    \n-\n-
    1653 {
    \n-
    1654#ifdef DUNE_ISTL_WITH_CHECKING
    \n-
    1655 if(!first_ && global<last_)
    \n-
    1656 DUNE_THROW(InvalidPosition, "Modification of remote indices have to occur with ascending global index.");
    \n-
    1657#endif
    \n-
    1658
    \n-
    1659 bool found= false;
    \n-
    1660
    \n-
    1661 if(MODIFYINDEXSET) {
    \n-
    1662 // Move to the correct position
    \n-
    1663 while(iter_!=end_ && *giter_< global) {
    \n-
    1664 ++giter_;
    \n-
    1665 ++iter_;
    \n-
    1666 }
    \n-
    1667 if(*giter_ == global) {
    \n-
    1668 giter_.remove();
    \n-
    1669 iter_.remove();
    \n-
    1670 found=true;
    \n-
    1671 }
    \n-
    1672 }else{
    \n-
    1673 while(iter_!=end_ && iter_->localIndexPair().global() < global)
    \n-
    1674 ++iter_;
    \n-
    1675
    \n-
    1676 if(iter_->localIndexPair().global()==global) {
    \n-
    1677 iter_.remove();
    \n-
    1678 found = true;
    \n-
    1679 }
    \n-
    1680 }
    \n-
    1681
    \n-
    1682 last_ = global;
    \n-
    1683 first_ = false;
    \n-
    1684 return found;
    \n-
    1685 }
    \n-
    \n-
    1686
    \n-
    1687 template<typename T, typename A>
    \n-
    1688 template<bool send>
    \n-
    \n-\n-
    1690 {
    \n-
    1691 return CollectiveIterator<T,A>(remoteIndices_, send);
    \n-
    1692 }
    \n-
    \n-
    1693
    \n-
    1694 template<typename T, typename A>
    \n-
    \n-
    1695 inline MPI_Comm RemoteIndices<T,A>::communicator() const
    \n-
    1696 {
    \n-
    1697 return comm_;
    \n-
    1698
    \n-
    1699 }
    \n-
    \n-
    1700
    \n-
    1701 template<typename T, typename A>
    \n-
    \n-\n-
    1703 {
    \n-
    1704
    \n-
    1705 const auto end = pmap.end();
    \n-
    1706 for(auto process = pmap.begin(); process != end; ++process) {
    \n-
    1707 const RemoteIndexList* list = send ? process->second.first : process->second.second;
    \n-
    1708 using ri_iterator = typename RemoteIndexList::const_iterator;
    \n-
    1709 map_.insert(std::make_pair(process->first,
    \n-
    1710 std::pair<ri_iterator, const ri_iterator>(list->begin(), list->end())));
    \n-
    1711 }
    \n-
    1712 }
    \n-
    \n-
    1713
    \n-
    1714 template<typename T, typename A>
    \n-
    \n-
    1715 inline void CollectiveIterator<T,A>::advance(const GlobalIndex& index)
    \n-
    1716 {
    \n-
    1717 const auto end = map_.end();
    \n-
    1718
    \n-
    1719 for(auto iter = map_.begin(); iter != end;) {
    \n-
    1720 // Step the iterator until we are >= index
    \n-
    1721 typename RemoteIndexList::const_iterator current = iter->second.first;
    \n-
    1722 typename RemoteIndexList::const_iterator rend = iter->second.second;
    \n-
    1723 RemoteIndex remoteIndex;
    \n-
    1724 if(current != rend)
    \n-
    1725 remoteIndex = *current;
    \n-
    1726
    \n-
    1727 while(iter->second.first!=iter->second.second && iter->second.first->localIndexPair().global()<index)
    \n-
    1728 ++(iter->second.first);
    \n-
    1729
    \n-
    1730 // erase from the map if there are no more entries.
    \n-
    1731 if(iter->second.first == iter->second.second)
    \n-
    1732 map_.erase(iter++);
    \n-
    1733 else{
    \n-
    1734 ++iter;
    \n-
    1735 }
    \n-
    1736 }
    \n-
    1737 index_=index;
    \n-
    1738 noattribute=true;
    \n-
    1739 }
    \n-
    \n-
    1740
    \n-
    1741 template<typename T, typename A>
    \n-
    \n-
    1742 inline void CollectiveIterator<T,A>::advance(const GlobalIndex& index,
    \n-
    1743 const Attribute& attribute)
    \n-
    1744 {
    \n-
    1745 const auto end = map_.end();
    \n-
    1746
    \n-
    1747 for(auto iter = map_.begin(); iter != end;) {
    \n-
    1748 // Step the iterator until we are >= index
    \n-
    1749 typename RemoteIndexList::const_iterator current = iter->second.first;
    \n-
    1750 typename RemoteIndexList::const_iterator rend = iter->second.second;
    \n-
    1751 RemoteIndex remoteIndex;
    \n-
    1752 if(current != rend)
    \n-
    1753 remoteIndex = *current;
    \n-
    1754
    \n-
    1755 // Move to global index or bigger
    \n-
    1756 while(iter->second.first!=iter->second.second && iter->second.first->localIndexPair().global()<index)
    \n-
    1757 ++(iter->second.first);
    \n-
    1758
    \n-
    1759 // move to attribute or bigger
    \n-
    1760 while(iter->second.first!=iter->second.second
    \n-
    1761 && iter->second.first->localIndexPair().global()==index
    \n-
    1762 && iter->second.first->localIndexPair().local().attribute()<attribute)
    \n-
    1763 ++(iter->second.first);
    \n-
    1764
    \n-
    1765 // erase from the map if there are no more entries.
    \n-
    1766 if(iter->second.first == iter->second.second)
    \n-
    1767 map_.erase(iter++);
    \n-
    1768 else{
    \n-
    1769 ++iter;
    \n-
    1770 }
    \n-
    1771 }
    \n-
    1772 index_=index;
    \n-
    1773 attribute_=attribute;
    \n-
    1774 noattribute=false;
    \n-
    1775 }
    \n-
    \n-
    1776
    \n-
    1777 template<typename T, typename A>
    \n-
    \n-\n-
    1779 {
    \n-
    1780 const auto end = map_.end();
    \n-
    1781
    \n-
    1782 for(auto iter = map_.begin(); iter != end;) {
    \n-
    1783 // Step the iterator until we are >= index
    \n-
    1784 auto current = iter->second.first;
    \n-
    1785 auto rend = iter->second.second;
    \n-
    1786
    \n-
    1787 // move all iterators pointing to the current global index to next value
    \n-
    1788 if(iter->second.first->localIndexPair().global()==index_ &&
    \n-
    1789 (noattribute || iter->second.first->localIndexPair().local().attribute() == attribute_))
    \n-
    1790 ++(iter->second.first);
    \n-
    1791
    \n-
    1792 // erase from the map if there are no more entries.
    \n-
    1793 if(iter->second.first == iter->second.second)
    \n-
    1794 map_.erase(iter++);
    \n-
    1795 else{
    \n-
    1796 ++iter;
    \n-
    1797 }
    \n-
    1798 }
    \n-
    1799 return *this;
    \n-
    1800 }
    \n-
    \n-
    1801
    \n-
    1802 template<typename T, typename A>
    \n-
    \n-\n-
    1804 {
    \n-
    1805 return map_.empty();
    \n-
    1806 }
    \n-
    \n-
    1807
    \n-
    1808 template<typename T, typename A>
    \n-
    1809 inline typename CollectiveIterator<T,A>::iterator
    \n-
    \n-\n-
    1811 {
    \n-
    1812 if(noattribute)
    \n-
    1813 return iterator(map_.begin(), map_.end(), index_);
    \n-
    1814 else
    \n-
    1815 return iterator(map_.begin(), map_.end(), index_,
    \n-
    1816 attribute_);
    \n-
    1817 }
    \n-
    \n-
    1818
    \n-
    1819 template<typename T, typename A>
    \n-
    1820 inline typename CollectiveIterator<T,A>::iterator
    \n-
    \n-\n-
    1822 {
    \n-
    1823 return iterator(map_.end(), map_.end(), index_);
    \n-
    1824 }
    \n-
    \n-
    1825
    \n-
    1826 template<typename TG, typename TA>
    \n-
    \n-
    1827 inline std::ostream& operator<<(std::ostream& os, const RemoteIndex<TG,TA>& index)
    \n-
    1828 {
    \n-
    1829 os<<"[global="<<index.localIndexPair().global()<<", remote attribute="<<index.attribute()<<" local attribute="<<index.localIndexPair().local().attribute()<<"]";
    \n-
    1830 return os;
    \n-
    1831 }
    \n-
    \n-
    1832
    \n-
    1833 template<typename T, typename A>
    \n-
    \n-
    1834 inline std::ostream& operator<<(std::ostream& os, const RemoteIndices<T,A>& indices)
    \n-
    1835 {
    \n-
    1836 int rank;
    \n-
    1837 MPI_Comm_rank(indices.comm_, &rank);
    \n-
    1838 const auto rend = indices.remoteIndices_.end();
    \n-
    1839
    \n-
    1840 for(auto rindex = indices.remoteIndices_.begin(); rindex!=rend; ++rindex) {
    \n-
    1841 os<<rank<<": Process "<<rindex->first<<":";
    \n-
    1842
    \n-
    1843 if(!rindex->second.first->empty()) {
    \n-
    1844 os<<" send:";
    \n-
    1845
    \n-
    1846 const auto send= rindex->second.first->end();
    \n-
    1847
    \n-
    1848 for(auto index = rindex->second.first->begin();
    \n-
    1849 index != send; ++index)
    \n-
    1850 os<<*index<<" ";
    \n-
    1851 os<<std::endl;
    \n-
    1852 }
    \n-
    1853 if(!rindex->second.second->empty()) {
    \n-
    1854 os<<rank<<": Process "<<rindex->first<<": "<<"receive: ";
    \n-
    1855
    \n-
    1856 for(const auto& index : *(rindex->second.second))
    \n-
    1857 os << index << " ";
    \n-
    1858 }
    \n-
    1859 os<<std::endl<<std::flush;
    \n-
    1860 }
    \n-
    1861 return os;
    \n-
    1862 }
    \n-
    \n-
    1864}
    \n-
    1865
    \n-
    1866#endif // HAVE_MPI
    \n-
    1867#endif // DUNE_COMMON_PARALLEL_REMOTEINDICES_HH
    \n-
    Provides a map between global and local indices.
    \n-
    Provides classes for use as the local index in ParallelIndexSet for distributed computing.
    \n-
    Traits classes for mapping types onto MPI_Datatype.
    \n-
    Standard Dune debug streams.
    \n-
    Implements a singly linked list together with the necessary iterators.
    \n-
    A few common exception classes.
    \n-
    iterator end()
    Get an iterator pointing to the end of the list.
    Definition sllist.hh:774
    \n-
    SLListConstIterator< RemoteIndex, Allocator > const_iterator
    The constant iterator of the list.
    Definition sllist.hh:74
    \n-
    SLListModifyIterator< GlobalIndex, Allocator > ModifyIterator
    The type of the iterator capable of deletion and insertion.
    Definition sllist.hh:103
    \n-
    iterator begin()
    Get an iterator pointing to the first element in the list.
    Definition sllist.hh:762
    \n-
    std::ostream & operator<<(std::ostream &s, const bigunsignedint< k > &x)
    Definition bigunsignedint.hh:278
    \n+
    468 private:
    \n+
    469 MPI_Comm communicator;
    \n+
    470 int me;
    \n+
    471 int procs;
    \n+
    472 };
    \n+
    \n+
    473} // namespace dune
    \n+
    474
    \n+
    475#endif // HAVE_MPI
    \n+
    476
    \n+
    477#endif
    \n+\n+
    Implements an utility class that provides collective communication methods for sequential programs.
    \n+
    Interface class to translate objects to a MPI_Datatype, void* and size used for MPI calls.
    \n+
    #define ComposeMPIOp(func, op)
    Definition mpicommunication.hh:77
    \n+
    Traits classes for mapping types onto MPI_Datatype.
    \n+
    helper classes to provide unique types for standard functions
    \n+
    A few common exception classes.
    \n
    #define DUNE_THROW(E, m)
    Definition exceptions.hh:218
    \n-
    void repairLocalIndexPointers()
    Repair the pointers to the local index pairs.
    Definition remoteindices.hh:1574
    \n-
    const Attribute attribute() const
    Get the attribute of the index on the remote process.
    Definition remoteindices.hh:945
    \n-
    RemoteIndices()
    Definition remoteindices.hh:976
    \n-
    CollectiveIterator & operator++()
    Definition remoteindices.hh:1778
    \n-
    void setIndexSets(const ParallelIndexSet &source, const ParallelIndexSet &destination, const MPI_Comm &comm, const std::vector< int > &neighbours=std::vector< int >())
    Set the index sets and communicator we work with.
    Definition remoteindices.hh:983
    \n-
    void free()
    Free the index lists.
    Definition remoteindices.hh:1428
    \n-
    void insert(const RemoteIndex &index)
    Insert an index to the list.
    Definition remoteindices.hh:1604
    \n-
    iterator end()
    Definition remoteindices.hh:1821
    \n-
    void rebuild()
    Rebuilds the set of remote indices.
    Definition remoteindices.hh:1452
    \n-
    bool operator==(const RemoteIndex &ri) const
    Definition remoteindices.hh:933
    \n-
    MPI_Comm communicator() const
    Get the mpi communicator used.
    Definition remoteindices.hh:1695
    \n-
    CollectiveIteratorT iterator() const
    Get an iterator for collectively iterating over the remote indices of all remote processes.
    Definition remoteindices.hh:1689
    \n-
    void setIncludeSelf(bool includeSelf)
    Tell whether sending from indices of the processor to other indices on the same processor is enabled ...
    Definition remoteindices.hh:970
    \n-
    CollectiveIterator(const RemoteIndexMap &map_, bool send)
    Constructor.
    Definition remoteindices.hh:1702
    \n-
    iterator begin()
    Get an iterator over the indices positioned at the first index.
    \n-
    iterator end()
    Get an iterator over the indices positioned after the last index.
    \n-
    const_iterator end() const
    Get an iterator over all remote index lists.
    Definition remoteindices.hh:1528
    \n-
    bool operator==(const RemoteIndices &ri) const
    Definition remoteindices.hh:1535
    \n-
    bool empty() const
    Checks whether there are still iterators in the map.
    Definition remoteindices.hh:1803
    \n-
    RemoteIndexListModifier< T, A, mode > getModifier(int process)
    Get a modifier for a remote index list.
    Definition remoteindices.hh:1479
    \n-
    void advance(const GlobalIndex &global)
    Advances all underlying iterators.
    Definition remoteindices.hh:1715
    \n-
    const PairType & localIndexPair() const
    Get the corresponding local index pair.
    Definition remoteindices.hh:951
    \n-
    const ParallelIndexSet & sourceIndexSet() const
    Get the index set at the source.
    Definition remoteindices.hh:998
    \n-
    ~RemoteIndices()
    Destructor.
    Definition remoteindices.hh:1013
    \n-
    TL LocalIndex
    The type of the local index, e.g. ParallelLocalIndex.
    Definition indexset.hh:239
    \n-
    bool remove(const GlobalIndex &global)
    Remove a remote index.
    Definition remoteindices.hh:1652
    \n-
    const GlobalIndex & global() const
    Get the global index.
    \n-
    RemoteIndex()
    Parameterless Constructor.
    Definition remoteindices.hh:929
    \n-
    int neighbours() const
    Get the number of processors we share indices with.
    Definition remoteindices.hh:1445
    \n-
    LocalIndex & local()
    Get the local index.
    \n-
    TG GlobalIndex
    the type of the global index. This type has to provide at least a operator< for sorting.
    Definition indexset.hh:226
    \n-
    const ParallelIndexSet & destinationIndexSet() const
    Get the index set at destination.
    Definition remoteindices.hh:1006
    \n-
    const_iterator find(int proc) const
    Find an iterator over the remote index lists of a specific process.
    Definition remoteindices.hh:1514
    \n-
    bool isSynced() const
    Checks whether the remote indices are synced with the indexsets.
    Definition remoteindices.hh:1472
    \n-
    bool operator!=(const RemoteIndex &ri) const
    Definition remoteindices.hh:939
    \n-
    const_iterator begin() const
    Get an iterator over all remote index lists.
    Definition remoteindices.hh:1521
    \n-
    iterator begin()
    Definition remoteindices.hh:1810
    \n-
    @ GROUND
    The default mode. Indicates that the index set is ready to be used.
    Definition indexset.hh:186
    \n-
    DVVerbType dvverb(std::cout)
    stream for very verbose output.
    Definition stdstreams.hh:96
    \n-
    STL namespace.
    \n
    Dune namespace.
    Definition alignedallocator.hh:13
    \n-
    constexpr std::integral_constant< std::size_t, sizeof...(II)> size(std::integer_sequence< T, II... >)
    Return the size of the sequence.
    Definition integersequence.hh:75
    \n+
    auto getMPIData(T &t)
    Definition mpidata.hh:44
    \n
    A traits class describing the mapping of types onto MPI_Datatypes.
    Definition mpitraits.hh:41
    \n-
    static MPI_Datatype getType()
    Definition mpitraits.hh:48
    \n-
    Default exception class for range errors.
    Definition exceptions.hh:254
    \n-
    A pair consisting of a global and local index.
    Definition indexset.hh:85
    \n-
    Exception indicating that the index set is not in the expected state.
    Definition indexset.hh:205
    \n-
    Manager class for the mapping between local indices and globally unique indices.
    Definition indexset.hh:218
    \n-
    Class for recomputing missing indices of a distributed index set.
    Definition indicessyncer.hh:45
    \n-
    Base class of all classes representing a communication interface.
    Definition parallel/interface.hh:44
    \n-
    An index present on the local process with an additional attribute flag.
    Definition plocalindex.hh:52
    \n-
    The indices present on remote processes.
    Definition remoteindices.hh:190
    \n-
    const std::set< int > & getNeighbours() const
    Definition remoteindices.hh:308
    \n-
    Dune::RemoteIndex< GlobalIndex, Attribute > RemoteIndex
    Type of the remote indices we manage.
    Definition remoteindices.hh:232
    \n-
    friend void fillIndexSetHoles(const G &graph, Dune::OwnerOverlapCopyCommunication< T1, T2 > &oocomm)
    \n-
    friend void repairLocalIndexPointers(std::map< int, SLList< std::pair< typename T1::GlobalIndex, typename T1::LocalIndex::Attribute >, A2 > > &, RemoteIndices< T1, A1 > &, const T1 &)
    \n-
    ParallelIndexSet::GlobalIndex GlobalIndex
    The type of the global index.
    Definition remoteindices.hh:216
    \n-
    T ParallelIndexSet
    Type of the index set we use, e.g. ParallelLocalIndexSet.
    Definition remoteindices.hh:207
    \n-
    LocalIndex::Attribute Attribute
    The type of the attribute.
    Definition remoteindices.hh:227
    \n-
    std::map< int, std::pair< RemoteIndexList *, RemoteIndexList * > > RemoteIndexMap
    The type of the map from rank to remote index list.
    Definition remoteindices.hh:246
    \n-
    void setNeighbours(const C &neighbours)
    Definition remoteindices.hh:301
    \n-
    Dune::SLList< RemoteIndex, Allocator > RemoteIndexList
    The type of the remote index list.
    Definition remoteindices.hh:242
    \n-
    CollectiveIterator< T, A > CollectiveIteratorT
    The type of the collective iterator over all remote indices.
    Definition remoteindices.hh:211
    \n-
    typename std::allocator_traits< A >::template rebind_alloc< RemoteIndex > Allocator
    The type of the allocator for the remote index list.
    Definition remoteindices.hh:238
    \n-
    ParallelIndexSet::LocalIndex LocalIndex
    The type of the local index.
    Definition remoteindices.hh:222
    \n-
    RemoteIndexMap::const_iterator const_iterator
    Definition remoteindices.hh:248
    \n-
    Information about an index residing on another processor.
    Definition remoteindices.hh:74
    \n-
    friend void repairLocalIndexPointers(std::map< int, SLList< std::pair< typename T::GlobalIndex, typename T::LocalIndex::Attribute >, A > > &, RemoteIndices< T, A1 > &, const T &)
    \n-
    T1 GlobalIndex
    the type of the global index. This type has to provide at least a operator< for sorting.
    Definition remoteindices.hh:91
    \n-
    T2 Attribute
    The type of the attributes. Normally this will be an enumeration like.
    Definition remoteindices.hh:100
    \n-
    IndexPair< GlobalIndex, ParallelLocalIndex< Attribute > > PairType
    The type of the index pair.
    Definition remoteindices.hh:106
    \n-
    Modifier for adding and/or deleting remote indices from the remote index list.
    Definition remoteindices.hh:550
    \n-
    Dune::SLList< RemoteIndex, Allocator > RemoteIndexList
    The type of the remote index list.
    Definition remoteindices.hh:601
    \n-
    A Allocator
    The type of the allocator for the remote index list.
    Definition remoteindices.hh:597
    \n-
    ParallelIndexSet::GlobalIndex GlobalIndex
    The type of the global index.
    Definition remoteindices.hh:577
    \n-
    ParallelIndexSet::LocalIndex LocalIndex
    The type of the local index.
    Definition remoteindices.hh:582
    \n-
    RemoteIndexList::const_iterator ConstIterator
    The type of the remote index list iterator.
    Definition remoteindices.hh:611
    \n-
    SLListModifyIterator< RemoteIndex, Allocator > ModifyIterator
    The type of the modifying iterator of the remote index list.
    Definition remoteindices.hh:606
    \n-
    T ParallelIndexSet
    Type of the index set we use.
    Definition remoteindices.hh:572
    \n-
    RemoteIndexListModifier()
    Default constructor.
    Definition remoteindices.hh:675
    \n-
    LocalIndex::Attribute Attribute
    The type of the attribute.
    Definition remoteindices.hh:587
    \n-
    Dune::RemoteIndex< GlobalIndex, Attribute > RemoteIndex
    Type of the remote indices we manage.
    Definition remoteindices.hh:592
    \n-
    static constexpr bool MODIFYINDEXSET
    If true the index set corresponding to the remote indices might get modified.
    Definition remoteindices.hh:567
    \n-
    A collective iterator for moving over the remote indices for all processes collectively.
    Definition remoteindices.hh:707
    \n-
    std::map< int, std::pair< RemoteIndexList *, RemoteIndexList * > > RemoteIndexMap
    The type of the map from rank to remote index list.
    Definition remoteindices.hh:747
    \n-
    Definition remoteindices.hh:168
    \n-
    Definition remoteindices.hh:557
    \n-
    Iterator over the valid underlying iterators.
    Definition remoteindices.hh:791
    \n-
    iterator(const RealIterator &iter, const ConstRealIterator &end, GlobalIndex &index)
    Definition remoteindices.hh:798
    \n-
    iterator(const iterator &other)
    Definition remoteindices.hh:816
    \n-
    const RemoteIndex & operator*() const
    Definition remoteindices.hh:837
    \n-
    Map::iterator ConstRealIterator
    Definition remoteindices.hh:794
    \n-
    iterator & operator++()
    Definition remoteindices.hh:821
    \n-
    const RemoteIndex * operator->() const
    Definition remoteindices.hh:849
    \n-
    bool operator==(const iterator &other) const
    Definition remoteindices.hh:855
    \n-
    int process() const
    Definition remoteindices.hh:843
    \n-
    iterator(const RealIterator &iter, const ConstRealIterator &end, GlobalIndex index, Attribute attribute)
    Definition remoteindices.hh:806
    \n-
    bool operator!=(const iterator &other) const
    Definition remoteindices.hh:861
    \n-
    Map::iterator RealIterator
    Definition remoteindices.hh:793
    \n-
    A constant iterator for the SLList.
    Definition sllist.hh:371
    \n-
    A mutable iterator for the SLList.
    Definition sllist.hh:429
    \n-
    A single linked list.
    Definition sllist.hh:44
    \n+
    Definition binaryfunctions.hh:18
    \n+
    Definition binaryfunctions.hh:34
    \n+
    Default exception if an error in the parallel communication of the program occurred.
    Definition exceptions.hh:287
    \n+
    Collective communication interface and sequential default implementation.
    Definition communication.hh:100
    \n+
    int size() const
    Number of processes in set, is greater than 0.
    Definition communication.hh:126
    \n+
    Definition mpicommunication.hh:41
    \n+
    static MPI_Op get()
    Definition mpicommunication.hh:44
    \n+
    int max(T *inout, int len) const
    Compute the maximum of the argument over all processes and return the result in every process....
    Definition mpicommunication.hh:266
    \n+
    int allgatherv(const T *in, int sendDataLen, T *out, int *recvDataLen, int *displ) const
    Gathers data of variable length from all tasks and distribute it to all.
    Definition mpicommunication.hh:405
    \n+
    T max(const T &in) const
    Compute the maximum of the argument over all processes and return the result in every process....
    Definition mpicommunication.hh:257
    \n+
    MPIFuture< T > ibroadcast(T &&data, int root) const
    Distribute an array from the process with rank root to all other processes nonblocking.
    Definition mpicommunication.hh:295
    \n+
    MPIFuture< void > ibarrier() const
    Nonblocking barrier.
    Definition mpicommunication.hh:278
    \n+
    T recv(T &&data, int source_rank, int tag, MPI_Status *status=MPI_STATUS_IGNORE) const
    Receives the data from the source_rank.
    Definition mpicommunication.hh:166
    \n+
    int barrier() const
    Wait until all processes have arrived at this point in the program.
    Definition mpicommunication.hh:272
    \n+
    int rank() const
    Return rank, is between 0 and size()-1.
    Definition mpicommunication.hh:133
    \n+
    int scatterv(const T *sendData, int *sendDataLen, int *displ, T *recvData, int recvDataLen, int root) const
    Scatter arrays of variable length from a root to all other tasks.
    Definition mpicommunication.hh:366
    \n+
    MPIFuture< T > isend(T &&data, int dest_rank, int tag) const
    Sends the data to the dest_rank nonblocking.
    Definition mpicommunication.hh:155
    \n+
    MPIFuture< TOUT, TIN > iallgather(TIN &&data_in, TOUT &&data_out) const
    Gathers data from all tasks and distribute it to all nonblocking.
    Definition mpicommunication.hh:390
    \n+
    Type allreduce(Type &&in) const
    Definition mpicommunication.hh:424
    \n+
    int sum(T *inout, int len) const
    Compute the sum of the argument over all processes and return the result in every process....
    Definition mpicommunication.hh:217
    \n+
    int broadcast(T *inout, int len, int root) const
    Distribute an array from the process with rank root to all other processes.
    Definition mpicommunication.hh:288
    \n+
    MPIFuture< T > iallreduce(T &&data) const
    Compute something over all processes nonblocking.
    Definition mpicommunication.hh:450
    \n+
    T sum(const T &in) const
    Compute the sum of the argument over all processes and return the result in every process....
    Definition mpicommunication.hh:208
    \n+
    int allreduce(const Type *in, Type *out, int len) const
    Definition mpicommunication.hh:462
    \n+
    MPIFuture< TOUT, TIN > iallreduce(TIN &&data_in, TOUT &&data_out) const
    Compute something over all processes nonblocking.
    Definition mpicommunication.hh:435
    \n+
    int size() const
    Number of processes in set, is greater than 0.
    Definition mpicommunication.hh:139
    \n+
    int gather(const T *in, T *out, int len, int root) const
    Gather arrays on root task.
    Definition mpicommunication.hh:310
    \n+
    int allreduce(Type *inout, int len) const
    Compute something over all processes for each component of an array and return the result in every pr...
    Definition mpicommunication.hh:414
    \n+
    T rrecv(T &&data, int source_rank, int tag, MPI_Status *status=MPI_STATUS_IGNORE) const
    Definition mpicommunication.hh:189
    \n+
    int scatter(const T *sendData, T *recvData, int len, int root) const
    Scatter array from a root to all other task.
    Definition mpicommunication.hh:343
    \n+
    MPIFuture< T > irecv(T &&data, int source_rank, int tag) const
    Receives the data from the source_rank nonblocking.
    Definition mpicommunication.hh:177
    \n+
    int prod(T *inout, int len) const
    Compute the product of the argument over all processes and return the result in every process....
    Definition mpicommunication.hh:233
    \n+
    MPIFuture< TOUT, TIN > igather(TIN &&data_in, TOUT &&data_out, int root) const
    Gather arrays on root task nonblocking.
    Definition mpicommunication.hh:319
    \n+
    T min(const T &in) const
    Compute the minimum of the argument over all processes and return the result in every process....
    Definition mpicommunication.hh:240
    \n+
    Communication(const MPI_Comm &c=MPI_COMM_WORLD)
    Instantiation using a MPI communicator.
    Definition mpicommunication.hh:111
    \n+
    MPIFuture< TOUT, TIN > iscatter(TIN &&data_in, TOUT &&data_out, int root) const
    Scatter array from a root to all other task nonblocking.
    Definition mpicommunication.hh:352
    \n+
    int gatherv(const T *in, int sendDataLen, T *out, int *recvDataLen, int *displ, int root) const
    Gather arrays of variable size on root task.
    Definition mpicommunication.hh:333
    \n+
    int min(T *inout, int len) const
    Compute the minimum of the argument over all processes and return the result in every process....
    Definition mpicommunication.hh:249
    \n+
    int allgather(const T *sbuf, int count, T1 *rbuf) const
    Gathers data from all tasks and distribute it to all.
    Definition mpicommunication.hh:381
    \n+
    int send(const T &data, int dest_rank, int tag) const
    Sends the data to the dest_rank.
    Definition mpicommunication.hh:146
    \n+
    Communication(const Communication< No_Comm > &)
    Converting constructor for no-communication that is interpreted as MPI_COMM_SELF.
    Definition mpicommunication.hh:128
    \n+
    T prod(const T &in) const
    Compute the product of the argument over all processes and return the result in every process....
    Definition mpicommunication.hh:224
    \n+
    Provides a future-like object for MPI communication. It contains the object that will be received and...
    Definition mpifuture.hh:93
    \n+
    auto get_send_mpidata()
    Definition mpifuture.hh:177
    \n+
    auto get_mpidata()
    Definition mpifuture.hh:173
    \n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,1930 +1,676 @@\n dune-common\u00a02.10\n Loading...\n Searching...\n No Matches\n * _\bd_\bu_\bn_\be\n * _\bc_\bo_\bm_\bm_\bo_\bn\n * _\bp_\ba_\br_\ba_\bl_\bl_\be_\bl\n-remoteindices.hh\n+mpicommunication.hh\n _\bG_\bo_\b _\bt_\bo_\b _\bt_\bh_\be_\b _\bd_\bo_\bc_\bu_\bm_\be_\bn_\bt_\ba_\bt_\bi_\bo_\bn_\b _\bo_\bf_\b _\bt_\bh_\bi_\bs_\b _\bf_\bi_\bl_\be_\b.\n 1// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-\n 2// vi: set et ts=4 sw=2 sts=2:\n 3// SPDX-FileCopyrightInfo: Copyright \u00c2\u00a9 DUNE Project contributors, see file\n LICENSE.md in module root\n 4// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception\n-5#ifndef DUNE_COMMON_PARALLEL_REMOTEINDICES_HH\n-6#define DUNE_COMMON_PARALLEL_REMOTEINDICES_HH\n+5#ifndef DUNE_COMMON_PARALLEL_MPICOMMUNICATION_HH\n+6#define DUNE_COMMON_PARALLEL_MPICOMMUNICATION_HH\n 7\n-8#if HAVE_MPI\n-9\n-10#include \n-11#include \n-12#include \n-13#include \n-14#include \n-15#include \n-16#include \n-17#include \n-18#include \n-19\n-20#include \n+16#if HAVE_MPI\n+17\n+18#include \n+19#include \n+20#include \n 21\n-22#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\be_\bx_\bc_\be_\bp_\bt_\bi_\bo_\bn_\bs_\b._\bh_\bh>\n-23#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bs_\bl_\bl_\bi_\bs_\bt_\b._\bh_\bh>\n-24#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bs_\bt_\bd_\bs_\bt_\br_\be_\ba_\bm_\bs_\b._\bh_\bh>\n-25#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bp_\ba_\br_\ba_\bl_\bl_\be_\bl_\b/_\bi_\bn_\bd_\be_\bx_\bs_\be_\bt_\b._\bh_\bh>\n-26#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bp_\ba_\br_\ba_\bl_\bl_\be_\bl_\b/_\bm_\bp_\bi_\bt_\br_\ba_\bi_\bt_\bs_\b._\bh_\bh>\n-27#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bp_\ba_\br_\ba_\bl_\bl_\be_\bl_\b/_\bp_\bl_\bo_\bc_\ba_\bl_\bi_\bn_\bd_\be_\bx_\b._\bh_\bh>\n-28\n-29namespace _\bD_\bu_\bn_\be {\n-41 template\n-_\b4_\b2 class _\bM_\bP_\bI_\bT_\br_\ba_\bi_\bt_\bs<_\bI_\bn_\bd_\be_\bx_\bP_\ba_\bi_\br > >\n-43 {\n-44 public:\n-45 inline static MPI_Datatype _\bg_\be_\bt_\bT_\by_\bp_\be();\n-46 private:\n-47 static MPI_Datatype type;\n-48 };\n-49\n-50\n-51 template\n-52 class _\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\bi_\bc_\be_\bs;\n-53\n-54 template\n-55 class _\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\be_\bx;\n-56\n-57 // forward declaration needed for friend declaration.\n-58 template\n-59 class _\bI_\bn_\bd_\bi_\bc_\be_\bs_\bS_\by_\bn_\bc_\be_\br;\n-60\n-61 template\n-_\b6_\b2 std::ostream& _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b<_\b<(std::ostream& os, const _\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\be_\bx_\b<_\bT_\b1_\b,_\bT_\b2_\b>& index);\n-63\n-64\n-65 template\n-66 class _\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\be_\bx_\bL_\bi_\bs_\bt_\bM_\bo_\bd_\bi_\bf_\bi_\be_\br;\n-67\n-68\n-72 template\n-_\b7_\b3 class _\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\be_\bx\n-74 {\n-75 template\n-_\b7_\b6 friend class _\bI_\bn_\bd_\bi_\bc_\be_\bs_\bS_\by_\bn_\bc_\be_\br;\n-77\n-78 template\n-_\b7_\b9 friend void _\br_\be_\bp_\ba_\bi_\br_\bL_\bo_\bc_\ba_\bl_\bI_\bn_\bd_\be_\bx_\bP_\bo_\bi_\bn_\bt_\be_\br_\bs(std::map,A> >&,\n-80 _\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\bi_\bc_\be_\bs_\b<_\bT_\b,_\bA_\b1_\b>&,\n-81 const T&);\n-82\n-83 template\n-_\b8_\b4 friend class _\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\be_\bx_\bL_\bi_\bs_\bt_\bM_\bo_\bd_\bi_\bf_\bi_\be_\br;\n-85\n-86 public:\n-_\b9_\b1 typedef T1 _\bG_\bl_\bo_\bb_\ba_\bl_\bI_\bn_\bd_\be_\bx;\n-_\b1_\b0_\b0 typedef T2 _\bA_\bt_\bt_\br_\bi_\bb_\bu_\bt_\be;\n-101\n-105 typedef _\bI_\bn_\bd_\be_\bx_\bP_\ba_\bi_\br_\b<_\bG_\bl_\bo_\bb_\ba_\bl_\bI_\bn_\bd_\be_\bx_\b,_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bL_\bo_\bc_\ba_\bl_\bI_\bn_\bd_\be_\bx_\b<_\bA_\bt_\bt_\br_\bi_\bb_\bu_\bt_\be_\b> >\n-_\b1_\b0_\b6 _\bP_\ba_\bi_\br_\bT_\by_\bp_\be;\n-107\n-112 const _\bA_\bt_\bt_\br_\bi_\bb_\bu_\bt_\be _\ba_\bt_\bt_\br_\bi_\bb_\bu_\bt_\be() const;\n-113\n-119 const _\bP_\ba_\bi_\br_\bT_\by_\bp_\be& _\bl_\bo_\bc_\ba_\bl_\bI_\bn_\bd_\be_\bx_\bP_\ba_\bi_\br() const;\n-120\n-124 _\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\be_\bx();\n-125\n+22#include \n+23\n+24#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bb_\bi_\bn_\ba_\br_\by_\bf_\bu_\bn_\bc_\bt_\bi_\bo_\bn_\bs_\b._\bh_\bh>\n+25#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\be_\bx_\bc_\be_\bp_\bt_\bi_\bo_\bn_\bs_\b._\bh_\bh>\n+26#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bp_\ba_\br_\ba_\bl_\bl_\be_\bl_\b/_\bc_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b._\bh_\bh>\n+27#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bp_\ba_\br_\ba_\bl_\bl_\be_\bl_\b/_\bm_\bp_\bi_\bt_\br_\ba_\bi_\bt_\bs_\b._\bh_\bh>\n+28#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bp_\ba_\br_\ba_\bl_\bl_\be_\bl_\b/_\bm_\bp_\bi_\bf_\bu_\bt_\bu_\br_\be_\b._\bh_\bh>\n+29#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bp_\ba_\br_\ba_\bl_\bl_\be_\bl_\b/_\bm_\bp_\bi_\bd_\ba_\bt_\ba_\b._\bh_\bh>\n+30\n+31namespace _\bD_\bu_\bn_\be\n+32{\n+33\n+34 //=======================================================\n+35 // use singleton pattern and template specialization to\n+36 // generate MPI operations\n+37 //=======================================================\n+38\n+39 template\n+_\b4_\b0 class _\bG_\be_\bn_\be_\br_\bi_\bc_\b__\bM_\bP_\bI_\b__\bO_\bp\n+41 {\n+42\n+43 public:\n+_\b4_\b4 static MPI_Op _\bg_\be_\bt ()\n+45 {\n+46 if (!op)\n+47 {\n+48 op = std::make_unique();\n+49 // The following line leaks an MPI operation object, because the\n+corresponding\n+50 //`MPI_Op_free` is never called. It is never called because there is no easy\n+51 // way to call it at the right moment: right before the call to\n+MPI_Finalize.\n+52 // See https://gitlab.dune-project.org/core/dune-istl/issues/80\n+53 MPI_Op_create((void (*)(void*, void*, int*,\n+MPI_Datatype*))&operation,true,op.get());\n+54 }\n+55 return *op;\n+56 }\n+57 private:\n+58 static void operation (Type *in, Type *inout, int *len, MPI_Datatype*)\n+59 {\n+60 BinaryFunction func;\n+61\n+62 for (int i=0; i< *len; ++i, ++in, ++inout) {\n+63 Type temp;\n+64 temp = func(*in, *inout);\n+65 *inout = temp;\n+66 }\n+67 }\n+68 Generic_MPI_Op () {}\n+69 Generic_MPI_Op (const Generic_MPI_Op& ) {}\n+70 static std::unique_ptr op;\n+71 };\n+72\n+73\n+74 template\n+75 std::unique_ptr Generic_MPI_Op::op;\n+76\n+_\b7_\b7#define ComposeMPIOp(func,op) \\\n+78 template \\\n+79 class Generic_MPI_Op, std::enable_if_t::\n+is_intrinsic> >{ \\\n+80 public: \\\n+81 static MPI_Op get(){ \\\n+82 return op; \\\n+83 } \\\n+84 private: \\\n+85 Generic_MPI_Op () {} \\\n+86 Generic_MPI_Op (const Generic_MPI_Op & ) {} \\\n+87 }\n+88\n+89\n+_\b9_\b0 _\bC_\bo_\bm_\bp_\bo_\bs_\be_\bM_\bP_\bI_\bO_\bp(std::plus, MPI_SUM);\n+_\b9_\b1 _\bC_\bo_\bm_\bp_\bo_\bs_\be_\bM_\bP_\bI_\bO_\bp(std::multiplies, MPI_PROD);\n+_\b9_\b2 _\bC_\bo_\bm_\bp_\bo_\bs_\be_\bM_\bP_\bI_\bO_\bp(_\bM_\bi_\bn, MPI_MIN);\n+_\b9_\b3 _\bC_\bo_\bm_\bp_\bo_\bs_\be_\bM_\bP_\bI_\bO_\bp(_\bM_\ba_\bx, MPI_MAX);\n+94\n+95#undef ComposeMPIOp\n+96\n+97\n+98 //=======================================================\n+99 // use singleton pattern and template specialization to\n+100 // generate MPI operations\n+101 //=======================================================\n+102\n+106 template<>\n+_\b1_\b0_\b7 class _\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn\n+108 {\n+109 public:\n+_\b1_\b1_\b1 _\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn (const MPI_Comm& c = MPI_COMM_WORLD)\n+112 : communicator(c)\n+113 {\n+114 if(communicator!=MPI_COMM_NULL) {\n+115 int initialized = 0;\n+116 MPI_Initialized(&initialized);\n+117 if (!initialized)\n+118 _\bD_\bU_\bN_\bE_\b__\bT_\bH_\bR_\bO_\bW(_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bE_\br_\br_\bo_\br,\"You must call MPIHelper::instance(argc,argv) in\n+your main() function before using the MPI Communication!\");\n+119 MPI_Comm_rank(communicator,&me);\n+120 MPI_Comm_size(communicator,&procs);\n+121 }else{\n+122 procs=0;\n+123 me=-1;\n+124 }\n+125 }\n 126\n-132 _\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\be_\bx(const T2& _\ba_\bt_\bt_\br_\bi_\bb_\bu_\bt_\be,\n-133 const _\bP_\ba_\bi_\br_\bT_\by_\bp_\be* local);\n-134\n-135\n-141 _\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\be_\bx(const T2& _\ba_\bt_\bt_\br_\bi_\bb_\bu_\bt_\be);\n-142\n-143 bool _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b=_\b=(const _\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\be_\bx& ri) const;\n-144\n-145 bool _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b!_\b=(const _\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\be_\bx& ri) const;\n-146 private:\n-148 const _\bP_\ba_\bi_\br_\bT_\by_\bp_\be* localIndex_;\n-149\n-151 char attribute_;\n-152 };\n-153\n-154 template\n-155 std::ostream& _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b<_\b<(std::ostream& os, const _\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\bi_\bc_\be_\bs_\b<_\bT_\b,_\bA_\b>&\n-indices);\n-156\n-157 class _\bI_\bn_\bt_\be_\br_\bf_\ba_\bc_\be_\bB_\bu_\bi_\bl_\bd_\be_\br;\n-158\n-159 template\n-160 class _\bC_\bo_\bl_\bl_\be_\bc_\bt_\bi_\bv_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br;\n-161\n-162 // forward declaration needed for friend declaration.\n-163 template\n-164 class _\bI_\bn_\bd_\bi_\bc_\be_\bs_\bS_\by_\bn_\bc_\be_\br;\n-165\n-166 // forward declaration needed for friend declaration.\n-167 template\n-_\b1_\b6_\b8 class _\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn;\n-169\n-170\n-187 template > >\n-_\b1_\b8_\b9 class _\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\bi_\bc_\be_\bs\n+_\b1_\b2_\b8 _\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn (const _\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b<_\bN_\bo_\b__\bC_\bo_\bm_\bm_\b>&)\n+129 : _\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn(MPI_COMM_SELF)\n+130 {}\n+131\n+_\b1_\b3_\b3 int _\br_\ba_\bn_\bk () const\n+134 {\n+135 return me;\n+136 }\n+137\n+_\b1_\b3_\b9 int _\bs_\bi_\bz_\be () const\n+140 {\n+141 return procs;\n+142 }\n+143\n+145 template\n+_\b1_\b4_\b6 int _\bs_\be_\bn_\bd(const T& data, int dest_rank, int tag) const\n+147 {\n+148 auto mpi_data = _\bg_\be_\bt_\bM_\bP_\bI_\bD_\ba_\bt_\ba(data);\n+149 return MPI_Send(mpi_data.ptr(), mpi_data.size(), mpi_data.type(),\n+150 dest_rank, tag, communicator);\n+151 }\n+152\n+154 template\n+_\b1_\b5_\b5 _\bM_\bP_\bI_\bF_\bu_\bt_\bu_\br_\be_\b<_\bT_\b> _\bi_\bs_\be_\bn_\bd(T&& data, int dest_rank, int tag) const\n+156 {\n+157 _\bM_\bP_\bI_\bF_\bu_\bt_\bu_\br_\be_\b<_\bT_\b> future(std::forward(data));\n+158 auto mpidata = future._\bg_\be_\bt_\b__\bm_\bp_\bi_\bd_\ba_\bt_\ba();\n+159 MPI_Isend(mpidata.ptr(), mpidata.size(), mpidata.type(),\n+160 dest_rank, tag, communicator, &future.req_);\n+161 return future;\n+162 }\n+163\n+165 template\n+_\b1_\b6_\b6 T _\br_\be_\bc_\bv(T&& data, int source_rank, int tag, MPI_Status* status =\n+MPI_STATUS_IGNORE) const\n+167 {\n+168 T lvalue_data(std::forward(data));\n+169 auto mpi_data = _\bg_\be_\bt_\bM_\bP_\bI_\bD_\ba_\bt_\ba(lvalue_data);\n+170 MPI_Recv(mpi_data.ptr(), mpi_data.size(), mpi_data.type(),\n+171 source_rank, tag, communicator, status);\n+172 return lvalue_data;\n+173 }\n+174\n+176 template\n+_\b1_\b7_\b7 _\bM_\bP_\bI_\bF_\bu_\bt_\bu_\br_\be_\b<_\bT_\b> _\bi_\br_\be_\bc_\bv(T&& data, int source_rank, int tag) const\n+178 {\n+179 _\bM_\bP_\bI_\bF_\bu_\bt_\bu_\br_\be_\b<_\bT_\b> future(std::forward(data));\n+180 auto mpidata = future._\bg_\be_\bt_\b__\bm_\bp_\bi_\bd_\ba_\bt_\ba();\n+181 if (mpidata.size() == 0)\n+182 _\bD_\bU_\bN_\bE_\b__\bT_\bH_\bR_\bO_\bW(_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bE_\br_\br_\bo_\br, \"Size if irecv data object is zero. Reserve\n+sufficient size for the whole message\");\n+183 MPI_Irecv(mpidata.ptr(), mpidata.size(), mpidata.type(),\n+184 source_rank, tag, communicator, &future.req_);\n+185 return future;\n+186 }\n+187\n+188 template\n+_\b1_\b8_\b9 T _\br_\br_\be_\bc_\bv(T&& data, int source_rank, int tag, MPI_Status* status =\n+MPI_STATUS_IGNORE) const\n 190 {\n-_\b1_\b9_\b1 friend class _\bI_\bn_\bt_\be_\br_\bf_\ba_\bc_\be_\bB_\bu_\bi_\bl_\bd_\be_\br;\n-192 friend class _\bI_\bn_\bd_\bi_\bc_\be_\bs_\bS_\by_\bn_\bc_\be_\br;\n-193 template\n-_\b1_\b9_\b4 friend void _\br_\be_\bp_\ba_\bi_\br_\bL_\bo_\bc_\ba_\bl_\bI_\bn_\bd_\be_\bx_\bP_\bo_\bi_\bn_\bt_\be_\br_\bs(std::map,A2> >&,\n-195 _\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\bi_\bc_\be_\bs_\b<_\bT_\b1_\b,_\bA_\b1_\b>&,\n-196 const T1&);\n-197\n-198 template\n-_\b1_\b9_\b9 friend void _\bf_\bi_\bl_\bl_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt_\bH_\bo_\bl_\be_\bs(const G& graph, _\bD_\bu_\bn_\be_\b:_\b:\n-_\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b<_\bT_\b1_\b,_\bT_\b2_\b>& oocomm);\n-_\b2_\b0_\b0 friend std::ostream& operator<<<>(std::ostream&, const _\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\bi_\bc_\be_\bs_\b<_\bT_\b>&);\n-201\n-202 public:\n-203\n-_\b2_\b0_\b7 typedef T _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt;\n-208\n-_\b2_\b1_\b1 typedef _\bC_\bo_\bl_\bl_\be_\bc_\bt_\bi_\bv_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b<_\bT_\b,_\bA_\b> _\bC_\bo_\bl_\bl_\be_\bc_\bt_\bi_\bv_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bT;\n-212\n-_\b2_\b1_\b6 typedef typename _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt_\b:_\b:_\bG_\bl_\bo_\bb_\ba_\bl_\bI_\bn_\bd_\be_\bx _\bG_\bl_\bo_\bb_\ba_\bl_\bI_\bn_\bd_\be_\bx;\n-217\n-218\n-_\b2_\b2_\b2 typedef typename _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt_\b:_\b:_\bL_\bo_\bc_\ba_\bl_\bI_\bn_\bd_\be_\bx _\bL_\bo_\bc_\ba_\bl_\bI_\bn_\bd_\be_\bx;\n-223\n-_\b2_\b2_\b7 typedef typename LocalIndex::Attribute _\bA_\bt_\bt_\br_\bi_\bb_\bu_\bt_\be;\n-228\n-_\b2_\b3_\b2 typedef _\bD_\bu_\bn_\be_\b:_\b:_\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\be_\bx_\b<_\bG_\bl_\bo_\bb_\ba_\bl_\bI_\bn_\bd_\be_\bx_\b,_\bA_\bt_\bt_\br_\bi_\bb_\bu_\bt_\be_\b> _\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\be_\bx;\n-233\n-234\n-_\b2_\b3_\b8 using _\bA_\bl_\bl_\bo_\bc_\ba_\bt_\bo_\br = typename std::allocator_traits::template\n-rebind_alloc;\n-239\n-241 typedef _\bD_\bu_\bn_\be_\b:_\b:_\bS_\bL_\bL_\bi_\bs_\bt_\b<_\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\be_\bx_\b,_\bA_\bl_\bl_\bo_\bc_\ba_\bt_\bo_\br_\b>\n-_\b2_\b4_\b2 _\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\be_\bx_\bL_\bi_\bs_\bt;\n-243\n-245 typedef std::map >\n-_\b2_\b4_\b6 _\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\be_\bx_\bM_\ba_\bp;\n-247\n-_\b2_\b4_\b8 typedef typename RemoteIndexMap::const_iterator _\bc_\bo_\bn_\bs_\bt_\b__\bi_\bt_\be_\br_\ba_\bt_\bo_\br;\n-249\n-267 inline _\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\bi_\bc_\be_\bs(const _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt& source, const\n-_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt& destination,\n-268 const MPI_Comm& comm, const std::vector& _\bn_\be_\bi_\bg_\bh_\bb_\bo_\bu_\br_\bs=std::vector\n-(), bool includeSelf=false);\n-269\n-270 _\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\bi_\bc_\be_\bs();\n-271\n-279 void _\bs_\be_\bt_\bI_\bn_\bc_\bl_\bu_\bd_\be_\bS_\be_\bl_\bf(bool includeSelf);\n-280\n-297 void _\bs_\be_\bt_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt_\bs(const _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt& source, const _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt&\n-destination,\n-298 const MPI_Comm& comm, const std::vector& _\bn_\be_\bi_\bg_\bh_\bb_\bo_\bu_\br_\bs=std::vector\n-());\n-299\n-300 template\n-_\b3_\b0_\b1 void _\bs_\be_\bt_\bN_\be_\bi_\bg_\bh_\bb_\bo_\bu_\br_\bs(const C& _\bn_\be_\bi_\bg_\bh_\bb_\bo_\bu_\br_\bs)\n-302 {\n-303 neighbourIds.clear();\n-304 neighbourIds.insert(_\bn_\be_\bi_\bg_\bh_\bb_\bo_\bu_\br_\bs.begin(), _\bn_\be_\bi_\bg_\bh_\bb_\bo_\bu_\br_\bs.end());\n-305\n-306 }\n-307\n-_\b3_\b0_\b8 const std::set& _\bg_\be_\bt_\bN_\be_\bi_\bg_\bh_\bb_\bo_\bu_\br_\bs() const\n-309 {\n-310 return neighbourIds;\n-311 }\n-312\n-316 _\b~_\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\bi_\bc_\be_\bs();\n-317\n-327 template\n-328 void _\br_\be_\bb_\bu_\bi_\bl_\bd();\n-329\n-330 bool _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b=_\b=(const _\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\bi_\bc_\be_\bs& ri) const;\n-331\n-339 inline bool _\bi_\bs_\bS_\by_\bn_\bc_\be_\bd() const;\n-340\n-344 inline MPI_Comm _\bc_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bo_\br() const;\n-345\n-360 template\n-361 inline _\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\be_\bx_\bL_\bi_\bs_\bt_\bM_\bo_\bd_\bi_\bf_\bi_\be_\br_\b<_\bT_\b,_\bA_\b,_\bm_\bo_\bd_\be_\b> _\bg_\be_\bt_\bM_\bo_\bd_\bi_\bf_\bi_\be_\br(int process);\n-362\n-369 inline _\bc_\bo_\bn_\bs_\bt_\b__\bi_\bt_\be_\br_\ba_\bt_\bo_\br _\bf_\bi_\bn_\bd(int proc) const;\n-370\n-375 inline _\bc_\bo_\bn_\bs_\bt_\b__\bi_\bt_\be_\br_\ba_\bt_\bo_\br _\bb_\be_\bg_\bi_\bn() const;\n-376\n-381 inline _\bc_\bo_\bn_\bs_\bt_\b__\bi_\bt_\be_\br_\ba_\bt_\bo_\br _\be_\bn_\bd() const;\n-382\n-386 template\n-387 inline _\bC_\bo_\bl_\bl_\be_\bc_\bt_\bi_\bv_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bT _\bi_\bt_\be_\br_\ba_\bt_\bo_\br() const;\n-388\n-392 inline void _\bf_\br_\be_\be();\n-393\n-398 inline int _\bn_\be_\bi_\bg_\bh_\bb_\bo_\bu_\br_\bs() const;\n-399\n-401 inline const _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt& _\bs_\bo_\bu_\br_\bc_\be_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt() const;\n+191 MPI_Status _status;\n+192 MPI_Message _message;\n+193 T lvalue_data(std::forward(data));\n+194 auto mpi_data = _\bg_\be_\bt_\bM_\bP_\bI_\bD_\ba_\bt_\ba(lvalue_data);\n+195 static_assert(!mpi_data.static_size, \"rrecv work only for non-static-sized\n+types.\");\n+196 if(status == MPI_STATUS_IGNORE)\n+197 status = &_status;\n+198 MPI_Mprobe(source_rank, tag, communicator, &_message, status);\n+199 int _\bs_\bi_\bz_\be;\n+200 MPI_Get_count(status, mpi_data.type(), &_\bs_\bi_\bz_\be);\n+201 mpi_data.resize(_\bs_\bi_\bz_\be);\n+202 MPI_Mrecv(mpi_data.ptr(), mpi_data.size(), mpi_data.type(), &_message,\n+status);\n+203 return lvalue_data;\n+204 }\n+205\n+207 template\n+_\b2_\b0_\b8 T _\bs_\bu_\bm (const T& in) const\n+209 {\n+210 T out;\n+211 allreduce >(&in,&out,1);\n+212 return out;\n+213 }\n+214\n+216 template\n+_\b2_\b1_\b7 int _\bs_\bu_\bm (T* inout, int len) const\n+218 {\n+219 return allreduce >(inout,len);\n+220 }\n+221\n+223 template\n+_\b2_\b2_\b4 T _\bp_\br_\bo_\bd (const T& in) const\n+225 {\n+226 T out;\n+227 allreduce >(&in,&out,1);\n+228 return out;\n+229 }\n+230\n+232 template\n+_\b2_\b3_\b3 int _\bp_\br_\bo_\bd (T* inout, int len) const\n+234 {\n+235 return allreduce >(inout,len);\n+236 }\n+237\n+239 template\n+_\b2_\b4_\b0 T _\bm_\bi_\bn (const T& in) const\n+241 {\n+242 T out;\n+243 allreduce >(&in,&out,1);\n+244 return out;\n+245 }\n+246\n+248 template\n+_\b2_\b4_\b9 int _\bm_\bi_\bn (T* inout, int len) const\n+250 {\n+251 return allreduce >(inout,len);\n+252 }\n+253\n+254\n+256 template\n+_\b2_\b5_\b7 T _\bm_\ba_\bx (const T& in) const\n+258 {\n+259 T out;\n+260 allreduce >(&in,&out,1);\n+261 return out;\n+262 }\n+263\n+265 template\n+_\b2_\b6_\b6 int _\bm_\ba_\bx (T* inout, int len) const\n+267 {\n+268 return allreduce >(inout,len);\n+269 }\n+270\n+_\b2_\b7_\b2 int _\bb_\ba_\br_\br_\bi_\be_\br () const\n+273 {\n+274 return MPI_Barrier(communicator);\n+275 }\n+276\n+_\b2_\b7_\b8 _\bM_\bP_\bI_\bF_\bu_\bt_\bu_\br_\be_\b<_\bv_\bo_\bi_\bd_\b> _\bi_\bb_\ba_\br_\br_\bi_\be_\br () const\n+279 {\n+280 _\bM_\bP_\bI_\bF_\bu_\bt_\bu_\br_\be_\b<_\bv_\bo_\bi_\bd_\b> future(true); // make a valid MPIFuture\n+281 MPI_Ibarrier(communicator, &future.req_);\n+282 return future;\n+283 }\n+284\n+285\n+287 template\n+_\b2_\b8_\b8 int _\bb_\br_\bo_\ba_\bd_\bc_\ba_\bs_\bt (T* inout, int len, int root) const\n+289 {\n+290 return MPI_Bcast(inout,len,_\bM_\bP_\bI_\bT_\br_\ba_\bi_\bt_\bs_\b<_\bT_\b>_\b:_\b:_\bg_\be_\bt_\bT_\by_\bp_\be(),root,communicator);\n+291 }\n+292\n+294 template\n+_\b2_\b9_\b5 _\bM_\bP_\bI_\bF_\bu_\bt_\bu_\br_\be_\b<_\bT_\b> _\bi_\bb_\br_\bo_\ba_\bd_\bc_\ba_\bs_\bt(T&& data, int root) const{\n+296 _\bM_\bP_\bI_\bF_\bu_\bt_\bu_\br_\be_\b<_\bT_\b> future(std::forward(data));\n+297 auto mpidata = future._\bg_\be_\bt_\b__\bm_\bp_\bi_\bd_\ba_\bt_\ba();\n+298 MPI_Ibcast(mpidata.ptr(),\n+299 mpidata.size(),\n+300 mpidata.type(),\n+301 root,\n+302 communicator,\n+303 &future.req_);\n+304 return future;\n+305 }\n+306\n+309 template\n+_\b3_\b1_\b0 int _\bg_\ba_\bt_\bh_\be_\br (const T* in, T* out, int len, int root) const\n+311 {\n+312 return MPI_Gather(const_cast(in),len,_\bM_\bP_\bI_\bT_\br_\ba_\bi_\bt_\bs_\b<_\bT_\b>_\b:_\b:_\bg_\be_\bt_\bT_\by_\bp_\be(),\n+313 out,len,_\bM_\bP_\bI_\bT_\br_\ba_\bi_\bt_\bs_\b<_\bT_\b>_\b:_\b:_\bg_\be_\bt_\bT_\by_\bp_\be(),\n+314 root,communicator);\n+315 }\n+316\n+318 template>\n+_\b3_\b1_\b9 _\bM_\bP_\bI_\bF_\bu_\bt_\bu_\br_\be_\b<_\bT_\bO_\bU_\bT_\b,_\b _\bT_\bI_\bN_\b> _\bi_\bg_\ba_\bt_\bh_\be_\br(TIN&& data_in, TOUT&& data_out, int root)\n+const{\n+320 _\bM_\bP_\bI_\bF_\bu_\bt_\bu_\br_\be_\b<_\bT_\bO_\bU_\bT_\b,_\b _\bT_\bI_\bN_\b> future(std::forward(data_out), std::forward\n+(data_in));\n+321 auto mpidata_in = future._\bg_\be_\bt_\b__\bs_\be_\bn_\bd_\b__\bm_\bp_\bi_\bd_\ba_\bt_\ba();\n+322 auto mpidata_out = future._\bg_\be_\bt_\b__\bm_\bp_\bi_\bd_\ba_\bt_\ba();\n+323 assert(root != me || mpidata_in.size()*procs <= mpidata_out.size());\n+324 int outlen = (me==root) * mpidata_in.size();\n+325 MPI_Igather(mpidata_in.ptr(), mpidata_in.size(), mpidata_in.type(),\n+326 mpidata_out.ptr(), outlen, mpidata_out.type(),\n+327 root, communicator, &future.req_);\n+328 return future;\n+329 }\n+330\n+332 template\n+_\b3_\b3_\b3 int _\bg_\ba_\bt_\bh_\be_\br_\bv (const T* in, int sendDataLen, T* out, int* recvDataLen, int*\n+displ, int root) const\n+334 {\n+335 return MPI_Gatherv(const_cast(in),sendDataLen,_\bM_\bP_\bI_\bT_\br_\ba_\bi_\bt_\bs_\b<_\bT_\b>_\b:_\b:_\bg_\be_\bt_\bT_\by_\bp_\be(),\n+336 out,recvDataLen,displ,_\bM_\bP_\bI_\bT_\br_\ba_\bi_\bt_\bs_\b<_\bT_\b>_\b:_\b:_\bg_\be_\bt_\bT_\by_\bp_\be(),\n+337 root,communicator);\n+338 }\n+339\n+342 template\n+_\b3_\b4_\b3 int _\bs_\bc_\ba_\bt_\bt_\be_\br (const T* sendData, T* recvData, int len, int root) const\n+344 {\n+345 return MPI_Scatter(const_cast(sendData),len,_\bM_\bP_\bI_\bT_\br_\ba_\bi_\bt_\bs_\b<_\bT_\b>_\b:_\b:_\bg_\be_\bt_\bT_\by_\bp_\be(),\n+346 recvData,len,_\bM_\bP_\bI_\bT_\br_\ba_\bi_\bt_\bs_\b<_\bT_\b>_\b:_\b:_\bg_\be_\bt_\bT_\by_\bp_\be(),\n+347 root,communicator);\n+348 }\n+349\n+351 template\n+_\b3_\b5_\b2 _\bM_\bP_\bI_\bF_\bu_\bt_\bu_\br_\be_\b<_\bT_\bO_\bU_\bT_\b,_\b _\bT_\bI_\bN_\b> _\bi_\bs_\bc_\ba_\bt_\bt_\be_\br(TIN&& data_in, TOUT&& data_out, int root)\n+const\n+353 {\n+354 _\bM_\bP_\bI_\bF_\bu_\bt_\bu_\br_\be_\b<_\bT_\bO_\bU_\bT_\b,_\b _\bT_\bI_\bN_\b> future(std::forward(data_out), std::forward\n+(data_in));\n+355 auto mpidata_in = future._\bg_\be_\bt_\b__\bs_\be_\bn_\bd_\b__\bm_\bp_\bi_\bd_\ba_\bt_\ba();\n+356 auto mpidata_out = future._\bg_\be_\bt_\b__\bm_\bp_\bi_\bd_\ba_\bt_\ba();\n+357 int inlen = (me==root) * mpidata_in.size()/procs;\n+358 MPI_Iscatter(mpidata_in.ptr(), inlen, mpidata_in.type(),\n+359 mpidata_out.ptr(), mpidata_out.size(), mpidata_out.type(),\n+360 root, communicator, &future.req_);\n+361 return future;\n+362 }\n+363\n+365 template\n+_\b3_\b6_\b6 int _\bs_\bc_\ba_\bt_\bt_\be_\br_\bv (const T* sendData, int* sendDataLen, int* displ, T* recvData,\n+int recvDataLen, int root) const\n+367 {\n+368 return MPI_Scatterv(const_cast\n+(sendData),sendDataLen,displ,_\bM_\bP_\bI_\bT_\br_\ba_\bi_\bt_\bs_\b<_\bT_\b>_\b:_\b:_\bg_\be_\bt_\bT_\by_\bp_\be(),\n+369 recvData,recvDataLen,_\bM_\bP_\bI_\bT_\br_\ba_\bi_\bt_\bs_\b<_\bT_\b>_\b:_\b:_\bg_\be_\bt_\bT_\by_\bp_\be(),\n+370 root,communicator);\n+371 }\n+372\n+373\n+_\b3_\b7_\b4 operator MPI_Comm () const\n+375 {\n+376 return communicator;\n+377 }\n+378\n+380 template\n+_\b3_\b8_\b1 int _\ba_\bl_\bl_\bg_\ba_\bt_\bh_\be_\br(const T* sbuf, int count, T1* rbuf) const\n+382 {\n+383 return MPI_Allgather(const_cast(sbuf), count, _\bM_\bP_\bI_\bT_\br_\ba_\bi_\bt_\bs_\b<_\bT_\b>_\b:_\b:_\bg_\be_\bt_\bT_\by_\bp_\be(),\n+384 rbuf, count, _\bM_\bP_\bI_\bT_\br_\ba_\bi_\bt_\bs_\b<_\bT_\b1_\b>_\b:_\b:_\bg_\be_\bt_\bT_\by_\bp_\be(),\n+385 communicator);\n+386 }\n+387\n+389 template\n+_\b3_\b9_\b0 _\bM_\bP_\bI_\bF_\bu_\bt_\bu_\br_\be_\b<_\bT_\bO_\bU_\bT_\b,_\b _\bT_\bI_\bN_\b> _\bi_\ba_\bl_\bl_\bg_\ba_\bt_\bh_\be_\br(TIN&& data_in, TOUT&& data_out) const\n+391 {\n+392 _\bM_\bP_\bI_\bF_\bu_\bt_\bu_\br_\be_\b<_\bT_\bO_\bU_\bT_\b,_\b _\bT_\bI_\bN_\b> future(std::forward(data_out), std::forward\n+(data_in));\n+393 auto mpidata_in = future._\bg_\be_\bt_\b__\bs_\be_\bn_\bd_\b__\bm_\bp_\bi_\bd_\ba_\bt_\ba();\n+394 auto mpidata_out = future._\bg_\be_\bt_\b__\bm_\bp_\bi_\bd_\ba_\bt_\ba();\n+395 assert(mpidata_in.size()*procs <= mpidata_out.size());\n+396 int outlen = mpidata_in.size();\n+397 MPI_Iallgather(mpidata_in.ptr(), mpidata_in.size(), mpidata_in.type(),\n+398 mpidata_out.ptr(), outlen, mpidata_out.type(),\n+399 communicator, &future.req_);\n+400 return future;\n+401 }\n 402\n-404 inline const _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt& _\bd_\be_\bs_\bt_\bi_\bn_\ba_\bt_\bi_\bo_\bn_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt() const;\n-405\n-406 private:\n-408 _\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\bi_\bc_\be_\bs(const _\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\bi_\bc_\be_\bs&) = delete;\n-409\n-411 const _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt* source_;\n-412\n-414 const _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt* target_;\n-415\n-417 MPI_Comm comm_;\n-418\n-421 std::set neighbourIds;\n+404 template\n+_\b4_\b0_\b5 int _\ba_\bl_\bl_\bg_\ba_\bt_\bh_\be_\br_\bv (const T* in, int sendDataLen, T* out, int* recvDataLen,\n+int* displ) const\n+406 {\n+407 return MPI_Allgatherv(const_cast(in),sendDataLen,_\bM_\bP_\bI_\bT_\br_\ba_\bi_\bt_\bs_\b<_\bT_\b>_\b:_\b:_\bg_\be_\bt_\bT_\by_\bp_\be\n+(),\n+408 out,recvDataLen,displ,_\bM_\bP_\bI_\bT_\br_\ba_\bi_\bt_\bs_\b<_\bT_\b>_\b:_\b:_\bg_\be_\bt_\bT_\by_\bp_\be(),\n+409 communicator);\n+410 }\n+411\n+413 template\n+_\b4_\b1_\b4 int _\ba_\bl_\bl_\br_\be_\bd_\bu_\bc_\be(Type* inout, int len) const\n+415 {\n+416 Type* out = new Type[len];\n+417 int ret = allreduce(inout,out,len);\n+418 std::copy(out, out+len, inout);\n+419 delete[] out;\n+420 return ret;\n+421 }\n 422\n-424 const static int commTag_=333;\n-425\n-430 int sourceSeqNo_;\n-431\n-436 int destSeqNo_;\n-437\n-441 bool publicIgnored;\n-442\n-446 bool firstBuild;\n+423 template\n+_\b4_\b2_\b4 Type _\ba_\bl_\bl_\br_\be_\bd_\bu_\bc_\be(Type&& in) const{\n+425 Type lvalue_data = std::forward(in);\n+426 auto data = _\bg_\be_\bt_\bM_\bP_\bI_\bD_\ba_\bt_\ba(lvalue_data);\n+427 MPI_Allreduce(MPI_IN_PLACE, data.ptr(), data.size(), data.type(),\n+428 (_\bG_\be_\bn_\be_\br_\bi_\bc_\b__\bM_\bP_\bI_\b__\bO_\bp_\b<_\bT_\by_\bp_\be_\b,_\b _\bB_\bi_\bn_\ba_\br_\by_\bF_\bu_\bn_\bc_\bt_\bi_\bo_\bn_\b>_\b:_\b:_\bg_\be_\bt()),\n+429 communicator);\n+430 return lvalue_data;\n+431 }\n+432\n+434 template\n+_\b4_\b3_\b5 _\bM_\bP_\bI_\bF_\bu_\bt_\bu_\br_\be_\b<_\bT_\bO_\bU_\bT_\b,_\b _\bT_\bI_\bN_\b> _\bi_\ba_\bl_\bl_\br_\be_\bd_\bu_\bc_\be(TIN&& data_in, TOUT&& data_out) const {\n+436 _\bM_\bP_\bI_\bF_\bu_\bt_\bu_\br_\be_\b<_\bT_\bO_\bU_\bT_\b,_\b _\bT_\bI_\bN_\b> future(std::forward(data_out), std::forward\n+(data_in));\n+437 auto mpidata_in = future._\bg_\be_\bt_\b__\bs_\be_\bn_\bd_\b__\bm_\bp_\bi_\bd_\ba_\bt_\ba();\n+438 auto mpidata_out = future._\bg_\be_\bt_\b__\bm_\bp_\bi_\bd_\ba_\bt_\ba();\n+439 assert(mpidata_out.size() == mpidata_in.size());\n+440 assert(mpidata_out.type() == mpidata_in.type());\n+441 MPI_Iallreduce(mpidata_in.ptr(), mpidata_out.ptr(),\n+442 mpidata_out.size(), mpidata_out.type(),\n+443 (_\bG_\be_\bn_\be_\br_\bi_\bc_\b__\bM_\bP_\bI_\b__\bO_\bp_\b<_\bT_\bI_\bN_\b,_\b _\bB_\bi_\bn_\ba_\br_\by_\bF_\bu_\bn_\bc_\bt_\bi_\bo_\bn_\b>_\b:_\b:_\bg_\be_\bt()),\n+444 communicator, &future.req_);\n+445 return future;\n+446 }\n 447\n-448 /*\n-449 * @brief If true, sending from indices of the processor to other\n-450 * indices on the same processor is enabled even if the same indexset is\n-used\n-451 * on both the\n-452 * sending and receiving side.\n-453 */\n-454 bool includeSelf;\n-455\n-457 typedef _\bI_\bn_\bd_\be_\bx_\bP_\ba_\bi_\br_\b<_\bG_\bl_\bo_\bb_\ba_\bl_\bI_\bn_\bd_\be_\bx_\b,_\b _\bL_\bo_\bc_\ba_\bl_\bI_\bn_\bd_\be_\bx_\b>\n-458 PairType;\n+449 template\n+_\b4_\b5_\b0 _\bM_\bP_\bI_\bF_\bu_\bt_\bu_\br_\be_\b<_\bT_\b> _\bi_\ba_\bl_\bl_\br_\be_\bd_\bu_\bc_\be(T&& data) const{\n+451 _\bM_\bP_\bI_\bF_\bu_\bt_\bu_\br_\be_\b<_\bT_\b> future(std::forward(data));\n+452 auto mpidata = future._\bg_\be_\bt_\b__\bm_\bp_\bi_\bd_\ba_\bt_\ba();\n+453 MPI_Iallreduce(MPI_IN_PLACE, mpidata.ptr(),\n+454 mpidata.size(), mpidata.type(),\n+455 (_\bG_\be_\bn_\be_\br_\bi_\bc_\b__\bM_\bP_\bI_\b__\bO_\bp_\b<_\bT_\b,_\b _\bB_\bi_\bn_\ba_\br_\by_\bF_\bu_\bn_\bc_\bt_\bi_\bo_\bn_\b>_\b:_\b:_\bg_\be_\bt()),\n+456 communicator, &future.req_);\n+457 return future;\n+458 }\n 459\n-466 _\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\be_\bx_\bM_\ba_\bp remoteIndices_;\n+461 template\n+_\b4_\b6_\b2 int _\ba_\bl_\bl_\br_\be_\bd_\bu_\bc_\be(const Type* in, Type* out, int len) const\n+463 {\n+464 return MPI_Allreduce(const_cast(in), out, len, _\bM_\bP_\bI_\bT_\br_\ba_\bi_\bt_\bs_\b<_\bT_\by_\bp_\be_\b>_\b:_\b:\n+_\bg_\be_\bt_\bT_\by_\bp_\be(),\n+465 (_\bG_\be_\bn_\be_\br_\bi_\bc_\b__\bM_\bP_\bI_\b__\bO_\bp_\b<_\bT_\by_\bp_\be_\b,_\b _\bB_\bi_\bn_\ba_\br_\by_\bF_\bu_\bn_\bc_\bt_\bi_\bo_\bn_\b>_\b:_\b:_\bg_\be_\bt()),communicator);\n+466 }\n 467\n-478 template\n-479 inline void buildRemote(bool includeSelf);\n-480\n-486 inline int noPublic(const _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt& indexSet);\n-487\n-499 template\n-500 inline void packEntries(PairType** myPairs, const _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt&\n-indexSet,\n-501 char* p_out, MPI_Datatype type, int bufferSize,\n-502 int* position, int n);\n-503\n-517 inline void unpackIndices(_\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\be_\bx_\bL_\bi_\bs_\bt& remote, int remoteEntries,\n-518 PairType** local, int localEntries, char* p_in,\n-519 MPI_Datatype type, int* position, int bufferSize,\n-520 bool fromOurself);\n-521\n-522 inline void unpackIndices(_\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\be_\bx_\bL_\bi_\bs_\bt& send, _\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\be_\bx_\bL_\bi_\bs_\bt& receive,\n-523 int remoteEntries, PairType** localSource,\n-524 int localSourceEntries, PairType** localDest,\n-525 int localDestEntries, char* p_in,\n-526 MPI_Datatype type, int* position, int bufferSize);\n-527\n-528 void unpackCreateRemote(char* p_in, PairType** sourcePairs, PairType**\n-DestPairs,\n-529 int remoteProc, int sourcePublish, int destPublish,\n-530 int bufferSize, bool sendTwo, bool fromOurSelf=false);\n-531 };\n-532\n-548 template\n-_\b5_\b4_\b9 class _\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\be_\bx_\bL_\bi_\bs_\bt_\bM_\bo_\bd_\bi_\bf_\bi_\be_\br\n-550 {\n-551\n-552 template\n-_\b5_\b5_\b3 friend class _\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\bi_\bc_\be_\bs;\n-554\n-555 public:\n-_\b5_\b5_\b6 class _\bI_\bn_\bv_\ba_\bl_\bi_\bd_\bP_\bo_\bs_\bi_\bt_\bi_\bo_\bn : public _\bR_\ba_\bn_\bg_\be_\bE_\br_\br_\bo_\br\n-557 {};\n-558\n-_\b5_\b6_\b7 constexpr static bool _\bM_\bO_\bD_\bI_\bF_\bY_\bI_\bN_\bD_\bE_\bX_\bS_\bE_\bT = mode;\n-568\n-_\b5_\b7_\b2 typedef T _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt;\n-573\n-_\b5_\b7_\b7 typedef typename _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt_\b:_\b:_\bG_\bl_\bo_\bb_\ba_\bl_\bI_\bn_\bd_\be_\bx _\bG_\bl_\bo_\bb_\ba_\bl_\bI_\bn_\bd_\be_\bx;\n-578\n-_\b5_\b8_\b2 typedef typename _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt_\b:_\b:_\bL_\bo_\bc_\ba_\bl_\bI_\bn_\bd_\be_\bx _\bL_\bo_\bc_\ba_\bl_\bI_\bn_\bd_\be_\bx;\n-583\n-_\b5_\b8_\b7 typedef typename LocalIndex::Attribute _\bA_\bt_\bt_\br_\bi_\bb_\bu_\bt_\be;\n-588\n-_\b5_\b9_\b2 typedef _\bD_\bu_\bn_\be_\b:_\b:_\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\be_\bx_\b<_\bG_\bl_\bo_\bb_\ba_\bl_\bI_\bn_\bd_\be_\bx_\b,_\bA_\bt_\bt_\br_\bi_\bb_\bu_\bt_\be_\b> _\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\be_\bx;\n-593\n-_\b5_\b9_\b7 typedef A _\bA_\bl_\bl_\bo_\bc_\ba_\bt_\bo_\br;\n-598\n-600 typedef _\bD_\bu_\bn_\be_\b:_\b:_\bS_\bL_\bL_\bi_\bs_\bt_\b<_\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\be_\bx_\b,_\bA_\bl_\bl_\bo_\bc_\ba_\bt_\bo_\br_\b>\n-_\b6_\b0_\b1 _\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\be_\bx_\bL_\bi_\bs_\bt;\n-602\n-_\b6_\b0_\b6 typedef _\bS_\bL_\bL_\bi_\bs_\bt_\bM_\bo_\bd_\bi_\bf_\by_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b<_\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\be_\bx_\b,_\bA_\bl_\bl_\bo_\bc_\ba_\bt_\bo_\br_\b> _\bM_\bo_\bd_\bi_\bf_\by_\bI_\bt_\be_\br_\ba_\bt_\bo_\br;\n-607\n-_\b6_\b1_\b1 typedef typename _\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\be_\bx_\bL_\bi_\bs_\bt_\b:_\b:_\bc_\bo_\bn_\bs_\bt_\b__\bi_\bt_\be_\br_\ba_\bt_\bo_\br _\bC_\bo_\bn_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br;\n-612\n-626 void _\bi_\bn_\bs_\be_\br_\bt(const _\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\be_\bx& index);\n-627\n-628\n-643 void _\bi_\bn_\bs_\be_\br_\bt(const _\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\be_\bx& index, const _\bG_\bl_\bo_\bb_\ba_\bl_\bI_\bn_\bd_\be_\bx& global);\n-644\n-652 bool _\br_\be_\bm_\bo_\bv_\be(const _\bG_\bl_\bo_\bb_\ba_\bl_\bI_\bn_\bd_\be_\bx& global);\n-653\n-666 void _\br_\be_\bp_\ba_\bi_\br_\bL_\bo_\bc_\ba_\bl_\bI_\bn_\bd_\be_\bx_\bP_\bo_\bi_\bn_\bt_\be_\br_\bs();\n-667\n-668\n-669 _\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\be_\bx_\bL_\bi_\bs_\bt_\bM_\bo_\bd_\bi_\bf_\bi_\be_\br(const _\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\be_\bx_\bL_\bi_\bs_\bt_\bM_\bo_\bd_\bi_\bf_\bi_\be_\br&);\n-670\n-_\b6_\b7_\b5 _\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\be_\bx_\bL_\bi_\bs_\bt_\bM_\bo_\bd_\bi_\bf_\bi_\be_\br()\n-676 : glist_()\n-677 {}\n-678\n-679 private:\n-680\n-686 _\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\be_\bx_\bL_\bi_\bs_\bt_\bM_\bo_\bd_\bi_\bf_\bi_\be_\br(const _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt& indexSet,\n-687 _\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\be_\bx_\bL_\bi_\bs_\bt& rList);\n-688\n-689 typedef _\bS_\bL_\bL_\bi_\bs_\bt_\b<_\bG_\bl_\bo_\bb_\ba_\bl_\bI_\bn_\bd_\be_\bx_\b,_\bA_\bl_\bl_\bo_\bc_\ba_\bt_\bo_\br_\b> GlobalList;\n-690 typedef typename _\bG_\bl_\bo_\bb_\ba_\bl_\bL_\bi_\bs_\bt_\b:_\b:_\bM_\bo_\bd_\bi_\bf_\by_\bI_\bt_\be_\br_\ba_\bt_\bo_\br GlobalModifyIterator;\n-691 _\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\be_\bx_\bL_\bi_\bs_\bt* rList_;\n-692 const _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt* indexSet_;\n-693 GlobalList glist_;\n-694 _\bM_\bo_\bd_\bi_\bf_\by_\bI_\bt_\be_\br_\ba_\bt_\bo_\br iter_;\n-695 GlobalModifyIterator giter_;\n-696 _\bC_\bo_\bn_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br end_;\n-697 bool first_;\n-698 _\bG_\bl_\bo_\bb_\ba_\bl_\bI_\bn_\bd_\be_\bx last_;\n-699 };\n-700\n-705 template\n-_\b7_\b0_\b6 class _\bC_\bo_\bl_\bl_\be_\bc_\bt_\bi_\bv_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br\n-707 {\n-708\n-712 typedef T ParallelIndexSet;\n-713\n-717 typedef typename _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt_\b:_\b:_\bG_\bl_\bo_\bb_\ba_\bl_\bI_\bn_\bd_\be_\bx GlobalIndex;\n-718\n-722 typedef typename _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt_\b:_\b:_\bL_\bo_\bc_\ba_\bl_\bI_\bn_\bd_\be_\bx LocalIndex;\n-723\n-727 typedef typename LocalIndex::Attribute Attribute;\n-728\n-730 typedef _\bD_\bu_\bn_\be_\b:_\b:_\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\be_\bx_\b<_\bG_\bl_\bo_\bb_\ba_\bl_\bI_\bn_\bd_\be_\bx_\b,_\bA_\bt_\bt_\br_\bi_\bb_\bu_\bt_\be_\b> _\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\be_\bx;\n-731\n-733 using Allocator = typename std::allocator_traits::template\n-rebind_alloc;\n-734\n-736 typedef _\bD_\bu_\bn_\be_\b:_\b:_\bS_\bL_\bL_\bi_\bs_\bt_\b<_\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\be_\bx_\b,_\bA_\bl_\bl_\bo_\bc_\ba_\bt_\bo_\br_\b> _\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\be_\bx_\bL_\bi_\bs_\bt;\n-737\n-739 typedef std::map >\n-741 Map;\n-742\n-743 public:\n-744\n-746 typedef std::map >\n-_\b7_\b4_\b7 _\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\be_\bx_\bM_\ba_\bp;\n-748\n-754 inline _\bC_\bo_\bl_\bl_\be_\bc_\bt_\bi_\bv_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br(const _\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\be_\bx_\bM_\ba_\bp& map_, bool send);\n-755\n-764 inline void _\ba_\bd_\bv_\ba_\bn_\bc_\be(const GlobalIndex& global);\n-765\n-775 inline void _\ba_\bd_\bv_\ba_\bn_\bc_\be(const GlobalIndex& global, const Attribute& attribute);\n-776\n-777 _\bC_\bo_\bl_\bl_\be_\bc_\bt_\bi_\bv_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br& _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b+_\b+();\n-778\n-782 inline bool _\be_\bm_\bp_\bt_\by() const;\n-783\n-_\b7_\b9_\b0 class _\bi_\bt_\be_\br_\ba_\bt_\bo_\br\n-791 {\n-792 public:\n-_\b7_\b9_\b3 typedef typename Map::iterator _\bR_\be_\ba_\bl_\bI_\bt_\be_\br_\ba_\bt_\bo_\br;\n-_\b7_\b9_\b4 typedef typename Map::iterator _\bC_\bo_\bn_\bs_\bt_\bR_\be_\ba_\bl_\bI_\bt_\be_\br_\ba_\bt_\bo_\br;\n-795\n-796\n-_\b7_\b9_\b8 _\bi_\bt_\be_\br_\ba_\bt_\bo_\br(const _\bR_\be_\ba_\bl_\bI_\bt_\be_\br_\ba_\bt_\bo_\br& iter, const _\bC_\bo_\bn_\bs_\bt_\bR_\be_\ba_\bl_\bI_\bt_\be_\br_\ba_\bt_\bo_\br& _\be_\bn_\bd,\n-GlobalIndex& index)\n-799 : iter_(iter), end_(_\be_\bn_\bd), index_(index), hasAttribute(false)\n-800 {\n-801 // Move to the first valid entry\n-802 while(iter_!=end_ && iter_->second.first->localIndexPair().global\n-()!=index_)\n-803 ++iter_;\n-804 }\n-805\n-_\b8_\b0_\b6 _\bi_\bt_\be_\br_\ba_\bt_\bo_\br(const _\bR_\be_\ba_\bl_\bI_\bt_\be_\br_\ba_\bt_\bo_\br& iter, const _\bC_\bo_\bn_\bs_\bt_\bR_\be_\ba_\bl_\bI_\bt_\be_\br_\ba_\bt_\bo_\br& _\be_\bn_\bd,\n-GlobalIndex index,\n-807 Attribute attribute)\n-808 : iter_(iter), end_(_\be_\bn_\bd), index_(index), attribute_(attribute),\n-hasAttribute(true)\n-809 {\n-810 // Move to the first valid entry or the end\n-811 while(iter_!=end_ && (iter_->second.first->localIndexPair().global\n-()!=index_\n-812 || iter_->second.first->localIndexPair().local().attribute()!=attribute))\n-813 ++iter_;\n-814 }\n-_\b8_\b1_\b6 _\bi_\bt_\be_\br_\ba_\bt_\bo_\br(const _\bi_\bt_\be_\br_\ba_\bt_\bo_\br& other)\n-817 : iter_(other.iter_), end_(other.end_), index_(other.index_)\n-818 { }\n-819\n-_\b8_\b2_\b1 _\bi_\bt_\be_\br_\ba_\bt_\bo_\br& _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b+_\b+()\n-822 {\n-823 ++iter_;\n-824 // If entry is not valid move on\n-825 while(iter_!=end_ && (iter_->second.first->localIndexPair().global\n-()!=index_ ||\n-826 (hasAttribute &&\n-827 iter_->second.first->localIndexPair().local().attribute()!=attribute_)))\n-828 ++iter_;\n-829 assert(iter_==end_ ||\n-830 (iter_->second.first->localIndexPair().global()==index_));\n-831 assert(iter_==end_ || !hasAttribute ||\n-832 (iter_->second.first->localIndexPair().local().attribute()==attribute_));\n-833 return *this;\n-834 }\n-835\n-_\b8_\b3_\b7 const _\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\be_\bx& _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b*() const\n-838 {\n-839 return *(iter_->second.first);\n-840 }\n-841\n-_\b8_\b4_\b3 int _\bp_\br_\bo_\bc_\be_\bs_\bs() const\n-844 {\n-845 return iter_->first;\n-846 }\n-847\n-_\b8_\b4_\b9 const _\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\be_\bx* _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b-_\b>() const\n-850 {\n-851 return iter_->second.first.operator->();\n-852 }\n-853\n-_\b8_\b5_\b5 bool _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b=_\b=(const _\bi_\bt_\be_\br_\ba_\bt_\bo_\br& other) const\n-856 {\n-857 return other.iter_==iter_;\n-858 }\n-859\n-_\b8_\b6_\b1 bool _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b!_\b=(const _\bi_\bt_\be_\br_\ba_\bt_\bo_\br& other) const\n-862 {\n-863 return other.iter_!=iter_;\n-864 }\n-865\n-866 private:\n-867 _\bi_\bt_\be_\br_\ba_\bt_\bo_\br();\n-868\n-869 _\bR_\be_\ba_\bl_\bI_\bt_\be_\br_\ba_\bt_\bo_\br iter_;\n-870 _\bR_\be_\ba_\bl_\bI_\bt_\be_\br_\ba_\bt_\bo_\br end_;\n-871 GlobalIndex index_;\n-872 Attribute attribute_;\n-873 bool hasAttribute;\n-874 };\n-875\n-876 iterator _\bb_\be_\bg_\bi_\bn();\n-877\n-878 iterator _\be_\bn_\bd();\n-879\n-880 private:\n-881\n-882 Map map_;\n-883 GlobalIndex index_;\n-884 Attribute attribute_;\n-885 bool noattribute;\n-886 };\n-887\n-888 template\n-_\b8_\b8_\b9 MPI_Datatype _\bM_\bP_\bI_\bT_\br_\ba_\bi_\bt_\bs_\b<_\bI_\bn_\bd_\be_\bx_\bP_\ba_\bi_\br_\b<_\bT_\bG_\b,_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bL_\bo_\bc_\ba_\bl_\bI_\bn_\bd_\be_\bx_\b<_\bT_\bA_\b> > >::getType()\n-890 {\n-891 if(type==MPI_DATATYPE_NULL) {\n-892 int length[2] = {1, 1};\n-893 MPI_Aint base;\n-894 MPI_Aint disp[2];\n-895 MPI_Datatype types[2] = {_\bM_\bP_\bI_\bT_\br_\ba_\bi_\bt_\bs_\b<_\bT_\bG_\b>_\b:_\b:_\bg_\be_\bt_\bT_\by_\bp_\be(),\n-896 _\bM_\bP_\bI_\bT_\br_\ba_\bi_\bt_\bs_\b<_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bL_\bo_\bc_\ba_\bl_\bI_\bn_\bd_\be_\bx_\b<_\bT_\bA_\b> >::getType()};\n-897 _\bI_\bn_\bd_\be_\bx_\bP_\ba_\bi_\br_\b<_\bT_\bG_\b,_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bL_\bo_\bc_\ba_\bl_\bI_\bn_\bd_\be_\bx_\b<_\bT_\bA_\b> > rep;\n-898 MPI_Get_address(&rep, &base); // lower bound of the datatype\n-899 MPI_Get_address(&(rep.global_), &disp[0]);\n-900 MPI_Get_address(&(rep.local_), &disp[1]);\n-901 for (MPI_Aint& d : disp)\n-902 d -= base;\n-903\n-904 MPI_Datatype tmp;\n-905 MPI_Type_create_struct(2, length, disp, types, &tmp);\n-906\n-907 MPI_Type_create_resized(tmp, 0, sizeof(_\bI_\bn_\bd_\be_\bx_\bP_\ba_\bi_\br\n->), &type);\n-908 MPI_Type_commit(&type);\n-909\n-910 MPI_Type_free(&tmp);\n-911 }\n-912 return type;\n-913 }\n-914\n-915 template\n-916 MPI_Datatype _\bM_\bP_\bI_\bT_\br_\ba_\bi_\bt_\bs_\b<_\bI_\bn_\bd_\be_\bx_\bP_\ba_\bi_\br_\b<_\bT_\bG_\b,_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bL_\bo_\bc_\ba_\bl_\bI_\bn_\bd_\be_\bx_\b<_\bT_\bA_\b> > >::\n-type=MPI_DATATYPE_NULL;\n-917\n-918 template\n-_\b9_\b1_\b9 _\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\be_\bx_\b<_\bT_\b1_\b,_\bT_\b2_\b>_\b:_\b:_\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\be_\bx(const T2& attribute, const _\bP_\ba_\bi_\br_\bT_\by_\bp_\be* local)\n-920 : localIndex_(local), attribute_(static_cast<_\bs_\bt_\bd::underlying_type_t>\n-(attribute))\n-921 {}\n-922\n-923 template\n-_\b9_\b2_\b4 _\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\be_\bx_\b<_\bT_\b1_\b,_\bT_\b2_\b>_\b:_\b:_\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\be_\bx(const T2& attribute)\n-925 : localIndex_(0), attribute_(static_cast<_\bs_\bt_\bd::underlying_type_t>\n-(attribute))\n-926 {}\n-927\n-928 template\n-_\b9_\b2_\b9 _\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\be_\bx_\b<_\bT_\b1_\b,_\bT_\b2_\b>_\b:_\b:_\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\be_\bx()\n-930 : localIndex_(0), attribute_()\n-931 {}\n-932 template\n-_\b9_\b3_\b3 inline bool _\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\be_\bx_\b<_\bT_\b1_\b,_\bT_\b2_\b>_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b=_\b=(const _\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\be_\bx& ri) const\n-934 {\n-935 return localIndex_==ri.localIndex_ && attribute_==ri.attribute_;\n-936 }\n-937\n-938 template\n-_\b9_\b3_\b9 inline bool _\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\be_\bx_\b<_\bT_\b1_\b,_\bT_\b2_\b>_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b!_\b=(const _\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\be_\bx& ri) const\n-940 {\n-941 return localIndex_!=ri.localIndex_ || attribute_!=ri.attribute_;\n-942 }\n-943\n-944 template\n-_\b9_\b4_\b5 inline const T2 _\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\be_\bx_\b<_\bT_\b1_\b,_\bT_\b2_\b>_\b:_\b:_\ba_\bt_\bt_\br_\bi_\bb_\bu_\bt_\be() const\n-946 {\n-947 return T2(attribute_);\n-948 }\n-949\n-950 template\n-_\b9_\b5_\b1 inline const _\bI_\bn_\bd_\be_\bx_\bP_\ba_\bi_\br_\b<_\bT_\b1_\b,_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bL_\bo_\bc_\ba_\bl_\bI_\bn_\bd_\be_\bx_\b<_\bT_\b2_\b> >& _\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\be_\bx_\b<_\bT_\b1_\b,_\bT_\b2_\b>_\b:_\b:\n-_\bl_\bo_\bc_\ba_\bl_\bI_\bn_\bd_\be_\bx_\bP_\ba_\bi_\br() const\n-952 {\n-953 return *localIndex_;\n-954 }\n-955\n-956 template\n-_\b9_\b5_\b7 inline _\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\bi_\bc_\be_\bs_\b<_\bT_\b,_\bA_\b>_\b:_\b:_\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\bi_\bc_\be_\bs(const _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt& source,\n-958 const _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt& destination,\n-959 const MPI_Comm& comm,\n-960 const std::vector& neighbours,\n-961 bool includeSelf_)\n-962 : source_(&source), target_(&destination), comm_(comm),\n-963 sourceSeqNo_(-1), destSeqNo_(-1), publicIgnored(false), firstBuild(true),\n-964 includeSelf(includeSelf_)\n-965 {\n-966 _\bs_\be_\bt_\bN_\be_\bi_\bg_\bh_\bb_\bo_\bu_\br_\bs(_\bn_\be_\bi_\bg_\bh_\bb_\bo_\bu_\br_\bs);\n-967 }\n-968\n-969 template\n-_\b9_\b7_\b0 void _\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\bi_\bc_\be_\bs_\b<_\bT_\b,_\bA_\b>_\b:_\b:_\bs_\be_\bt_\bI_\bn_\bc_\bl_\bu_\bd_\be_\bS_\be_\bl_\bf(bool b)\n-971 {\n-972 includeSelf=b;\n-973 }\n-974\n-975 template\n-_\b9_\b7_\b6 _\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\bi_\bc_\be_\bs_\b<_\bT_\b,_\bA_\b>_\b:_\b:_\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\bi_\bc_\be_\bs()\n-977 : source_(0), target_(0), sourceSeqNo_(-1),\n-978 destSeqNo_(-1), publicIgnored(false), firstBuild(true),\n-979 includeSelf(false)\n-980 {}\n-981\n-982 template\n-_\b9_\b8_\b3 void _\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\bi_\bc_\be_\bs_\b<_\bT_\b,_\bA_\b>_\b:_\b:_\bs_\be_\bt_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt_\bs(const _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt& source,\n-984 const _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt& destination,\n-985 const MPI_Comm& comm,\n-986 const std::vector& neighbours)\n-987 {\n-988 free();\n-989 source_ = &source;\n-990 target_ = &destination;\n-991 comm_ = comm;\n-992 firstBuild = true;\n-993 setNeighbours(neighbours);\n-994 }\n-995\n-996 template\n-997 const typename _\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\bi_\bc_\be_\bs_\b<_\bT_\b,_\bA_\b>_\b:_\b:_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt&\n-_\b9_\b9_\b8 _\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\bi_\bc_\be_\bs_\b<_\bT_\b,_\bA_\b>_\b:_\b:_\bs_\bo_\bu_\br_\bc_\be_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt() const\n-999 {\n-1000 return *source_;\n-1001 }\n-1002\n-1003\n-1004 template\n-1005 const typename _\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\bi_\bc_\be_\bs_\b<_\bT_\b,_\bA_\b>_\b:_\b:_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt&\n-_\b1_\b0_\b0_\b6 _\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\bi_\bc_\be_\bs_\b<_\bT_\b,_\bA_\b>_\b:_\b:_\bd_\be_\bs_\bt_\bi_\bn_\ba_\bt_\bi_\bo_\bn_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt() const\n-1007 {\n-1008 return *target_;\n-1009 }\n-1010\n-1011\n-1012 template\n-_\b1_\b0_\b1_\b3 _\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\bi_\bc_\be_\bs_\b<_\bT_\b,_\bA_\b>_\b:_\b:_\b~_\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\bi_\bc_\be_\bs()\n-1014 {\n-1015 free();\n-1016 }\n-1017\n-1018 template\n-1019 template\n-_\b1_\b0_\b2_\b0 inline void _\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\bi_\bc_\be_\bs_\b<_\bT_\b,_\bA_\b>_\b:_\b:_\bp_\ba_\bc_\bk_\bE_\bn_\bt_\br_\bi_\be_\bs\n-(_\bI_\bn_\bd_\be_\bx_\bP_\ba_\bi_\br_\b<_\bG_\bl_\bo_\bb_\ba_\bl_\bI_\bn_\bd_\be_\bx_\b,_\bL_\bo_\bc_\ba_\bl_\bI_\bn_\bd_\be_\bx_\b>** pairs,\n-1021 const _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt& indexSet,\n-1022 char* p_out, MPI_Datatype type,\n-1023 int bufferSize,\n-1024 int *position,\n-1025 [[maybe_unused]] int n)\n-1026 {\n-1027 // fill with own indices\n-1028 const auto end = indexSet._\be_\bn_\bd();\n-1029\n-1030 //Now pack the source indices\n-1031 int i=0;\n-1032 for(auto index = indexSet.begin(); index != end; ++index)\n-1033 if(ignorePublic || index->local().isPublic()) {\n-1034\n-1035 MPI_Pack(const_cast<_\bP_\ba_\bi_\br_\bT_\by_\bp_\be*>(&(*index)), 1,\n-1036 type,\n-1037 p_out, bufferSize, position, comm_);\n-1038 pairs[i++] = const_cast<_\bP_\ba_\bi_\br_\bT_\by_\bp_\be*>(&(*index));\n-1039\n-1040 }\n-1041 assert(i==n);\n-1042 }\n-1043\n-1044 template\n-1045 inline int _\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\bi_\bc_\be_\bs_\b<_\bT_\b,_\bA_\b>_\b:_\b:_\bn_\bo_\bP_\bu_\bb_\bl_\bi_\bc(const _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt& indexSet)\n-1046 {\n-1047\n-1048 int noPublic=0;\n-1049\n-1050 const auto end=indexSet._\be_\bn_\bd();\n-1051 for(auto index=indexSet._\bb_\be_\bg_\bi_\bn(); index!=end; ++index)\n-1052 if(index->local().isPublic())\n-1053 noPublic++;\n-1054\n-1055 return noPublic;\n-1056\n-1057 }\n-1058\n-1059\n-1060 template\n-1061 inline void RemoteIndices::unpackCreateRemote(char* p_in, PairType**\n-sourcePairs,\n-1062 PairType** destPairs, int remoteProc,\n-1063 int sourcePublish, int destPublish,\n-1064 int bufferSize, bool sendTwo,\n-1065 bool fromOurSelf)\n-1066 {\n-1067\n-1068 // unpack the number of indices we received\n-1069 int noRemoteSource=-1, noRemoteDest=-1;\n-1070 char twoIndexSets=0;\n-1071 int position=0;\n-1072 // Did we receive two index sets?\n-1073 MPI_Unpack(p_in, bufferSize, &position, &twoIndexSets, 1, MPI_CHAR,\n-comm_);\n-1074 // The number of source indices received\n-1075 MPI_Unpack(p_in, bufferSize, &position, &noRemoteSource, 1, MPI_INT,\n-comm_);\n-1076 // The number of destination indices received\n-1077 MPI_Unpack(p_in, bufferSize, &position, &noRemoteDest, 1, MPI_INT, comm_);\n-1078\n-1079\n-1080 // Indices for which we receive\n-1081 RemoteIndexList* receive= new RemoteIndexList();\n-1082 // Indices for which we send\n-1083 RemoteIndexList* send=0;\n-1084\n-1085 MPI_Datatype type= _\bM_\bP_\bI_\bT_\br_\ba_\bi_\bt_\bs_\b<_\bP_\ba_\bi_\br_\bT_\by_\bp_\be_\b>_\b:_\b:_\bg_\be_\bt_\bT_\by_\bp_\be();\n-1086\n-1087 if(!twoIndexSets) {\n-1088 if(sendTwo) {\n-1089 send = new RemoteIndexList();\n-1090 // Create both remote index sets simultaneously\n-1091 unpackIndices(*send, *receive, noRemoteSource, sourcePairs, sourcePublish,\n-1092 destPairs, destPublish, p_in, type, &position, bufferSize);\n-1093 }else{\n-1094 // we only need one list\n-1095 unpackIndices(*receive, noRemoteSource, sourcePairs, sourcePublish,\n-1096 p_in, type, &position, bufferSize, fromOurSelf);\n-1097 send=receive;\n-1098 }\n-1099 }else{\n-1100\n-1101 int oldPos=position;\n-1102 // Two index sets received\n-1103 unpackIndices(*receive, noRemoteSource, destPairs, destPublish,\n-1104 p_in, type, &position, bufferSize, fromOurSelf);\n-1105 if(!sendTwo)\n-1106 //unpack source entries again as destination entries\n-1107 position=oldPos;\n-1108\n-1109 send = new RemoteIndexList();\n-1110 unpackIndices(*send, noRemoteDest, sourcePairs, sourcePublish,\n-1111 p_in, type, &position, bufferSize, fromOurSelf);\n-1112 }\n-1113\n-1114 if(receive->empty() && send->empty()) {\n-1115 if(send==receive) {\n-1116 delete send;\n-1117 }else{\n-1118 delete send;\n-1119 delete receive;\n-1120 }\n-1121 }else{\n-1122 remoteIndices_.insert(std::make_pair(remoteProc,\n-1123 std::make_pair(send,receive)));\n-1124 }\n-1125 }\n-1126\n-1127\n-1128 template\n-1129 template\n-1130 inline void RemoteIndices::buildRemote(bool includeSelf_)\n-1131 {\n-1132 // Processor configuration\n-1133 int rank, procs;\n-1134 MPI_Comm_rank(comm_, &rank);\n-1135 MPI_Comm_size(comm_, &procs);\n-1136\n-1137 // number of local indices to publish\n-1138 // The indices of the destination will be send.\n-1139 int sourcePublish, destPublish;\n-1140\n-1141 // Do we need to send two index sets?\n-1142 char sendTwo = (source_ != target_);\n-1143\n-1144 if(procs==1 && !(sendTwo || includeSelf_))\n-1145 // Nothing to communicate\n-1146 return;\n-1147\n-1148 sourcePublish = (ignorePublic) ? source_->size() : noPublic(*source_);\n-1149\n-1150 if(sendTwo)\n-1151 destPublish = (ignorePublic) ? target_->size() : noPublic(*target_);\n-1152 else\n-1153 // we only need to send one set of indices\n-1154 destPublish = 0;\n-1155\n-1156 int maxPublish, publish=sourcePublish+destPublish;\n-1157\n-1158 // Calculate maximum number of indices send\n-1159 MPI_Allreduce(&publish, &maxPublish, 1, MPI_INT, MPI_MAX, comm_);\n-1160\n-1161 // allocate buffers\n-1162 PairType** destPairs;\n-1163 PairType** sourcePairs = new PairType*[sourcePublish>0 ? sourcePublish :\n-1];\n-1164\n-1165 if(sendTwo)\n-1166 destPairs = new PairType*[destPublish>0 ? destPublish : 1];\n-1167 else\n-1168 destPairs=sourcePairs;\n-1169\n-1170 char** buffer = new char*[2];\n-1171 int bufferSize;\n-1172 int position=0;\n-1173 int intSize;\n-1174 int charSize;\n-1175\n-1176 // calculate buffer size\n-1177 MPI_Datatype type = _\bM_\bP_\bI_\bT_\br_\ba_\bi_\bt_\bs_\b<_\bP_\ba_\bi_\br_\bT_\by_\bp_\be_\b>_\b:_\b:_\bg_\be_\bt_\bT_\by_\bp_\be();\n-1178\n-1179 MPI_Pack_size(maxPublish, type, comm_,\n-1180 &bufferSize);\n-1181 MPI_Pack_size(1, MPI_INT, comm_,\n-1182 &intSize);\n-1183 MPI_Pack_size(1, MPI_CHAR, comm_,\n-1184 &charSize);\n-1185 // Our message will contain the following:\n-1186 // a bool whether two index sets where sent\n-1187 // the size of the source and the dest indexset,\n-1188 // then the source and destination indices\n-1189 bufferSize += 2 * intSize + charSize;\n-1190\n-1191 if(bufferSize<=0) bufferSize=1;\n-1192\n-1193 buffer[0] = new char[bufferSize];\n-1194 buffer[1] = new char[bufferSize];\n-1195\n-1196\n-1197 // pack entries into buffer[0], p_out below!\n-1198 MPI_Pack(&sendTwo, 1, MPI_CHAR, buffer[0], bufferSize, &position,\n-1199 comm_);\n-1200\n-1201 // The number of indices we send for each index set\n-1202 MPI_Pack(&sourcePublish, 1, MPI_INT, buffer[0], bufferSize, &position,\n-1203 comm_);\n-1204 MPI_Pack(&destPublish, 1, MPI_INT, buffer[0], bufferSize, &position,\n-1205 comm_);\n-1206\n-1207 // Now pack the source indices and setup the destination pairs\n-1208 packEntries(sourcePairs, *source_, buffer[0], type,\n-1209 bufferSize, &position, sourcePublish);\n-1210 // If necessary send the dest indices and setup the source pairs\n-1211 if(sendTwo)\n-1212 packEntries(destPairs, *target_, buffer[0], type,\n-1213 bufferSize, &position, destPublish);\n-1214\n-1215\n-1216 // Update remote indices for ourself\n-1217 if(sendTwo|| includeSelf_)\n-1218 unpackCreateRemote(buffer[0], sourcePairs, destPairs, rank, sourcePublish,\n-1219 destPublish, bufferSize, sendTwo, includeSelf_);\n-1220\n-1221 neighbourIds.erase(rank);\n-1222\n-1223 if(neighbourIds.size()==0)\n-1224 {\n-1225 _\bD_\bu_\bn_\be_\b:_\b:_\bd_\bv_\bv_\be_\br_\bb<::size_type size_type;\n-1261 size_type noNeighbours=neighbourIds.size();\n-1262\n-1263 // setup sends\n-1264 for(std::set::iterator neighbour=neighbourIds.begin();\n-1265 neighbour!= neighbourIds.end(); ++neighbour) {\n-1266 // Only send the information to the neighbouring processors\n-1267 MPI_Issend(buffer[0], position , MPI_PACKED, *neighbour, commTag_, comm_,\n-req++);\n-1268 }\n-1269\n-1270 //Test for received messages\n-1271\n-1272 for(size_type received=0; received \n-1313 inline void RemoteIndices::unpackIndices(RemoteIndexList& remote,\n-1314 int remoteEntries,\n-1315 PairType** local,\n-1316 int localEntries,\n-1317 char* p_in,\n-1318 MPI_Datatype type,\n-1319 int* position,\n-1320 int bufferSize,\n-1321 bool fromOurSelf)\n-1322 {\n-1323 if(remoteEntries==0)\n-1324 return;\n-1325\n-1326 PairType index;\n-1327 MPI_Unpack(p_in, bufferSize, position, &index, 1,\n-1328 type, comm_);\n-1329 GlobalIndex oldGlobal=index.global();\n-1330 int n_in=0, localIndex=0;\n-1331\n-1332 //Check if we know the global index\n-1333 while(localIndexglobal()==index.global()) {\n-1335 int oldLocalIndex=localIndex;\n-1336\n-1337 while(localIndexglobal()==index.global()) {\n-1339 if(!fromOurSelf || index.local().attribute() !=\n-1340 local[localIndex]->local().attribute())\n-1341 // if index is from us it has to have a different attribute\n-1342 remote.push_back(RemoteIndex(index.local().attribute(),\n-1343 local[localIndex]));\n-1344 localIndex++;\n-1345 }\n-1346\n-1347 // unpack next remote index\n-1348 if((++n_in) < remoteEntries) {\n-1349 MPI_Unpack(p_in, bufferSize, position, &index, 1,\n-1350 type, comm_);\n-1351 if(index.global()==oldGlobal)\n-1352 // Restart comparison for the same global indices\n-1353 localIndex=oldLocalIndex;\n-1354 else\n-1355 oldGlobal=index.global();\n-1356 }else{\n-1357 // No more received indices\n-1358 break;\n-1359 }\n-1360 continue;\n-1361 }\n-1362\n-1363 if (local[localIndex]->global()\n-1386 inline void RemoteIndices::unpackIndices(RemoteIndexList& send,\n-1387 RemoteIndexList& receive,\n-1388 int remoteEntries,\n-1389 PairType** localSource,\n-1390 int localSourceEntries,\n-1391 PairType** localDest,\n-1392 int localDestEntries,\n-1393 char* p_in,\n-1394 MPI_Datatype type,\n-1395 int* position,\n-1396 int bufferSize)\n-1397 {\n-1398 int n_in=0, sourceIndex=0, destIndex=0;\n-1399\n-1400 //Check if we know the global index\n-1401 while(n_in= than the\n-one in the unpacked index\n-1409 while(sourceIndexglobal\n-()global\n-()global\n-()==index.global())\n-1417 send.push_back(RemoteIndex(index.local().attribute(),\n-1418 localSource[sourceIndex]));\n-1419\n-1420 if(destIndex < localDestEntries && localDest[destIndex]->global() ==\n-index.global())\n-1421 receive.push_back(RemoteIndex(index.local().attribute(),\n-1422 localDest[sourceIndex]));\n-1423 }\n-1424\n-1425 }\n-1426\n-1427 template\n-_\b1_\b4_\b2_\b8 inline void _\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\bi_\bc_\be_\bs_\b<_\bT_\b,_\bA_\b>_\b:_\b:_\bf_\br_\be_\be()\n-1429 {\n-1430 auto lend = remoteIndices_.end();\n-1431 for(auto lists=remoteIndices_.begin(); lists != lend; ++lists) {\n-1432 if(lists->second.first==lists->second.second) {\n-1433 // there is only one remote index list.\n-1434 delete lists->second.first;\n-1435 }else{\n-1436 delete lists->second.first;\n-1437 delete lists->second.second;\n-1438 }\n-1439 }\n-1440 remoteIndices_.clear();\n-1441 firstBuild=true;\n-1442 }\n-1443\n-1444 template\n-_\b1_\b4_\b4_\b5 inline int _\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\bi_\bc_\be_\bs_\b<_\bT_\b,_\bA_\b>_\b:_\b:_\bn_\be_\bi_\bg_\bh_\bb_\bo_\bu_\br_\bs() const\n-1446 {\n-1447 return remoteIndices_.size();\n-1448 }\n-1449\n-1450 template\n-1451 template\n-_\b1_\b4_\b5_\b2 inline void _\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\bi_\bc_\be_\bs_\b<_\bT_\b,_\bA_\b>_\b:_\b:_\br_\be_\bb_\bu_\bi_\bl_\bd()\n-1453 {\n-1454 // Test whether a rebuild is Needed.\n-1455 if(firstBuild ||\n-1456 ignorePublic!=publicIgnored || !\n-1457 isSynced()) {\n-1458 free();\n-1459\n-1460 buildRemote(includeSelf);\n-1461\n-1462 sourceSeqNo_ = source_->seqNo();\n-1463 destSeqNo_ = target_->seqNo();\n-1464 firstBuild=false;\n-1465 publicIgnored=ignorePublic;\n-1466 }\n-1467\n-1468\n-1469 }\n-1470\n-1471 template\n-_\b1_\b4_\b7_\b2 inline bool _\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\bi_\bc_\be_\bs_\b<_\bT_\b,_\bA_\b>_\b:_\b:_\bi_\bs_\bS_\by_\bn_\bc_\be_\bd() const\n-1473 {\n-1474 return sourceSeqNo_==source_->seqNo() && destSeqNo_ ==target_->seqNo();\n-1475 }\n-1476\n-1477 template\n-1478 template\n-_\b1_\b4_\b7_\b9 _\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\be_\bx_\bL_\bi_\bs_\bt_\bM_\bo_\bd_\bi_\bf_\bi_\be_\br_\b<_\bT_\b,_\bA_\b,_\bm_\bo_\bd_\be_\b> _\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\bi_\bc_\be_\bs_\b<_\bT_\b,_\bA_\b>_\b:_\b:_\bg_\be_\bt_\bM_\bo_\bd_\bi_\bf_\bi_\be_\br(int\n-process)\n-1480 {\n-1481\n-1482 // The user are on their own now!\n-1483 // We assume they know what they are doing and just set the\n-1484 // remote indices to synced status.\n-1485 sourceSeqNo_ = source_->seqNo();\n-1486 destSeqNo_ = target_->seqNo();\n-1487\n-1488 typename RemoteIndexMap::iterator found = remoteIndices_.find(process);\n-1489\n-1490 if(found == remoteIndices_.end())\n-1491 {\n-1492 if(source_ != target_)\n-1493 found = remoteIndices_._\bi_\bn_\bs_\be_\br_\bt(found, std::make_pair(process,\n-1494 std::make_pair(new _\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\be_\bx_\bL_\bi_\bs_\bt(),\n-1495 new _\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\be_\bx_\bL_\bi_\bs_\bt())));\n-1496 else{\n-1497 _\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\be_\bx_\bL_\bi_\bs_\bt* rlist = new _\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\be_\bx_\bL_\bi_\bs_\bt();\n-1498 found = remoteIndices_.insert(found,\n-1499 std::make_pair(process,\n-1500 std::make_pair(rlist, rlist)));\n-1501 }\n-1502 }\n-1503\n-1504 firstBuild = false;\n-1505\n-1506 if(send)\n-1507 return _\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\be_\bx_\bL_\bi_\bs_\bt_\bM_\bo_\bd_\bi_\bf_\bi_\be_\br_\b<_\bT_\b,_\bA_\b,_\bm_\bo_\bd_\be_\b>(*source_, *(found-\n->second.first));\n-1508 else\n-1509 return _\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\be_\bx_\bL_\bi_\bs_\bt_\bM_\bo_\bd_\bi_\bf_\bi_\be_\br_\b<_\bT_\b,_\bA_\b,_\bm_\bo_\bd_\be_\b>(*target_, *(found-\n->second.second));\n-1510 }\n-1511\n-1512 template\n-1513 inline typename _\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\bi_\bc_\be_\bs_\b<_\bT_\b,_\bA_\b>_\b:_\b:_\bc_\bo_\bn_\bs_\bt_\b__\bi_\bt_\be_\br_\ba_\bt_\bo_\br\n-_\b1_\b5_\b1_\b4 _\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\bi_\bc_\be_\bs_\b<_\bT_\b,_\bA_\b>_\b:_\b:_\bf_\bi_\bn_\bd(int proc) const\n-1515 {\n-1516 return remoteIndices_.find(proc);\n-1517 }\n-1518\n-1519 template\n-1520 inline typename _\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\bi_\bc_\be_\bs_\b<_\bT_\b,_\bA_\b>_\b:_\b:_\bc_\bo_\bn_\bs_\bt_\b__\bi_\bt_\be_\br_\ba_\bt_\bo_\br\n-_\b1_\b5_\b2_\b1 _\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\bi_\bc_\be_\bs_\b<_\bT_\b,_\bA_\b>_\b:_\b:_\bb_\be_\bg_\bi_\bn() const\n-1522 {\n-1523 return remoteIndices_.begin();\n-1524 }\n-1525\n-1526 template\n-1527 inline typename _\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\bi_\bc_\be_\bs_\b<_\bT_\b,_\bA_\b>_\b:_\b:_\bc_\bo_\bn_\bs_\bt_\b__\bi_\bt_\be_\br_\ba_\bt_\bo_\br\n-_\b1_\b5_\b2_\b8 _\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\bi_\bc_\be_\bs_\b<_\bT_\b,_\bA_\b>_\b:_\b:_\be_\bn_\bd() const\n-1529 {\n-1530 return remoteIndices_.end();\n-1531 }\n-1532\n-1533\n-1534 template\n-_\b1_\b5_\b3_\b5 bool _\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\bi_\bc_\be_\bs_\b<_\bT_\b,_\bA_\b>_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b=_\b=(const _\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\bi_\bc_\be_\bs& ri) const\n-1536 {\n-1537 if(neighbours()!=ri._\bn_\be_\bi_\bg_\bh_\bb_\bo_\bu_\br_\bs())\n-1538 return false;\n-1539\n-1540 const auto rend = remoteIndices_.end();\n-1541\n-1542 for(auto rindex = remoteIndices_.begin(), rindex1=ri.remoteIndices_.begin\n-(); rindex!=rend; ++rindex, ++rindex1) {\n-1543 if(rindex->first != rindex1->first)\n-1544 return false;\n-1545 if(*(rindex->second.first) != *(rindex1->second.first))\n-1546 return false;\n-1547 if(*(rindex->second.second) != *(rindex1->second.second))\n-1548 return false;\n-1549 }\n-1550 return true;\n-1551 }\n-1552\n-1553 template\n-1554 _\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\be_\bx_\bL_\bi_\bs_\bt_\bM_\bo_\bd_\bi_\bf_\bi_\be_\br_\b<_\bT_\b,_\bA_\b,_\bm_\bo_\bd_\be_\b>_\b:_\b:_\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\be_\bx_\bL_\bi_\bs_\bt_\bM_\bo_\bd_\bi_\bf_\bi_\be_\br(const\n-_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt& indexSet,\n-1555 RemoteIndexList& rList)\n-1556 : rList_(&rList), indexSet_(&indexSet), iter_(rList.beginModify()), end_\n-(rList.end()), first_(true)\n-1557 {\n-1558 if(MODIFYINDEXSET) {\n-1559 assert(indexSet_);\n-1560 for(ConstIterator iter=iter_; iter != end_; ++iter)\n-1561 glist_.push_back(iter->localIndexPair().global());\n-1562 giter_ = glist_.beginModify();\n-1563 }\n-1564 }\n-1565\n-1566 template\n-_\b1_\b5_\b6_\b7 _\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\be_\bx_\bL_\bi_\bs_\bt_\bM_\bo_\bd_\bi_\bf_\bi_\be_\br_\b<_\bT_\b,_\bA_\b,_\bm_\bo_\bd_\be_\b>_\b:_\b:_\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\be_\bx_\bL_\bi_\bs_\bt_\bM_\bo_\bd_\bi_\bf_\bi_\be_\br(const\n-_\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\be_\bx_\bL_\bi_\bs_\bt_\bM_\bo_\bd_\bi_\bf_\bi_\be_\br_\b<_\bT_\b,_\bA_\b,_\bm_\bo_\bd_\be_\b>& other)\n-1568 : rList_(other.rList_), indexSet_(other.indexSet_),\n-1569 glist_(other.glist_), iter_(other.iter_), giter_(other.giter_), end_\n-(other.end_),\n-1570 first_(other.first_), last_(other.last_)\n-1571 {}\n-1572\n-1573 template\n-_\b1_\b5_\b7_\b4 inline void _\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\be_\bx_\bL_\bi_\bs_\bt_\bM_\bo_\bd_\bi_\bf_\bi_\be_\br_\b<_\bT_\b,_\bA_\b,_\bm_\bo_\bd_\be_\b>_\b:_\b:_\br_\be_\bp_\ba_\bi_\br_\bL_\bo_\bc_\ba_\bl_\bI_\bn_\bd_\be_\bx_\bP_\bo_\bi_\bn_\bt_\be_\br_\bs()\n-1575 {\n-1576 if(MODIFYINDEXSET) {\n-1577 // repair pointers to local index set.\n-1578#ifdef DUNE_ISTL_WITH_CHECKING\n-1579 if(indexSet_->state()!=_\bG_\bR_\bO_\bU_\bN_\bD)\n-1580 _\bD_\bU_\bN_\bE_\b__\bT_\bH_\bR_\bO_\bW(_\bI_\bn_\bv_\ba_\bl_\bi_\bd_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt_\bS_\bt_\ba_\bt_\be, \"Index has to be in ground mode for\n-repairing pointers to indices\");\n-1581#endif\n-1582 auto giter = glist_.begin();\n-1583 auto index = indexSet_->begin();\n-1584\n-1585 for(auto iter=rList_->begin(); iter != end_; ++iter) {\n-1586 while(index->global()<*giter) {\n-1587 ++index;\n-1588#ifdef DUNE_ISTL_WITH_CHECKING\n-1589 if(index == indexSet_->end())\n-1590 _\bD_\bU_\bN_\bE_\b__\bT_\bH_\bR_\bO_\bW(_\bI_\bn_\bv_\ba_\bl_\bi_\bd_\bP_\bo_\bs_\bi_\bt_\bi_\bo_\bn, \"No such global index in set!\");\n-1591#endif\n-1592 }\n-1593\n-1594#ifdef DUNE_ISTL_WITH_CHECKING\n-1595 if(index->global() != *giter)\n-1596 _\bD_\bU_\bN_\bE_\b__\bT_\bH_\bR_\bO_\bW(_\bI_\bn_\bv_\ba_\bl_\bi_\bd_\bP_\bo_\bs_\bi_\bt_\bi_\bo_\bn, \"No such global index in set!\");\n-1597#endif\n-1598 iter->localIndex_ = &(*index);\n-1599 }\n-1600 }\n-1601 }\n-1602\n-1603 template\n-_\b1_\b6_\b0_\b4 inline void _\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\be_\bx_\bL_\bi_\bs_\bt_\bM_\bo_\bd_\bi_\bf_\bi_\be_\br_\b<_\bT_\b,_\bA_\b,_\bm_\bo_\bd_\be_\b>_\b:_\b:_\bi_\bn_\bs_\be_\br_\bt(const _\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\be_\bx&\n-index)\n-1605 {\n-1606 static_assert(!mode,\"Not allowed if the mode indicates that new indices\"\n-1607 \"might be added to the underlying index set. Use \"\n-1608 \"insert(const RemoteIndex&, const GlobalIndex&) instead\");\n-1609\n-1610#ifdef DUNE_ISTL_WITH_CHECKING\n-1611 if(!first_ && index._\bl_\bo_\bc_\ba_\bl_\bI_\bn_\bd_\be_\bx_\bP_\ba_\bi_\br()._\bg_\bl_\bo_\bb_\ba_\bl()localIndexPair().global() <\n-index._\bl_\bo_\bc_\ba_\bl_\bI_\bn_\bd_\be_\bx_\bP_\ba_\bi_\br()._\bg_\bl_\bo_\bb_\ba_\bl()) {\n-1616 ++iter_;\n-1617 }\n-1618\n-1619 // No duplicate entries allowed\n-1620 assert(iter_==end_ || iter_->localIndexPair().global() !=\n-index._\bl_\bo_\bc_\ba_\bl_\bI_\bn_\bd_\be_\bx_\bP_\ba_\bi_\br()._\bg_\bl_\bo_\bb_\ba_\bl());\n-1621 iter_.insert(index);\n-1622 last_ = index._\bl_\bo_\bc_\ba_\bl_\bI_\bn_\bd_\be_\bx_\bP_\ba_\bi_\br()._\bg_\bl_\bo_\bb_\ba_\bl();\n-1623 first_ = false;\n-1624 }\n-1625\n-1626 template\n-_\b1_\b6_\b2_\b7 inline void _\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\be_\bx_\bL_\bi_\bs_\bt_\bM_\bo_\bd_\bi_\bf_\bi_\be_\br_\b<_\bT_\b,_\bA_\b,_\bm_\bo_\bd_\be_\b>_\b:_\b:_\bi_\bn_\bs_\be_\br_\bt(const _\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\be_\bx&\n-index, const _\bG_\bl_\bo_\bb_\ba_\bl_\bI_\bn_\bd_\be_\bx& global)\n-1628 {\n-1629 static_assert(mode,\"Not allowed if the mode indicates that no new indices\"\n-1630 \"might be added to the underlying index set. Use \"\n-1631 \"insert(const RemoteIndex&) instead\");\n-1632#ifdef DUNE_ISTL_WITH_CHECKING\n-1633 if(!first_ && globallocalIndexPair().global() != global);\n-1644 iter_.insert(index);\n-1645 giter_.insert(global);\n-1646\n-1647 last_ = global;\n-1648 first_ = false;\n-1649 }\n-1650\n-1651 template\n-_\b1_\b6_\b5_\b2 bool _\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\be_\bx_\bL_\bi_\bs_\bt_\bM_\bo_\bd_\bi_\bf_\bi_\be_\br_\b<_\bT_\b,_\bA_\b,_\bm_\bo_\bd_\be_\b>_\b:_\b:_\br_\be_\bm_\bo_\bv_\be(const _\bG_\bl_\bo_\bb_\ba_\bl_\bI_\bn_\bd_\be_\bx& global)\n-1653 {\n-1654#ifdef DUNE_ISTL_WITH_CHECKING\n-1655 if(!first_ && globallocalIndexPair().global() < global)\n-1674 ++iter_;\n-1675\n-1676 if(iter_->localIndexPair().global()==global) {\n-1677 iter_.remove();\n-1678 found = true;\n-1679 }\n-1680 }\n-1681\n-1682 last_ = global;\n-1683 first_ = false;\n-1684 return found;\n-1685 }\n-1686\n-1687 template\n-1688 template\n-_\b1_\b6_\b8_\b9 inline typename _\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\bi_\bc_\be_\bs_\b<_\bT_\b,_\bA_\b>_\b:_\b:_\bC_\bo_\bl_\bl_\be_\bc_\bt_\bi_\bv_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bT\n-_\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\bi_\bc_\be_\bs_\b<_\bT_\b,_\bA_\b>_\b:_\b:_\bi_\bt_\be_\br_\ba_\bt_\bo_\br() const\n-1690 {\n-1691 return _\bC_\bo_\bl_\bl_\be_\bc_\bt_\bi_\bv_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b<_\bT_\b,_\bA_\b>(remoteIndices_, send);\n-1692 }\n-1693\n-1694 template\n-_\b1_\b6_\b9_\b5 inline MPI_Comm _\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\bi_\bc_\be_\bs_\b<_\bT_\b,_\bA_\b>_\b:_\b:_\bc_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bo_\br() const\n-1696 {\n-1697 return comm_;\n-1698\n-1699 }\n-1700\n-1701 template\n-_\b1_\b7_\b0_\b2 _\bC_\bo_\bl_\bl_\be_\bc_\bt_\bi_\bv_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b<_\bT_\b,_\bA_\b>_\b:_\b:_\bC_\bo_\bl_\bl_\be_\bc_\bt_\bi_\bv_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br(const _\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\be_\bx_\bM_\ba_\bp& pmap,\n-bool send)\n-1703 {\n-1704\n-1705 const auto end = pmap.end();\n-1706 for(auto process = pmap.begin(); process != end; ++process) {\n-1707 const _\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\be_\bx_\bL_\bi_\bs_\bt* list = send ? process->second.first : process-\n->second.second;\n-1708 using ri_iterator = typename _\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\be_\bx_\bL_\bi_\bs_\bt_\b:_\b:_\bc_\bo_\bn_\bs_\bt_\b__\bi_\bt_\be_\br_\ba_\bt_\bo_\br;\n-1709 map_.insert(std::make_pair(process->first,\n-1710 std::pair(list->_\bb_\be_\bg_\bi_\bn(), list->_\be_\bn_\bd())));\n-1711 }\n-1712 }\n-1713\n-1714 template\n-_\b1_\b7_\b1_\b5 inline void _\bC_\bo_\bl_\bl_\be_\bc_\bt_\bi_\bv_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b<_\bT_\b,_\bA_\b>_\b:_\b:_\ba_\bd_\bv_\ba_\bn_\bc_\be(const GlobalIndex& index)\n-1716 {\n-1717 const auto end = map_.end();\n-1718\n-1719 for(auto iter = map_.begin(); iter != end;) {\n-1720 // Step the iterator until we are >= index\n-1721 typename _\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\be_\bx_\bL_\bi_\bs_\bt_\b:_\b:_\bc_\bo_\bn_\bs_\bt_\b__\bi_\bt_\be_\br_\ba_\bt_\bo_\br current = iter->second.first;\n-1722 typename _\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\be_\bx_\bL_\bi_\bs_\bt_\b:_\b:_\bc_\bo_\bn_\bs_\bt_\b__\bi_\bt_\be_\br_\ba_\bt_\bo_\br rend = iter->second.second;\n-1723 _\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\be_\bx remoteIndex;\n-1724 if(current != rend)\n-1725 remoteIndex = *current;\n-1726\n-1727 while(iter->second.first!=iter->second.second && iter->second.first-\n->localIndexPair().global()second.first);\n-1729\n-1730 // erase from the map if there are no more entries.\n-1731 if(iter->second.first == iter->second.second)\n-1732 map_.erase(iter++);\n-1733 else{\n-1734 ++iter;\n-1735 }\n-1736 }\n-1737 index_=index;\n-1738 noattribute=true;\n-1739 }\n-1740\n-1741 template\n-_\b1_\b7_\b4_\b2 inline void _\bC_\bo_\bl_\bl_\be_\bc_\bt_\bi_\bv_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b<_\bT_\b,_\bA_\b>_\b:_\b:_\ba_\bd_\bv_\ba_\bn_\bc_\be(const GlobalIndex& index,\n-1743 const Attribute& attribute)\n-1744 {\n-1745 const auto end = map_.end();\n-1746\n-1747 for(auto iter = map_.begin(); iter != end;) {\n-1748 // Step the iterator until we are >= index\n-1749 typename _\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\be_\bx_\bL_\bi_\bs_\bt_\b:_\b:_\bc_\bo_\bn_\bs_\bt_\b__\bi_\bt_\be_\br_\ba_\bt_\bo_\br current = iter->second.first;\n-1750 typename _\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\be_\bx_\bL_\bi_\bs_\bt_\b:_\b:_\bc_\bo_\bn_\bs_\bt_\b__\bi_\bt_\be_\br_\ba_\bt_\bo_\br rend = iter->second.second;\n-1751 _\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\be_\bx remoteIndex;\n-1752 if(current != rend)\n-1753 remoteIndex = *current;\n-1754\n-1755 // Move to global index or bigger\n-1756 while(iter->second.first!=iter->second.second && iter->second.first-\n->localIndexPair().global()second.first);\n-1758\n-1759 // move to attribute or bigger\n-1760 while(iter->second.first!=iter->second.second\n-1761 && iter->second.first->localIndexPair().global()==index\n-1762 && iter->second.first->localIndexPair().local().attribute()second.first);\n-1764\n-1765 // erase from the map if there are no more entries.\n-1766 if(iter->second.first == iter->second.second)\n-1767 map_.erase(iter++);\n-1768 else{\n-1769 ++iter;\n-1770 }\n-1771 }\n-1772 index_=index;\n-1773 attribute_=attribute;\n-1774 noattribute=false;\n-1775 }\n-1776\n-1777 template\n-_\b1_\b7_\b7_\b8 inline _\bC_\bo_\bl_\bl_\be_\bc_\bt_\bi_\bv_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b<_\bT_\b,_\bA_\b>& _\bC_\bo_\bl_\bl_\be_\bc_\bt_\bi_\bv_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b<_\bT_\b,_\bA_\b>_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b+_\b+()\n-1779 {\n-1780 const auto end = map_._\be_\bn_\bd();\n-1781\n-1782 for(auto iter = map_.begin(); iter != end;) {\n-1783 // Step the iterator until we are >= index\n-1784 auto current = iter->second.first;\n-1785 auto rend = iter->second.second;\n-1786\n-1787 // move all iterators pointing to the current global index to next value\n-1788 if(iter->second.first->localIndexPair().global()==index_ &&\n-1789 (noattribute || iter->second.first->localIndexPair().local().attribute()\n-== attribute_))\n-1790 ++(iter->second.first);\n-1791\n-1792 // erase from the map if there are no more entries.\n-1793 if(iter->second.first == iter->second.second)\n-1794 map_.erase(iter++);\n-1795 else{\n-1796 ++iter;\n-1797 }\n-1798 }\n-1799 return *this;\n-1800 }\n-1801\n-1802 template\n-_\b1_\b8_\b0_\b3 inline bool _\bC_\bo_\bl_\bl_\be_\bc_\bt_\bi_\bv_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b<_\bT_\b,_\bA_\b>_\b:_\b:_\be_\bm_\bp_\bt_\by() const\n-1804 {\n-1805 return map_.empty();\n-1806 }\n-1807\n-1808 template\n-1809 inline typename _\bC_\bo_\bl_\bl_\be_\bc_\bt_\bi_\bv_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b<_\bT_\b,_\bA_\b>_\b:_\b:_\bi_\bt_\be_\br_\ba_\bt_\bo_\br\n-_\b1_\b8_\b1_\b0 _\bC_\bo_\bl_\bl_\be_\bc_\bt_\bi_\bv_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b<_\bT_\b,_\bA_\b>_\b:_\b:_\bb_\be_\bg_\bi_\bn()\n-1811 {\n-1812 if(noattribute)\n-1813 return _\bi_\bt_\be_\br_\ba_\bt_\bo_\br(map_.begin(), map_.end(), index_);\n-1814 else\n-1815 return _\bi_\bt_\be_\br_\ba_\bt_\bo_\br(map_.begin(), map_.end(), index_,\n-1816 attribute_);\n-1817 }\n-1818\n-1819 template\n-1820 inline typename _\bC_\bo_\bl_\bl_\be_\bc_\bt_\bi_\bv_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b<_\bT_\b,_\bA_\b>_\b:_\b:_\bi_\bt_\be_\br_\ba_\bt_\bo_\br\n-_\b1_\b8_\b2_\b1 _\bC_\bo_\bl_\bl_\be_\bc_\bt_\bi_\bv_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b<_\bT_\b,_\bA_\b>_\b:_\b:_\be_\bn_\bd()\n-1822 {\n-1823 return _\bi_\bt_\be_\br_\ba_\bt_\bo_\br(map_.end(), map_.end(), index_);\n-1824 }\n-1825\n-1826 template\n-_\b1_\b8_\b2_\b7 inline std::ostream& _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b<_\b<(std::ostream& os, const\n-_\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\be_\bx_\b<_\bT_\bG_\b,_\bT_\bA_\b>& index)\n-1828 {\n-1829 os<<\"[global=\"<\n-_\b1_\b8_\b3_\b4 inline std::ostream& _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b<_\b<(std::ostream& os, const\n-_\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\bi_\bc_\be_\bs_\b<_\bT_\b,_\bA_\b>& indices)\n-1835 {\n-1836 int rank;\n-1837 MPI_Comm_rank(indices.comm_, &rank);\n-1838 const auto rend = indices.remoteIndices_.end();\n-1839\n-1840 for(auto rindex = indices.remoteIndices_.begin(); rindex!=rend; ++rindex)\n-{\n-1841 os<first<<\":\";\n-1842\n-1843 if(!rindex->second.first->empty()) {\n-1844 os<<\" send:\";\n-1845\n-1846 const auto send= rindex->second.first->end();\n-1847\n-1848 for(auto index = rindex->second.first->begin();\n-1849 index != send; ++index)\n-1850 os<<*index<<\" \";\n-1851 os<second.second->empty()) {\n-1854 os<first<<\": \"<<\"receive: \";\n-1855\n-1856 for(const auto& index : *(rindex->second.second))\n-1857 os << index << \" \";\n-1858 }\n-1859 os<_\b:_\b:_\bc_\bo_\bn_\bs_\bt_\b__\bi_\bt_\be_\br_\ba_\bt_\bo_\br\n-SLListConstIterator< RemoteIndex, Allocator > const_iterator\n-The constant iterator of the list.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn sllist.hh:74\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bL_\bL_\bi_\bs_\bt_\b<_\b _\bG_\bl_\bo_\bb_\ba_\bl_\bI_\bn_\bd_\be_\bx_\b,_\b _\bA_\bl_\bl_\bo_\bc_\ba_\bt_\bo_\br_\b _\b>_\b:_\b:_\bM_\bo_\bd_\bi_\bf_\by_\bI_\bt_\be_\br_\ba_\bt_\bo_\br\n-SLListModifyIterator< GlobalIndex, Allocator > ModifyIterator\n-The type of the iterator capable of deletion and insertion.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn sllist.hh:103\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bL_\bL_\bi_\bs_\bt_\b:_\b:_\bb_\be_\bg_\bi_\bn\n-iterator begin()\n-Get an iterator pointing to the first element in the list.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn sllist.hh:762\n-_\bD_\bu_\bn_\be_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b<_\b<\n-std::ostream & operator<<(std::ostream &s, const bigunsignedint< k > &x)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bigunsignedint.hh:278\n _\bD_\bU_\bN_\bE_\b__\bT_\bH_\bR_\bO_\bW\n #define DUNE_THROW(E, m)\n D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn exceptions.hh:218\n-_\bD_\bu_\bn_\be_\b:_\b:_\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\be_\bx_\bL_\bi_\bs_\bt_\bM_\bo_\bd_\bi_\bf_\bi_\be_\br_\b:_\b:_\br_\be_\bp_\ba_\bi_\br_\bL_\bo_\bc_\ba_\bl_\bI_\bn_\bd_\be_\bx_\bP_\bo_\bi_\bn_\bt_\be_\br_\bs\n-void repairLocalIndexPointers()\n-Repair the pointers to the local index pairs.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn remoteindices.hh:1574\n-_\bD_\bu_\bn_\be_\b:_\b:_\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\be_\bx_\b:_\b:_\ba_\bt_\bt_\br_\bi_\bb_\bu_\bt_\be\n-const Attribute attribute() const\n-Get the attribute of the index on the remote process.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn remoteindices.hh:945\n-_\bD_\bu_\bn_\be_\b:_\b:_\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\bi_\bc_\be_\bs_\b:_\b:_\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\bi_\bc_\be_\bs\n-RemoteIndices()\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn remoteindices.hh:976\n-_\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bl_\bl_\be_\bc_\bt_\bi_\bv_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b+_\b+\n-CollectiveIterator & operator++()\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn remoteindices.hh:1778\n-_\bD_\bu_\bn_\be_\b:_\b:_\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\bi_\bc_\be_\bs_\b:_\b:_\bs_\be_\bt_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt_\bs\n-void setIndexSets(const ParallelIndexSet &source, const ParallelIndexSet\n-&destination, const MPI_Comm &comm, const std::vector< int > &neighbours=std::\n-vector< int >())\n-Set the index sets and communicator we work with.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn remoteindices.hh:983\n-_\bD_\bu_\bn_\be_\b:_\b:_\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\bi_\bc_\be_\bs_\b:_\b:_\bf_\br_\be_\be\n-void free()\n-Free the index lists.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn remoteindices.hh:1428\n-_\bD_\bu_\bn_\be_\b:_\b:_\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\be_\bx_\bL_\bi_\bs_\bt_\bM_\bo_\bd_\bi_\bf_\bi_\be_\br_\b:_\b:_\bi_\bn_\bs_\be_\br_\bt\n-void insert(const RemoteIndex &index)\n-Insert an index to the list.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn remoteindices.hh:1604\n-_\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bl_\bl_\be_\bc_\bt_\bi_\bv_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\be_\bn_\bd\n-iterator end()\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn remoteindices.hh:1821\n-_\bD_\bu_\bn_\be_\b:_\b:_\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\bi_\bc_\be_\bs_\b:_\b:_\br_\be_\bb_\bu_\bi_\bl_\bd\n-void rebuild()\n-Rebuilds the set of remote indices.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn remoteindices.hh:1452\n-_\bD_\bu_\bn_\be_\b:_\b:_\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\be_\bx_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b=_\b=\n-bool operator==(const RemoteIndex &ri) const\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn remoteindices.hh:933\n-_\bD_\bu_\bn_\be_\b:_\b:_\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\bi_\bc_\be_\bs_\b:_\b:_\bc_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bo_\br\n-MPI_Comm communicator() const\n-Get the mpi communicator used.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn remoteindices.hh:1695\n-_\bD_\bu_\bn_\be_\b:_\b:_\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\bi_\bc_\be_\bs_\b:_\b:_\bi_\bt_\be_\br_\ba_\bt_\bo_\br\n-CollectiveIteratorT iterator() const\n-Get an iterator for collectively iterating over the remote indices of all\n-remote processes.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn remoteindices.hh:1689\n-_\bD_\bu_\bn_\be_\b:_\b:_\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\bi_\bc_\be_\bs_\b:_\b:_\bs_\be_\bt_\bI_\bn_\bc_\bl_\bu_\bd_\be_\bS_\be_\bl_\bf\n-void setIncludeSelf(bool includeSelf)\n-Tell whether sending from indices of the processor to other indices on the same\n-processor is enabled ...\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn remoteindices.hh:970\n-_\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bl_\bl_\be_\bc_\bt_\bi_\bv_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\bC_\bo_\bl_\bl_\be_\bc_\bt_\bi_\bv_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br\n-CollectiveIterator(const RemoteIndexMap &map_, bool send)\n-Constructor.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn remoteindices.hh:1702\n-_\bD_\bu_\bn_\be_\b:_\b:_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt_\b:_\b:_\bb_\be_\bg_\bi_\bn\n-iterator begin()\n-Get an iterator over the indices positioned at the first index.\n-_\bD_\bu_\bn_\be_\b:_\b:_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt_\b:_\b:_\be_\bn_\bd\n-iterator end()\n-Get an iterator over the indices positioned after the last index.\n-_\bD_\bu_\bn_\be_\b:_\b:_\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\bi_\bc_\be_\bs_\b:_\b:_\be_\bn_\bd\n-const_iterator end() const\n-Get an iterator over all remote index lists.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn remoteindices.hh:1528\n-_\bD_\bu_\bn_\be_\b:_\b:_\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\bi_\bc_\be_\bs_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b=_\b=\n-bool operator==(const RemoteIndices &ri) const\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn remoteindices.hh:1535\n-_\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bl_\bl_\be_\bc_\bt_\bi_\bv_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\be_\bm_\bp_\bt_\by\n-bool empty() const\n-Checks whether there are still iterators in the map.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn remoteindices.hh:1803\n-_\bD_\bu_\bn_\be_\b:_\b:_\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\bi_\bc_\be_\bs_\b:_\b:_\bg_\be_\bt_\bM_\bo_\bd_\bi_\bf_\bi_\be_\br\n-RemoteIndexListModifier< T, A, mode > getModifier(int process)\n-Get a modifier for a remote index list.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn remoteindices.hh:1479\n-_\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bl_\bl_\be_\bc_\bt_\bi_\bv_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\ba_\bd_\bv_\ba_\bn_\bc_\be\n-void advance(const GlobalIndex &global)\n-Advances all underlying iterators.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn remoteindices.hh:1715\n-_\bD_\bu_\bn_\be_\b:_\b:_\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\be_\bx_\b:_\b:_\bl_\bo_\bc_\ba_\bl_\bI_\bn_\bd_\be_\bx_\bP_\ba_\bi_\br\n-const PairType & localIndexPair() const\n-Get the corresponding local index pair.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn remoteindices.hh:951\n-_\bD_\bu_\bn_\be_\b:_\b:_\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\bi_\bc_\be_\bs_\b:_\b:_\bs_\bo_\bu_\br_\bc_\be_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt\n-const ParallelIndexSet & sourceIndexSet() const\n-Get the index set at the source.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn remoteindices.hh:998\n-_\bD_\bu_\bn_\be_\b:_\b:_\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\bi_\bc_\be_\bs_\b:_\b:_\b~_\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\bi_\bc_\be_\bs\n-~RemoteIndices()\n-Destructor.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn remoteindices.hh:1013\n-_\bD_\bu_\bn_\be_\b:_\b:_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt_\b:_\b:_\bL_\bo_\bc_\ba_\bl_\bI_\bn_\bd_\be_\bx\n-TL LocalIndex\n-The type of the local index, e.g. ParallelLocalIndex.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn indexset.hh:239\n-_\bD_\bu_\bn_\be_\b:_\b:_\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\be_\bx_\bL_\bi_\bs_\bt_\bM_\bo_\bd_\bi_\bf_\bi_\be_\br_\b:_\b:_\br_\be_\bm_\bo_\bv_\be\n-bool remove(const GlobalIndex &global)\n-Remove a remote index.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn remoteindices.hh:1652\n-_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bd_\be_\bx_\bP_\ba_\bi_\br_\b:_\b:_\bg_\bl_\bo_\bb_\ba_\bl\n-const GlobalIndex & global() const\n-Get the global index.\n-_\bD_\bu_\bn_\be_\b:_\b:_\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\be_\bx_\b:_\b:_\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\be_\bx\n-RemoteIndex()\n-Parameterless Constructor.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn remoteindices.hh:929\n-_\bD_\bu_\bn_\be_\b:_\b:_\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\bi_\bc_\be_\bs_\b:_\b:_\bn_\be_\bi_\bg_\bh_\bb_\bo_\bu_\br_\bs\n-int neighbours() const\n-Get the number of processors we share indices with.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn remoteindices.hh:1445\n-_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bd_\be_\bx_\bP_\ba_\bi_\br_\b:_\b:_\bl_\bo_\bc_\ba_\bl\n-LocalIndex & local()\n-Get the local index.\n-_\bD_\bu_\bn_\be_\b:_\b:_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt_\b:_\b:_\bG_\bl_\bo_\bb_\ba_\bl_\bI_\bn_\bd_\be_\bx\n-TG GlobalIndex\n-the type of the global index. This type has to provide at least a operator< for\n-sorting.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn indexset.hh:226\n-_\bD_\bu_\bn_\be_\b:_\b:_\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\bi_\bc_\be_\bs_\b:_\b:_\bd_\be_\bs_\bt_\bi_\bn_\ba_\bt_\bi_\bo_\bn_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt\n-const ParallelIndexSet & destinationIndexSet() const\n-Get the index set at destination.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn remoteindices.hh:1006\n-_\bD_\bu_\bn_\be_\b:_\b:_\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\bi_\bc_\be_\bs_\b:_\b:_\bf_\bi_\bn_\bd\n-const_iterator find(int proc) const\n-Find an iterator over the remote index lists of a specific process.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn remoteindices.hh:1514\n-_\bD_\bu_\bn_\be_\b:_\b:_\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\bi_\bc_\be_\bs_\b:_\b:_\bi_\bs_\bS_\by_\bn_\bc_\be_\bd\n-bool isSynced() const\n-Checks whether the remote indices are synced with the indexsets.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn remoteindices.hh:1472\n-_\bD_\bu_\bn_\be_\b:_\b:_\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\be_\bx_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b!_\b=\n-bool operator!=(const RemoteIndex &ri) const\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn remoteindices.hh:939\n-_\bD_\bu_\bn_\be_\b:_\b:_\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\bi_\bc_\be_\bs_\b:_\b:_\bb_\be_\bg_\bi_\bn\n-const_iterator begin() const\n-Get an iterator over all remote index lists.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn remoteindices.hh:1521\n-_\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bl_\bl_\be_\bc_\bt_\bi_\bv_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\bb_\be_\bg_\bi_\bn\n-iterator begin()\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn remoteindices.hh:1810\n-_\bD_\bu_\bn_\be_\b:_\b:_\bG_\bR_\bO_\bU_\bN_\bD\n-@ GROUND\n-The default mode. Indicates that the index set is ready to be used.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn indexset.hh:186\n-_\bD_\bu_\bn_\be_\b:_\b:_\bd_\bv_\bv_\be_\br_\bb\n-DVVerbType dvverb(std::cout)\n-stream for very verbose output.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn stdstreams.hh:96\n-_\bs_\bt_\bd\n-STL namespace.\n _\bD_\bu_\bn_\be\n Dune namespace.\n D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn alignedallocator.hh:13\n-_\bD_\bu_\bn_\be_\b:_\b:_\bs_\bi_\bz_\be\n-constexpr std::integral_constant< std::size_t, sizeof...(II)> size(std::\n-integer_sequence< T, II... >)\n-Return the size of the sequence.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn integersequence.hh:75\n+_\bD_\bu_\bn_\be_\b:_\b:_\bg_\be_\bt_\bM_\bP_\bI_\bD_\ba_\bt_\ba\n+auto getMPIData(T &t)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mpidata.hh:44\n _\bD_\bu_\bn_\be_\b:_\b:_\bM_\bP_\bI_\bT_\br_\ba_\bi_\bt_\bs\n A traits class describing the mapping of types onto MPI_Datatypes.\n D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mpitraits.hh:41\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\bP_\bI_\bT_\br_\ba_\bi_\bt_\bs_\b:_\b:_\bg_\be_\bt_\bT_\by_\bp_\be\n-static MPI_Datatype getType()\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mpitraits.hh:48\n-_\bD_\bu_\bn_\be_\b:_\b:_\bR_\ba_\bn_\bg_\be_\bE_\br_\br_\bo_\br\n-Default exception class for range errors.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn exceptions.hh:254\n-_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bd_\be_\bx_\bP_\ba_\bi_\br\n-A pair consisting of a global and local index.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn indexset.hh:85\n-_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bv_\ba_\bl_\bi_\bd_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt_\bS_\bt_\ba_\bt_\be\n-Exception indicating that the index set is not in the expected state.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn indexset.hh:205\n-_\bD_\bu_\bn_\be_\b:_\b:_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt\n-Manager class for the mapping between local indices and globally unique\n-indices.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn indexset.hh:218\n-_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bd_\bi_\bc_\be_\bs_\bS_\by_\bn_\bc_\be_\br\n-Class for recomputing missing indices of a distributed index set.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn indicessyncer.hh:45\n-_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bt_\be_\br_\bf_\ba_\bc_\be_\bB_\bu_\bi_\bl_\bd_\be_\br\n-Base class of all classes representing a communication interface.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn parallel/interface.hh:44\n-_\bD_\bu_\bn_\be_\b:_\b:_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bL_\bo_\bc_\ba_\bl_\bI_\bn_\bd_\be_\bx\n-An index present on the local process with an additional attribute flag.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn plocalindex.hh:52\n-_\bD_\bu_\bn_\be_\b:_\b:_\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\bi_\bc_\be_\bs\n-The indices present on remote processes.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn remoteindices.hh:190\n-_\bD_\bu_\bn_\be_\b:_\b:_\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\bi_\bc_\be_\bs_\b:_\b:_\bg_\be_\bt_\bN_\be_\bi_\bg_\bh_\bb_\bo_\bu_\br_\bs\n-const std::set< int > & getNeighbours() const\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn remoteindices.hh:308\n-_\bD_\bu_\bn_\be_\b:_\b:_\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\bi_\bc_\be_\bs_\b:_\b:_\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\be_\bx\n-Dune::RemoteIndex< GlobalIndex, Attribute > RemoteIndex\n-Type of the remote indices we manage.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn remoteindices.hh:232\n-_\bD_\bu_\bn_\be_\b:_\b:_\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\bi_\bc_\be_\bs_\b:_\b:_\bf_\bi_\bl_\bl_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt_\bH_\bo_\bl_\be_\bs\n-friend void fillIndexSetHoles(const G &graph, Dune::\n-OwnerOverlapCopyCommunication< T1, T2 > &oocomm)\n-_\bD_\bu_\bn_\be_\b:_\b:_\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\bi_\bc_\be_\bs_\b:_\b:_\br_\be_\bp_\ba_\bi_\br_\bL_\bo_\bc_\ba_\bl_\bI_\bn_\bd_\be_\bx_\bP_\bo_\bi_\bn_\bt_\be_\br_\bs\n-friend void repairLocalIndexPointers(std::map< int, SLList< std::pair< typename\n-T1::GlobalIndex, typename T1::LocalIndex::Attribute >, A2 > > &, RemoteIndices<\n-T1, A1 > &, const T1 &)\n-_\bD_\bu_\bn_\be_\b:_\b:_\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\bi_\bc_\be_\bs_\b:_\b:_\bG_\bl_\bo_\bb_\ba_\bl_\bI_\bn_\bd_\be_\bx\n-ParallelIndexSet::GlobalIndex GlobalIndex\n-The type of the global index.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn remoteindices.hh:216\n-_\bD_\bu_\bn_\be_\b:_\b:_\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\bi_\bc_\be_\bs_\b:_\b:_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt\n-T ParallelIndexSet\n-Type of the index set we use, e.g. ParallelLocalIndexSet.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn remoteindices.hh:207\n-_\bD_\bu_\bn_\be_\b:_\b:_\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\bi_\bc_\be_\bs_\b:_\b:_\bA_\bt_\bt_\br_\bi_\bb_\bu_\bt_\be\n-LocalIndex::Attribute Attribute\n-The type of the attribute.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn remoteindices.hh:227\n-_\bD_\bu_\bn_\be_\b:_\b:_\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\bi_\bc_\be_\bs_\b:_\b:_\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\be_\bx_\bM_\ba_\bp\n-std::map< int, std::pair< RemoteIndexList *, RemoteIndexList * > >\n-RemoteIndexMap\n-The type of the map from rank to remote index list.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn remoteindices.hh:246\n-_\bD_\bu_\bn_\be_\b:_\b:_\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\bi_\bc_\be_\bs_\b:_\b:_\bs_\be_\bt_\bN_\be_\bi_\bg_\bh_\bb_\bo_\bu_\br_\bs\n-void setNeighbours(const C &neighbours)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn remoteindices.hh:301\n-_\bD_\bu_\bn_\be_\b:_\b:_\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\bi_\bc_\be_\bs_\b:_\b:_\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\be_\bx_\bL_\bi_\bs_\bt\n-Dune::SLList< RemoteIndex, Allocator > RemoteIndexList\n-The type of the remote index list.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn remoteindices.hh:242\n-_\bD_\bu_\bn_\be_\b:_\b:_\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\bi_\bc_\be_\bs_\b:_\b:_\bC_\bo_\bl_\bl_\be_\bc_\bt_\bi_\bv_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bT\n-CollectiveIterator< T, A > CollectiveIteratorT\n-The type of the collective iterator over all remote indices.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn remoteindices.hh:211\n-_\bD_\bu_\bn_\be_\b:_\b:_\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\bi_\bc_\be_\bs_\b:_\b:_\bA_\bl_\bl_\bo_\bc_\ba_\bt_\bo_\br\n-typename std::allocator_traits< A >::template rebind_alloc< RemoteIndex >\n-Allocator\n-The type of the allocator for the remote index list.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn remoteindices.hh:238\n-_\bD_\bu_\bn_\be_\b:_\b:_\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\bi_\bc_\be_\bs_\b:_\b:_\bL_\bo_\bc_\ba_\bl_\bI_\bn_\bd_\be_\bx\n-ParallelIndexSet::LocalIndex LocalIndex\n-The type of the local index.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn remoteindices.hh:222\n-_\bD_\bu_\bn_\be_\b:_\b:_\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\bi_\bc_\be_\bs_\b:_\b:_\bc_\bo_\bn_\bs_\bt_\b__\bi_\bt_\be_\br_\ba_\bt_\bo_\br\n-RemoteIndexMap::const_iterator const_iterator\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn remoteindices.hh:248\n-_\bD_\bu_\bn_\be_\b:_\b:_\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\be_\bx\n-Information about an index residing on another processor.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn remoteindices.hh:74\n-_\bD_\bu_\bn_\be_\b:_\b:_\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\be_\bx_\b:_\b:_\br_\be_\bp_\ba_\bi_\br_\bL_\bo_\bc_\ba_\bl_\bI_\bn_\bd_\be_\bx_\bP_\bo_\bi_\bn_\bt_\be_\br_\bs\n-friend void repairLocalIndexPointers(std::map< int, SLList< std::pair< typename\n-T::GlobalIndex, typename T::LocalIndex::Attribute >, A > > &, RemoteIndices< T,\n-A1 > &, const T &)\n-_\bD_\bu_\bn_\be_\b:_\b:_\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\be_\bx_\b:_\b:_\bG_\bl_\bo_\bb_\ba_\bl_\bI_\bn_\bd_\be_\bx\n-T1 GlobalIndex\n-the type of the global index. This type has to provide at least a operator< for\n-sorting.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn remoteindices.hh:91\n-_\bD_\bu_\bn_\be_\b:_\b:_\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\be_\bx_\b:_\b:_\bA_\bt_\bt_\br_\bi_\bb_\bu_\bt_\be\n-T2 Attribute\n-The type of the attributes. Normally this will be an enumeration like.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn remoteindices.hh:100\n-_\bD_\bu_\bn_\be_\b:_\b:_\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\be_\bx_\b:_\b:_\bP_\ba_\bi_\br_\bT_\by_\bp_\be\n-IndexPair< GlobalIndex, ParallelLocalIndex< Attribute > > PairType\n-The type of the index pair.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn remoteindices.hh:106\n-_\bD_\bu_\bn_\be_\b:_\b:_\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\be_\bx_\bL_\bi_\bs_\bt_\bM_\bo_\bd_\bi_\bf_\bi_\be_\br\n-Modifier for adding and/or deleting remote indices from the remote index list.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn remoteindices.hh:550\n-_\bD_\bu_\bn_\be_\b:_\b:_\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\be_\bx_\bL_\bi_\bs_\bt_\bM_\bo_\bd_\bi_\bf_\bi_\be_\br_\b:_\b:_\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\be_\bx_\bL_\bi_\bs_\bt\n-Dune::SLList< RemoteIndex, Allocator > RemoteIndexList\n-The type of the remote index list.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn remoteindices.hh:601\n-_\bD_\bu_\bn_\be_\b:_\b:_\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\be_\bx_\bL_\bi_\bs_\bt_\bM_\bo_\bd_\bi_\bf_\bi_\be_\br_\b:_\b:_\bA_\bl_\bl_\bo_\bc_\ba_\bt_\bo_\br\n-A Allocator\n-The type of the allocator for the remote index list.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn remoteindices.hh:597\n-_\bD_\bu_\bn_\be_\b:_\b:_\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\be_\bx_\bL_\bi_\bs_\bt_\bM_\bo_\bd_\bi_\bf_\bi_\be_\br_\b:_\b:_\bG_\bl_\bo_\bb_\ba_\bl_\bI_\bn_\bd_\be_\bx\n-ParallelIndexSet::GlobalIndex GlobalIndex\n-The type of the global index.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn remoteindices.hh:577\n-_\bD_\bu_\bn_\be_\b:_\b:_\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\be_\bx_\bL_\bi_\bs_\bt_\bM_\bo_\bd_\bi_\bf_\bi_\be_\br_\b:_\b:_\bL_\bo_\bc_\ba_\bl_\bI_\bn_\bd_\be_\bx\n-ParallelIndexSet::LocalIndex LocalIndex\n-The type of the local index.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn remoteindices.hh:582\n-_\bD_\bu_\bn_\be_\b:_\b:_\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\be_\bx_\bL_\bi_\bs_\bt_\bM_\bo_\bd_\bi_\bf_\bi_\be_\br_\b:_\b:_\bC_\bo_\bn_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br\n-RemoteIndexList::const_iterator ConstIterator\n-The type of the remote index list iterator.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn remoteindices.hh:611\n-_\bD_\bu_\bn_\be_\b:_\b:_\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\be_\bx_\bL_\bi_\bs_\bt_\bM_\bo_\bd_\bi_\bf_\bi_\be_\br_\b:_\b:_\bM_\bo_\bd_\bi_\bf_\by_\bI_\bt_\be_\br_\ba_\bt_\bo_\br\n-SLListModifyIterator< RemoteIndex, Allocator > ModifyIterator\n-The type of the modifying iterator of the remote index list.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn remoteindices.hh:606\n-_\bD_\bu_\bn_\be_\b:_\b:_\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\be_\bx_\bL_\bi_\bs_\bt_\bM_\bo_\bd_\bi_\bf_\bi_\be_\br_\b:_\b:_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt\n-T ParallelIndexSet\n-Type of the index set we use.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn remoteindices.hh:572\n-_\bD_\bu_\bn_\be_\b:_\b:_\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\be_\bx_\bL_\bi_\bs_\bt_\bM_\bo_\bd_\bi_\bf_\bi_\be_\br_\b:_\b:_\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\be_\bx_\bL_\bi_\bs_\bt_\bM_\bo_\bd_\bi_\bf_\bi_\be_\br\n-RemoteIndexListModifier()\n-Default constructor.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn remoteindices.hh:675\n-_\bD_\bu_\bn_\be_\b:_\b:_\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\be_\bx_\bL_\bi_\bs_\bt_\bM_\bo_\bd_\bi_\bf_\bi_\be_\br_\b:_\b:_\bA_\bt_\bt_\br_\bi_\bb_\bu_\bt_\be\n-LocalIndex::Attribute Attribute\n-The type of the attribute.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn remoteindices.hh:587\n-_\bD_\bu_\bn_\be_\b:_\b:_\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\be_\bx_\bL_\bi_\bs_\bt_\bM_\bo_\bd_\bi_\bf_\bi_\be_\br_\b:_\b:_\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\be_\bx\n-Dune::RemoteIndex< GlobalIndex, Attribute > RemoteIndex\n-Type of the remote indices we manage.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn remoteindices.hh:592\n-_\bD_\bu_\bn_\be_\b:_\b:_\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\be_\bx_\bL_\bi_\bs_\bt_\bM_\bo_\bd_\bi_\bf_\bi_\be_\br_\b:_\b:_\bM_\bO_\bD_\bI_\bF_\bY_\bI_\bN_\bD_\bE_\bX_\bS_\bE_\bT\n-static constexpr bool MODIFYINDEXSET\n-If true the index set corresponding to the remote indices might get modified.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn remoteindices.hh:567\n-_\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bl_\bl_\be_\bc_\bt_\bi_\bv_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br\n-A collective iterator for moving over the remote indices for all processes\n-collectively.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn remoteindices.hh:707\n-_\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bl_\bl_\be_\bc_\bt_\bi_\bv_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\be_\bx_\bM_\ba_\bp\n-std::map< int, std::pair< RemoteIndexList *, RemoteIndexList * > >\n-RemoteIndexMap\n-The type of the map from rank to remote index list.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn remoteindices.hh:747\n-_\bD_\bu_\bn_\be_\b:_\b:_\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn remoteindices.hh:168\n-_\bD_\bu_\bn_\be_\b:_\b:_\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\be_\bx_\bL_\bi_\bs_\bt_\bM_\bo_\bd_\bi_\bf_\bi_\be_\br_\b:_\b:_\bI_\bn_\bv_\ba_\bl_\bi_\bd_\bP_\bo_\bs_\bi_\bt_\bi_\bo_\bn\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn remoteindices.hh:557\n-_\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bl_\bl_\be_\bc_\bt_\bi_\bv_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\bi_\bt_\be_\br_\ba_\bt_\bo_\br\n-Iterator over the valid underlying iterators.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn remoteindices.hh:791\n-_\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bl_\bl_\be_\bc_\bt_\bi_\bv_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\bi_\bt_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\bi_\bt_\be_\br_\ba_\bt_\bo_\br\n-iterator(const RealIterator &iter, const ConstRealIterator &end, GlobalIndex\n-&index)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn remoteindices.hh:798\n-_\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bl_\bl_\be_\bc_\bt_\bi_\bv_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\bi_\bt_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\bi_\bt_\be_\br_\ba_\bt_\bo_\br\n-iterator(const iterator &other)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn remoteindices.hh:816\n-_\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bl_\bl_\be_\bc_\bt_\bi_\bv_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\bi_\bt_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b*\n-const RemoteIndex & operator*() const\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn remoteindices.hh:837\n-_\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bl_\bl_\be_\bc_\bt_\bi_\bv_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\bi_\bt_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\bC_\bo_\bn_\bs_\bt_\bR_\be_\ba_\bl_\bI_\bt_\be_\br_\ba_\bt_\bo_\br\n-Map::iterator ConstRealIterator\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn remoteindices.hh:794\n-_\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bl_\bl_\be_\bc_\bt_\bi_\bv_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\bi_\bt_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b+_\b+\n-iterator & operator++()\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn remoteindices.hh:821\n-_\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bl_\bl_\be_\bc_\bt_\bi_\bv_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\bi_\bt_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b-_\b>\n-const RemoteIndex * operator->() const\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn remoteindices.hh:849\n-_\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bl_\bl_\be_\bc_\bt_\bi_\bv_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\bi_\bt_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b=_\b=\n-bool operator==(const iterator &other) const\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn remoteindices.hh:855\n-_\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bl_\bl_\be_\bc_\bt_\bi_\bv_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\bi_\bt_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\bp_\br_\bo_\bc_\be_\bs_\bs\n-int process() const\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn remoteindices.hh:843\n-_\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bl_\bl_\be_\bc_\bt_\bi_\bv_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\bi_\bt_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\bi_\bt_\be_\br_\ba_\bt_\bo_\br\n-iterator(const RealIterator &iter, const ConstRealIterator &end, GlobalIndex\n-index, Attribute attribute)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn remoteindices.hh:806\n-_\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bl_\bl_\be_\bc_\bt_\bi_\bv_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\bi_\bt_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b!_\b=\n-bool operator!=(const iterator &other) const\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn remoteindices.hh:861\n-_\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bl_\bl_\be_\bc_\bt_\bi_\bv_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\bi_\bt_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\bR_\be_\ba_\bl_\bI_\bt_\be_\br_\ba_\bt_\bo_\br\n-Map::iterator RealIterator\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn remoteindices.hh:793\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bL_\bL_\bi_\bs_\bt_\bC_\bo_\bn_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br\n-A constant iterator for the SLList.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn sllist.hh:371\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bL_\bL_\bi_\bs_\bt_\bM_\bo_\bd_\bi_\bf_\by_\bI_\bt_\be_\br_\ba_\bt_\bo_\br\n-A mutable iterator for the SLList.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn sllist.hh:429\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bL_\bL_\bi_\bs_\bt\n-A single linked list.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn sllist.hh:44\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\bi_\bn\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn binaryfunctions.hh:18\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bx\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn binaryfunctions.hh:34\n+_\bD_\bu_\bn_\be_\b:_\b:_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bE_\br_\br_\bo_\br\n+Default exception if an error in the parallel communication of the program\n+occurred.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn exceptions.hh:287\n+_\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn\n+Collective communication interface and sequential default implementation.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn communication.hh:100\n+_\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\bs_\bi_\bz_\be\n+int size() const\n+Number of processes in set, is greater than 0.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn communication.hh:126\n+_\bD_\bu_\bn_\be_\b:_\b:_\bG_\be_\bn_\be_\br_\bi_\bc_\b__\bM_\bP_\bI_\b__\bO_\bp\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mpicommunication.hh:41\n+_\bD_\bu_\bn_\be_\b:_\b:_\bG_\be_\bn_\be_\br_\bi_\bc_\b__\bM_\bP_\bI_\b__\bO_\bp_\b:_\b:_\bg_\be_\bt\n+static MPI_Op get()\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mpicommunication.hh:44\n+_\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b<_\b _\bM_\bP_\bI_\b__\bC_\bo_\bm_\bm_\b _\b>_\b:_\b:_\bm_\ba_\bx\n+int max(T *inout, int len) const\n+Compute the maximum of the argument over all processes and return the result in\n+every process....\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mpicommunication.hh:266\n+_\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b<_\b _\bM_\bP_\bI_\b__\bC_\bo_\bm_\bm_\b _\b>_\b:_\b:_\ba_\bl_\bl_\bg_\ba_\bt_\bh_\be_\br_\bv\n+int allgatherv(const T *in, int sendDataLen, T *out, int *recvDataLen, int\n+*displ) const\n+Gathers data of variable length from all tasks and distribute it to all.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mpicommunication.hh:405\n+_\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b<_\b _\bM_\bP_\bI_\b__\bC_\bo_\bm_\bm_\b _\b>_\b:_\b:_\bm_\ba_\bx\n+T max(const T &in) const\n+Compute the maximum of the argument over all processes and return the result in\n+every process....\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mpicommunication.hh:257\n+_\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b<_\b _\bM_\bP_\bI_\b__\bC_\bo_\bm_\bm_\b _\b>_\b:_\b:_\bi_\bb_\br_\bo_\ba_\bd_\bc_\ba_\bs_\bt\n+MPIFuture< T > ibroadcast(T &&data, int root) const\n+Distribute an array from the process with rank root to all other processes\n+nonblocking.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mpicommunication.hh:295\n+_\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b<_\b _\bM_\bP_\bI_\b__\bC_\bo_\bm_\bm_\b _\b>_\b:_\b:_\bi_\bb_\ba_\br_\br_\bi_\be_\br\n+MPIFuture< void > ibarrier() const\n+Nonblocking barrier.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mpicommunication.hh:278\n+_\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b<_\b _\bM_\bP_\bI_\b__\bC_\bo_\bm_\bm_\b _\b>_\b:_\b:_\br_\be_\bc_\bv\n+T recv(T &&data, int source_rank, int tag, MPI_Status\n+*status=MPI_STATUS_IGNORE) const\n+Receives the data from the source_rank.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mpicommunication.hh:166\n+_\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b<_\b _\bM_\bP_\bI_\b__\bC_\bo_\bm_\bm_\b _\b>_\b:_\b:_\bb_\ba_\br_\br_\bi_\be_\br\n+int barrier() const\n+Wait until all processes have arrived at this point in the program.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mpicommunication.hh:272\n+_\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b<_\b _\bM_\bP_\bI_\b__\bC_\bo_\bm_\bm_\b _\b>_\b:_\b:_\br_\ba_\bn_\bk\n+int rank() const\n+Return rank, is between 0 and size()-1.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mpicommunication.hh:133\n+_\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b<_\b _\bM_\bP_\bI_\b__\bC_\bo_\bm_\bm_\b _\b>_\b:_\b:_\bs_\bc_\ba_\bt_\bt_\be_\br_\bv\n+int scatterv(const T *sendData, int *sendDataLen, int *displ, T *recvData, int\n+recvDataLen, int root) const\n+Scatter arrays of variable length from a root to all other tasks.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mpicommunication.hh:366\n+_\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b<_\b _\bM_\bP_\bI_\b__\bC_\bo_\bm_\bm_\b _\b>_\b:_\b:_\bi_\bs_\be_\bn_\bd\n+MPIFuture< T > isend(T &&data, int dest_rank, int tag) const\n+Sends the data to the dest_rank nonblocking.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mpicommunication.hh:155\n+_\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b<_\b _\bM_\bP_\bI_\b__\bC_\bo_\bm_\bm_\b _\b>_\b:_\b:_\bi_\ba_\bl_\bl_\bg_\ba_\bt_\bh_\be_\br\n+MPIFuture< TOUT, TIN > iallgather(TIN &&data_in, TOUT &&data_out) const\n+Gathers data from all tasks and distribute it to all nonblocking.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mpicommunication.hh:390\n+_\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b<_\b _\bM_\bP_\bI_\b__\bC_\bo_\bm_\bm_\b _\b>_\b:_\b:_\ba_\bl_\bl_\br_\be_\bd_\bu_\bc_\be\n+Type allreduce(Type &&in) const\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mpicommunication.hh:424\n+_\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b<_\b _\bM_\bP_\bI_\b__\bC_\bo_\bm_\bm_\b _\b>_\b:_\b:_\bs_\bu_\bm\n+int sum(T *inout, int len) const\n+Compute the sum of the argument over all processes and return the result in\n+every process....\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mpicommunication.hh:217\n+_\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b<_\b _\bM_\bP_\bI_\b__\bC_\bo_\bm_\bm_\b _\b>_\b:_\b:_\bb_\br_\bo_\ba_\bd_\bc_\ba_\bs_\bt\n+int broadcast(T *inout, int len, int root) const\n+Distribute an array from the process with rank root to all other processes.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mpicommunication.hh:288\n+_\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b<_\b _\bM_\bP_\bI_\b__\bC_\bo_\bm_\bm_\b _\b>_\b:_\b:_\bi_\ba_\bl_\bl_\br_\be_\bd_\bu_\bc_\be\n+MPIFuture< T > iallreduce(T &&data) const\n+Compute something over all processes nonblocking.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mpicommunication.hh:450\n+_\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b<_\b _\bM_\bP_\bI_\b__\bC_\bo_\bm_\bm_\b _\b>_\b:_\b:_\bs_\bu_\bm\n+T sum(const T &in) const\n+Compute the sum of the argument over all processes and return the result in\n+every process....\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mpicommunication.hh:208\n+_\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b<_\b _\bM_\bP_\bI_\b__\bC_\bo_\bm_\bm_\b _\b>_\b:_\b:_\ba_\bl_\bl_\br_\be_\bd_\bu_\bc_\be\n+int allreduce(const Type *in, Type *out, int len) const\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mpicommunication.hh:462\n+_\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b<_\b _\bM_\bP_\bI_\b__\bC_\bo_\bm_\bm_\b _\b>_\b:_\b:_\bi_\ba_\bl_\bl_\br_\be_\bd_\bu_\bc_\be\n+MPIFuture< TOUT, TIN > iallreduce(TIN &&data_in, TOUT &&data_out) const\n+Compute something over all processes nonblocking.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mpicommunication.hh:435\n+_\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b<_\b _\bM_\bP_\bI_\b__\bC_\bo_\bm_\bm_\b _\b>_\b:_\b:_\bs_\bi_\bz_\be\n+int size() const\n+Number of processes in set, is greater than 0.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mpicommunication.hh:139\n+_\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b<_\b _\bM_\bP_\bI_\b__\bC_\bo_\bm_\bm_\b _\b>_\b:_\b:_\bg_\ba_\bt_\bh_\be_\br\n+int gather(const T *in, T *out, int len, int root) const\n+Gather arrays on root task.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mpicommunication.hh:310\n+_\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b<_\b _\bM_\bP_\bI_\b__\bC_\bo_\bm_\bm_\b _\b>_\b:_\b:_\ba_\bl_\bl_\br_\be_\bd_\bu_\bc_\be\n+int allreduce(Type *inout, int len) const\n+Compute something over all processes for each component of an array and return\n+the result in every pr...\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mpicommunication.hh:414\n+_\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b<_\b _\bM_\bP_\bI_\b__\bC_\bo_\bm_\bm_\b _\b>_\b:_\b:_\br_\br_\be_\bc_\bv\n+T rrecv(T &&data, int source_rank, int tag, MPI_Status\n+*status=MPI_STATUS_IGNORE) const\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mpicommunication.hh:189\n+_\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b<_\b _\bM_\bP_\bI_\b__\bC_\bo_\bm_\bm_\b _\b>_\b:_\b:_\bs_\bc_\ba_\bt_\bt_\be_\br\n+int scatter(const T *sendData, T *recvData, int len, int root) const\n+Scatter array from a root to all other task.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mpicommunication.hh:343\n+_\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b<_\b _\bM_\bP_\bI_\b__\bC_\bo_\bm_\bm_\b _\b>_\b:_\b:_\bi_\br_\be_\bc_\bv\n+MPIFuture< T > irecv(T &&data, int source_rank, int tag) const\n+Receives the data from the source_rank nonblocking.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mpicommunication.hh:177\n+_\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b<_\b _\bM_\bP_\bI_\b__\bC_\bo_\bm_\bm_\b _\b>_\b:_\b:_\bp_\br_\bo_\bd\n+int prod(T *inout, int len) const\n+Compute the product of the argument over all processes and return the result in\n+every process....\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mpicommunication.hh:233\n+_\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b<_\b _\bM_\bP_\bI_\b__\bC_\bo_\bm_\bm_\b _\b>_\b:_\b:_\bi_\bg_\ba_\bt_\bh_\be_\br\n+MPIFuture< TOUT, TIN > igather(TIN &&data_in, TOUT &&data_out, int root) const\n+Gather arrays on root task nonblocking.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mpicommunication.hh:319\n+_\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b<_\b _\bM_\bP_\bI_\b__\bC_\bo_\bm_\bm_\b _\b>_\b:_\b:_\bm_\bi_\bn\n+T min(const T &in) const\n+Compute the minimum of the argument over all processes and return the result in\n+every process....\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mpicommunication.hh:240\n+_\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b<_\b _\bM_\bP_\bI_\b__\bC_\bo_\bm_\bm_\b _\b>_\b:_\b:_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn\n+Communication(const MPI_Comm &c=MPI_COMM_WORLD)\n+Instantiation using a MPI communicator.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mpicommunication.hh:111\n+_\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b<_\b _\bM_\bP_\bI_\b__\bC_\bo_\bm_\bm_\b _\b>_\b:_\b:_\bi_\bs_\bc_\ba_\bt_\bt_\be_\br\n+MPIFuture< TOUT, TIN > iscatter(TIN &&data_in, TOUT &&data_out, int root) const\n+Scatter array from a root to all other task nonblocking.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mpicommunication.hh:352\n+_\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b<_\b _\bM_\bP_\bI_\b__\bC_\bo_\bm_\bm_\b _\b>_\b:_\b:_\bg_\ba_\bt_\bh_\be_\br_\bv\n+int gatherv(const T *in, int sendDataLen, T *out, int *recvDataLen, int *displ,\n+int root) const\n+Gather arrays of variable size on root task.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mpicommunication.hh:333\n+_\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b<_\b _\bM_\bP_\bI_\b__\bC_\bo_\bm_\bm_\b _\b>_\b:_\b:_\bm_\bi_\bn\n+int min(T *inout, int len) const\n+Compute the minimum of the argument over all processes and return the result in\n+every process....\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mpicommunication.hh:249\n+_\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b<_\b _\bM_\bP_\bI_\b__\bC_\bo_\bm_\bm_\b _\b>_\b:_\b:_\ba_\bl_\bl_\bg_\ba_\bt_\bh_\be_\br\n+int allgather(const T *sbuf, int count, T1 *rbuf) const\n+Gathers data from all tasks and distribute it to all.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mpicommunication.hh:381\n+_\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b<_\b _\bM_\bP_\bI_\b__\bC_\bo_\bm_\bm_\b _\b>_\b:_\b:_\bs_\be_\bn_\bd\n+int send(const T &data, int dest_rank, int tag) const\n+Sends the data to the dest_rank.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mpicommunication.hh:146\n+_\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b<_\b _\bM_\bP_\bI_\b__\bC_\bo_\bm_\bm_\b _\b>_\b:_\b:_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn\n+Communication(const Communication< No_Comm > &)\n+Converting constructor for no-communication that is interpreted as\n+MPI_COMM_SELF.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mpicommunication.hh:128\n+_\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b<_\b _\bM_\bP_\bI_\b__\bC_\bo_\bm_\bm_\b _\b>_\b:_\b:_\bp_\br_\bo_\bd\n+T prod(const T &in) const\n+Compute the product of the argument over all processes and return the result in\n+every process....\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mpicommunication.hh:224\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\bP_\bI_\bF_\bu_\bt_\bu_\br_\be\n+Provides a future-like object for MPI communication. It contains the object\n+that will be received and...\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mpifuture.hh:93\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\bP_\bI_\bF_\bu_\bt_\bu_\br_\be_\b:_\b:_\bg_\be_\bt_\b__\bs_\be_\bn_\bd_\b__\bm_\bp_\bi_\bd_\ba_\bt_\ba\n+auto get_send_mpidata()\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mpifuture.hh:177\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\bP_\bI_\bF_\bu_\bt_\bu_\br_\be_\b:_\b:_\bg_\be_\bt_\b__\bm_\bp_\bi_\bd_\ba_\bt_\ba\n+auto get_mpidata()\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mpifuture.hh:173\n ===============================================================================\n Generated by\u00a0_\b[_\bd_\bo_\bx_\by_\bg_\be_\bn_\b] 1.9.8\n"}]}, {"source1": "./usr/share/doc/libdune-common-doc/doxygen/a00083.html", "source2": "./usr/share/doc/libdune-common-doc/doxygen/a00083.html", "unified_diff": "@@ -1,15 +1,15 @@\n \n \n \n \n \n \n \n-dune-common: indicessyncer.hh File Reference\n+dune-common: collectivecommunication.hh File Reference\n \n \n \n \n \n \n \n@@ -69,83 +69,20 @@\n \n \n \n
    \n- \n- \n+
    collectivecommunication.hh File Reference
    \n
    \n
    \n-\n-

    Class for adding missing indices of a distributed index set in a local communication. \n-More...

    \n-
    #include <algorithm>
    \n-#include <cassert>
    \n-#include <cmath>
    \n-#include <functional>
    \n-#include <limits>
    \n-#include <map>
    \n-#include <tuple>
    \n-#include <mpi.h>
    \n-#include <dune/common/stdstreams.hh>
    \n-#include <dune/common/sllist.hh>
    \n-#include <dune/common/parallel/indexset.hh>
    \n-#include <dune/common/parallel/remoteindices.hh>
    \n+\n

    Go to the source code of this file.

    \n-\n-\n-\n-\n-\n-

    \n-Classes

    class  Dune::IndicesSyncer< T >
     Class for recomputing missing indices of a distributed index set. More...
     
    \n-\n-\n-\n-\n-

    \n-Namespaces

    namespace  Dune
     Dune namespace.
     
    \n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-

    \n-Functions

    template<typename TG , typename TA >
    bool Dune::operator< (const IndexPair< TG, ParallelLocalIndex< TA > > &i1, const std::pair< TG, TA > &i2)
     
    template<typename TG , typename TA >
    bool Dune::operator< (const std::pair< TG, TA > &i1, const IndexPair< TG, ParallelLocalIndex< TA > > &i2)
     
    template<typename TG , typename TA >
    bool Dune::operator== (const IndexPair< TG, ParallelLocalIndex< TA > > &i1, const std::pair< TG, TA > &i2)
     
    template<typename TG , typename TA >
    bool Dune::operator!= (const IndexPair< TG, ParallelLocalIndex< TA > > &i1, const std::pair< TG, TA > &i2)
     
    template<typename TG , typename TA >
    bool Dune::operator== (const std::pair< TG, TA > &i2, const IndexPair< TG, ParallelLocalIndex< TA > > &i1)
     
    template<typename TG , typename TA >
    bool Dune::operator!= (const std::pair< TG, TA > &i2, const IndexPair< TG, ParallelLocalIndex< TA > > &i1)
     
    template<typename T , typename A , typename A1 >
    void Dune::storeGlobalIndicesOfRemoteIndices (std::map< int, SLList< std::pair< typename T::GlobalIndex, typename T::LocalIndex::Attribute >, A > > &globalMap, const RemoteIndices< T, A1 > &remoteIndices)
     Stores the corresponding global indices of the remote index information.
     
    template<typename T , typename A , typename A1 >
    void Dune::repairLocalIndexPointers (std::map< int, SLList< std::pair< typename T::GlobalIndex, typename T::LocalIndex::Attribute >, A > > &globalMap, RemoteIndices< T, A1 > &remoteIndices, const T &indexSet)
     Repair the pointers to the local indices in the remote indices.
     
    \n-

    Detailed Description

    \n-

    Class for adding missing indices of a distributed index set in a local communication.

    \n-
    Author
    Markus Blatt
    \n-
    \n+
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,78 +1,12 @@\n dune-common\u00a02.10\n Loading...\n Searching...\n No Matches\n * _\bd_\bu_\bn_\be\n * _\bc_\bo_\bm_\bm_\bo_\bn\n * _\bp_\ba_\br_\ba_\bl_\bl_\be_\bl\n-_\bC_\bl_\ba_\bs_\bs_\be_\bs | _\bN_\ba_\bm_\be_\bs_\bp_\ba_\bc_\be_\bs | _\bF_\bu_\bn_\bc_\bt_\bi_\bo_\bn_\bs\n-indicessyncer.hh File Reference\n-_\bC_\bo_\bm_\bm_\bo_\bn \u00bb _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\b _\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn \u00bb _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\b _\bC_\bo_\bm_\bp_\bu_\bt_\bi_\bn_\bg_\b _\bb_\ba_\bs_\be_\bd_\b _\bo_\bn_\b _\bI_\bn_\bd_\be_\bx_\bs_\be_\bt_\bs\n-Class for adding missing indices of a distributed index set in a local\n-communication. _\bM_\bo_\br_\be_\b._\b._\b.\n-#include \n-#include \n-#include \n-#include \n-#include \n-#include \n-#include \n-#include \n-#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bs_\bt_\bd_\bs_\bt_\br_\be_\ba_\bm_\bs_\b._\bh_\bh>\n-#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bs_\bl_\bl_\bi_\bs_\bt_\b._\bh_\bh>\n-#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bp_\ba_\br_\ba_\bl_\bl_\be_\bl_\b/_\bi_\bn_\bd_\be_\bx_\bs_\be_\bt_\b._\bh_\bh>\n-#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bp_\ba_\br_\ba_\bl_\bl_\be_\bl_\b/_\br_\be_\bm_\bo_\bt_\be_\bi_\bn_\bd_\bi_\bc_\be_\bs_\b._\bh_\bh>\n+collectivecommunication.hh File Reference\n+#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bp_\ba_\br_\ba_\bl_\bl_\be_\bl_\b/_\bc_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b._\bh_\bh>\n _\bG_\bo_\b _\bt_\bo_\b _\bt_\bh_\be_\b _\bs_\bo_\bu_\br_\bc_\be_\b _\bc_\bo_\bd_\be_\b _\bo_\bf_\b _\bt_\bh_\bi_\bs_\b _\bf_\bi_\bl_\be_\b.\n-C\bCl\bla\bas\bss\bse\bes\bs\n-class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bd_\bi_\bc_\be_\bs_\bS_\by_\bn_\bc_\be_\br_\b<_\b _\bT_\b _\b>\n-\u00a0 Class for recomputing missing indices of a distributed index set.\n- _\bM_\bo_\br_\be_\b._\b._\b.\n-\u00a0\n-N\bNa\bam\bme\bes\bsp\bpa\bac\bce\bes\bs\n-namespace \u00a0 _\bD_\bu_\bn_\be\n-\u00a0 _\bD_\bu_\bn_\be namespace.\n-\u00a0\n-F\bFu\bun\bnc\bct\bti\bio\bon\bns\bs\n-template\n-bool\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b< (const _\bI_\bn_\bd_\be_\bx_\bP_\ba_\bi_\br< TG, _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bL_\bo_\bc_\ba_\bl_\bI_\bn_\bd_\be_\bx< TA > > &i1,\n- const std::pair< TG, TA > &i2)\n-\u00a0\n-template\n-bool\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b< (const std::pair< TG, TA > &i1, const _\bI_\bn_\bd_\be_\bx_\bP_\ba_\bi_\br< TG,\n- _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bL_\bo_\bc_\ba_\bl_\bI_\bn_\bd_\be_\bx< TA > > &i2)\n-\u00a0\n-template\n-bool\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b=_\b= (const _\bI_\bn_\bd_\be_\bx_\bP_\ba_\bi_\br< TG, _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bL_\bo_\bc_\ba_\bl_\bI_\bn_\bd_\be_\bx< TA > > &i1,\n- const std::pair< TG, TA > &i2)\n-\u00a0\n-template\n-bool\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b!_\b= (const _\bI_\bn_\bd_\be_\bx_\bP_\ba_\bi_\br< TG, _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bL_\bo_\bc_\ba_\bl_\bI_\bn_\bd_\be_\bx< TA > > &i1,\n- const std::pair< TG, TA > &i2)\n-\u00a0\n-template\n-bool\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b=_\b= (const std::pair< TG, TA > &i2, const _\bI_\bn_\bd_\be_\bx_\bP_\ba_\bi_\br< TG,\n- _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bL_\bo_\bc_\ba_\bl_\bI_\bn_\bd_\be_\bx< TA > > &i1)\n-\u00a0\n-template\n-bool\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b!_\b= (const std::pair< TG, TA > &i2, const _\bI_\bn_\bd_\be_\bx_\bP_\ba_\bi_\br< TG,\n- _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bL_\bo_\bc_\ba_\bl_\bI_\bn_\bd_\be_\bx< TA > > &i1)\n-\u00a0\n-template\n-void\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bs_\bt_\bo_\br_\be_\bG_\bl_\bo_\bb_\ba_\bl_\bI_\bn_\bd_\bi_\bc_\be_\bs_\bO_\bf_\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\bi_\bc_\be_\bs (std::map< int, _\bS_\bL_\bL_\bi_\bs_\bt< std::\n- pair< typename T::GlobalIndex, typename T::LocalIndex::Attribute >, A > >\n- &globalMap, const _\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\bi_\bc_\be_\bs< T, A1 > &remoteIndices)\n-\u00a0 Stores the corresponding global indices of the remote index information.\n-\u00a0\n-template\n-void\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\br_\be_\bp_\ba_\bi_\br_\bL_\bo_\bc_\ba_\bl_\bI_\bn_\bd_\be_\bx_\bP_\bo_\bi_\bn_\bt_\be_\br_\bs (std::map< int, _\bS_\bL_\bL_\bi_\bs_\bt< std::pair<\n- typename T::GlobalIndex, typename T::LocalIndex::Attribute >, A > >\n- &globalMap, _\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\bi_\bc_\be_\bs< T, A1 > &remoteIndices, const T &indexSet)\n-\u00a0 Repair the pointers to the local indices in the remote indices.\n-\u00a0\n-*\b**\b**\b**\b**\b* D\bDe\bet\bta\bai\bil\ble\bed\bd D\bDe\bes\bsc\bcr\bri\bip\bpt\bti\bio\bon\bn *\b**\b**\b**\b**\b*\n-Class for adding missing indices of a distributed index set in a local\n-communication.\n- Author\n- Markus Blatt\n ===============================================================================\n Generated by\u00a0_\b[_\bd_\bo_\bx_\by_\bg_\be_\bn_\b] 1.9.8\n"}]}, {"source1": "./usr/share/doc/libdune-common-doc/doxygen/a00083_source.html", "source2": "./usr/share/doc/libdune-common-doc/doxygen/a00083_source.html", "unified_diff": "@@ -1,15 +1,15 @@\n \n \n \n \n \n \n \n-dune-common: indicessyncer.hh Source File\n+dune-common: collectivecommunication.hh Source File\n \n \n \n \n \n \n \n@@ -74,1052 +74,23 @@\n \n \n \n
    \n-
    indicessyncer.hh
    \n+
    collectivecommunication.hh
    \n
    \n
    \n-Go to the documentation of this file.
    1// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
    \n-
    2// vi: set et ts=4 sw=2 sts=2:
    \n-
    3// SPDX-FileCopyrightInfo: Copyright \u00a9 DUNE Project contributors, see file LICENSE.md in module root
    \n-
    4// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception
    \n-
    5#ifndef DUNE_COMMON_PARALLEL_INDICESSYNCER_HH
    \n-
    6#define DUNE_COMMON_PARALLEL_INDICESSYNCER_HH
    \n-
    7
    \n-
    8#if HAVE_MPI
    \n-
    9
    \n-
    10#include <algorithm>
    \n-
    11#include <cassert>
    \n-
    12#include <cmath>
    \n-
    13#include <functional>
    \n-
    14#include <limits>
    \n-
    15#include <map>
    \n-
    16#include <tuple>
    \n-
    17
    \n-
    18#include <mpi.h>
    \n-
    19
    \n-\n-
    21#include <dune/common/sllist.hh>
    \n-\n-\n-
    24
    \n-
    25namespace Dune
    \n-
    26{
    \n-
    43 template<typename T>
    \n-
    \n-\n-
    45 {
    \n-
    46 public:
    \n-
    47
    \n-\n-
    50
    \n-\n-
    53
    \n-\n-
    56
    \n-
    58 typedef typename ParallelIndexSet::LocalIndex::Attribute Attribute;
    \n-
    59
    \n-\n-
    64
    \n-\n-
    75 RemoteIndices& remoteIndices);
    \n-
    76
    \n-
    86 void sync();
    \n-
    87
    \n-
    100 template<typename T1>
    \n-
    101 void sync(T1& numberer, bool useFixedOrder = false);
    \n-
    102
    \n-
    103 private:
    \n-
    104
    \n-
    106 ParallelIndexSet& indexSet_;
    \n-
    107
    \n-
    109 RemoteIndices& remoteIndices_;
    \n-
    110
    \n-
    112 char** sendBuffers_;
    \n-
    113
    \n-
    115 char* receiveBuffer_;
    \n-
    116
    \n-
    118 std::size_t* sendBufferSizes_;
    \n-
    119
    \n-
    121 int receiveBufferSize_; // int because of MPI
    \n-
    122
    \n-
    126 struct MessageInformation
    \n-
    127 {
    \n-
    \n-\n-
    129 : publish(), pairs()
    \n-
    130 {}
    \n-
    \n-\n-
    137 int pairs;
    \n-
    138 };
    \n-
    139
    \n-
    143 class DefaultNumberer
    \n-
    144 {
    \n-
    145 public:
    \n-
    151 std::size_t operator()([[maybe_unused]] const GlobalIndex& global)
    \n-
    152 {
    \n-
    153 return std::numeric_limits<size_t>::max();
    \n-
    154 }
    \n-
    155 };
    \n-
    156
    \n-
    158 MPI_Datatype datatype_;
    \n-
    159
    \n-
    161 int rank_;
    \n-
    162
    \n-
    167 typedef SLList<std::pair<GlobalIndex,Attribute>, typename RemoteIndices::Allocator> GlobalIndexList;
    \n-
    168
    \n-
    170 typedef typename GlobalIndexList::ModifyIterator GlobalIndexModifier;
    \n-
    171
    \n-\n-
    176 GlobalIndexIterator;
    \n-
    177
    \n-
    179 typedef std::map<int, GlobalIndexList> GlobalIndicesMap;
    \n-
    180
    \n-
    189 GlobalIndicesMap globalMap_;
    \n-
    190
    \n-\n-
    195
    \n-
    199 typedef typename BoolList::iterator BoolIterator;
    \n-
    200
    \n-
    202 typedef typename BoolList::ModifyIterator BoolListModifier;
    \n-
    203
    \n-
    205 typedef std::map<int,BoolList> BoolMap;
    \n-
    206
    \n-
    211 BoolMap oldMap_;
    \n-
    212
    \n-
    214 std::map<int,MessageInformation> infoSend_;
    \n-
    215
    \n-
    217 typedef typename RemoteIndices::RemoteIndexList RemoteIndexList;
    \n-
    218
    \n-
    220 typedef typename RemoteIndexList::ModifyIterator RemoteIndexModifier;
    \n-
    221
    \n-\n-
    224
    \n-
    226 typedef typename RemoteIndexList::iterator RemoteIndexIterator;
    \n-
    227
    \n-
    229 typedef typename RemoteIndexList::const_iterator ConstRemoteIndexIterator;
    \n-
    230
    \n-
    232 typedef std::tuple<RemoteIndexModifier,GlobalIndexModifier,BoolListModifier,
    \n-
    233 const ConstRemoteIndexIterator> IteratorTuple;
    \n-
    234
    \n-
    242 class Iterators
    \n-
    243 {
    \n-
    244 friend class IndicesSyncer<T>;
    \n-
    245 public:
    \n-
    255 Iterators(RemoteIndexList& remoteIndices, GlobalIndexList& globalIndices,
    \n-
    256 BoolList& booleans);
    \n-
    257
    \n-
    261 Iterators();
    \n-
    262
    \n-\n-
    267
    \n-
    273 void insert(const RemoteIndex& index,
    \n-
    274 const std::pair<GlobalIndex,Attribute>& global);
    \n-
    275
    \n-
    280 RemoteIndex& remoteIndex() const;
    \n-
    281
    \n-
    286 std::pair<GlobalIndex,Attribute>& globalIndexPair() const;
    \n-
    287
    \n-\n-
    289
    \n-
    295 bool isOld() const;
    \n-
    296
    \n-
    306 void reset(RemoteIndexList& remoteIndices, GlobalIndexList& globalIndices,
    \n-
    307 BoolList& booleans);
    \n-
    308
    \n-
    314 bool isNotAtEnd() const;
    \n-
    315
    \n-
    321 bool isAtEnd() const;
    \n-
    322
    \n-
    323 private:
    \n-
    333 IteratorTuple iterators_;
    \n-
    334 };
    \n-
    335
    \n-
    337 typedef std::map<int,Iterators> IteratorsMap;
    \n-
    338
    \n-
    350 IteratorsMap iteratorsMap_;
    \n-
    351
    \n-
    353 void calculateMessageSizes();
    \n-
    354
    \n-
    362 void packAndSend(int destination, char* buffer, std::size_t bufferSize, MPI_Request& req);
    \n-
    363
    \n-
    370 template<typename T1>
    \n-
    371 void recvAndUnpack(T1& numberer, int hardSource, bool useHardSource);
    \n-
    372
    \n-
    376 void registerMessageDatatype();
    \n-
    377
    \n-
    381 void insertIntoRemoteIndexList(int process,
    \n-
    382 const std::pair<GlobalIndex,Attribute>& global,
    \n-
    383 char attribute);
    \n-
    384
    \n-
    388 void resetIteratorsMap();
    \n-
    389
    \n-
    394 bool checkReset();
    \n-
    395
    \n-
    404 bool checkReset(const Iterators& iterators, RemoteIndexList& rlist, GlobalIndexList& gList,
    \n-
    405 BoolList& bList);
    \n-
    406 };
    \n-
    \n-
    407
    \n-
    408 template<typename TG, typename TA>
    \n-
    \n-\n-
    410 const std::pair<TG,TA>& i2)
    \n-
    411 {
    \n-
    412 return i1.global() < i2.first ||
    \n-
    413 (i1.global() == i2.first && i1.local().attribute()<i2.second);
    \n-
    414 }
    \n-
    \n-
    415
    \n-
    416 template<typename TG, typename TA>
    \n-
    \n-
    417 bool operator<(const std::pair<TG,TA>& i1,
    \n-
    418 const IndexPair<TG,ParallelLocalIndex<TA> >& i2)
    \n-
    419 {
    \n-
    420 return i1.first < i2.global() ||
    \n-
    421 (i1.first == i2.global() && i1.second<i2.local().attribute());
    \n-
    422 }
    \n-
    \n-
    423
    \n-
    424 template<typename TG, typename TA>
    \n-
    \n-\n-
    426 const std::pair<TG,TA>& i2)
    \n-
    427 {
    \n-
    428 return (i1.global() == i2.first && i1.local().attribute()==i2.second);
    \n-
    429 }
    \n-
    \n-
    430
    \n-
    431 template<typename TG, typename TA>
    \n-
    \n-\n-
    433 const std::pair<TG,TA>& i2)
    \n-
    434 {
    \n-
    435 return (i1.global() != i2.first || i1.local().attribute()!=i2.second);
    \n-
    436 }
    \n-
    \n-
    437
    \n-
    438 template<typename TG, typename TA>
    \n-
    \n-
    439 bool operator==(const std::pair<TG,TA>& i2,
    \n-
    440 const IndexPair<TG,ParallelLocalIndex<TA> >& i1)
    \n-
    441 {
    \n-
    442 return (i1.global() == i2.first && i1.local().attribute()==i2.second);
    \n-
    443 }
    \n-
    \n-
    444
    \n-
    445 template<typename TG, typename TA>
    \n-
    \n-
    446 bool operator!=(const std::pair<TG,TA>& i2,
    \n-
    447 const IndexPair<TG,ParallelLocalIndex<TA> >& i1)
    \n-
    448 {
    \n-
    449 return (i1.global() != i2.first || i1.local().attribute()!=i2.second);
    \n-
    450 }
    \n-
    \n-
    451
    \n-
    468 template<typename T, typename A, typename A1>
    \n-
    \n-
    469 void storeGlobalIndicesOfRemoteIndices(std::map<int,SLList<std::pair<typename T::GlobalIndex, typename T::LocalIndex::Attribute>,A> >& globalMap,
    \n-
    470 const RemoteIndices<T,A1>& remoteIndices)
    \n-
    471 {
    \n-
    472 for(auto remote = remoteIndices.begin(), end =remoteIndices.end(); remote != end; ++remote) {
    \n-
    473 typedef typename RemoteIndices<T,A1>::RemoteIndexList RemoteIndexList;
    \n-\n-
    475 GlobalIndexList& global = globalMap[remote->first];
    \n-
    476 RemoteIndexList& rList = *(remote->second.first);
    \n-
    477
    \n-
    478 for(auto index = rList.begin(), riEnd = rList.end();
    \n-
    479 index != riEnd; ++index) {
    \n-
    480 global.push_back(std::make_pair(index->localIndexPair().global(),
    \n-
    481 index->localIndexPair().local().attribute()));
    \n-
    482 }
    \n-
    483 }
    \n-
    484 }
    \n-
    \n-
    485
    \n-
    494 template<typename T, typename A, typename A1>
    \n-
    \n-
    495 inline void repairLocalIndexPointers(std::map<int,
    \n-
    496 SLList<std::pair<typename T::GlobalIndex,
    \n-
    497 typename T::LocalIndex::Attribute>,A> >& globalMap,
    \n-
    498 RemoteIndices<T,A1>& remoteIndices,
    \n-
    499 const T& indexSet)
    \n-
    500 {
    \n-
    501 assert(globalMap.size()==static_cast<std::size_t>(remoteIndices.neighbours()));
    \n-
    502 // Repair pointers to index set in remote indices.
    \n-
    503 auto global = globalMap.begin();
    \n-
    504 auto end = remoteIndices.remoteIndices_.end();
    \n-
    505
    \n-
    506 for(auto remote = remoteIndices.remoteIndices_.begin(); remote != end; ++remote, ++global) {
    \n-
    507 assert(remote->first==global->first);
    \n-
    508 assert(remote->second.first->size() == global->second.size());
    \n-
    509
    \n-
    510 auto riEnd = remote->second.first->end();
    \n-
    511 auto rIndex = remote->second.first->begin();
    \n-
    512 auto gIndex = global->second.begin();
    \n-
    513 auto index = indexSet.begin();
    \n-
    514
    \n-
    515 assert(rIndex==riEnd || gIndex != global->second.end());
    \n-
    516 while(rIndex != riEnd) {
    \n-
    517 // Search for the index in the set.
    \n-
    518 assert(gIndex != global->second.end());
    \n-
    519
    \n-
    520 while(!(index->global() == gIndex->first
    \n-
    521 && index->local().attribute() == gIndex->second)) {
    \n-
    522 ++index;
    \n-
    523 // this is only needed for ALU, where there may exist
    \n-
    524 // more entries with the same global index in the remote index set
    \n-
    525 // than in the index set
    \n-
    526 if (index->global() > gIndex->first) {
    \n-
    527 index=indexSet.begin();
    \n-
    528 }
    \n-
    529 }
    \n-
    530
    \n-
    531 assert(index != indexSet.end() && *index == *gIndex);
    \n-
    532
    \n-
    533 rIndex->localIndex_ = &(*index);
    \n-
    534 ++index;
    \n-
    535 ++rIndex;
    \n-
    536 ++gIndex;
    \n-
    537 }
    \n-
    538 }
    \n-
    539 remoteIndices.sourceSeqNo_ = remoteIndices.source_->seqNo();
    \n-
    540 remoteIndices.destSeqNo_ = remoteIndices.target_->seqNo();
    \n-
    541 }
    \n-
    \n-
    542
    \n-
    543 template<typename T>
    \n-
    \n-\n-
    545 RemoteIndices& remoteIndices)
    \n-
    546 : indexSet_(indexSet), remoteIndices_(remoteIndices)
    \n-
    547 {
    \n-
    548 // index sets must match.
    \n-
    549 assert(remoteIndices.source_ == remoteIndices.target_);
    \n-
    550 assert(remoteIndices.source_ == &indexSet);
    \n-
    551 MPI_Comm_rank(remoteIndices_.communicator(), &rank_);
    \n-
    552 }
    \n-
    \n-
    553
    \n-
    554 template<typename T>
    \n-
    \n-\n-
    556 GlobalIndexList& globalIndices,
    \n-
    557 BoolList& booleans)
    \n-
    558 : iterators_(remoteIndices.beginModify(), globalIndices.beginModify(),
    \n-
    559 booleans.beginModify(), remoteIndices.end())
    \n-
    560 { }
    \n-
    \n-
    561
    \n-
    562 template<typename T>
    \n-
    \n-\n-
    564 : iterators_()
    \n-
    565 {}
    \n-
    \n-
    566
    \n-
    567 template<typename T>
    \n-
    \n-\n-
    569 {
    \n-
    570 ++(std::get<0>(iterators_));
    \n-
    571 ++(std::get<1>(iterators_));
    \n-
    572 ++(std::get<2>(iterators_));
    \n-
    573 return *this;
    \n-
    574 }
    \n-
    \n-
    575
    \n-
    576 template<typename T>
    \n-
    \n-\n-
    578 const std::pair<GlobalIndex,Attribute>& global)
    \n-
    579 {
    \n-
    580 std::get<0>(iterators_).insert(index);
    \n-
    581 std::get<1>(iterators_).insert(global);
    \n-
    582 std::get<2>(iterators_).insert(false);
    \n-
    583 }
    \n-
    \n-
    584
    \n-
    585 template<typename T>
    \n-
    586 inline typename IndicesSyncer<T>::RemoteIndex&
    \n-
    \n-\n-
    588 {
    \n-
    589 return *(std::get<0>(iterators_));
    \n-
    590 }
    \n-
    \n-
    591
    \n-
    592 template<typename T>
    \n-
    593 inline std::pair<typename IndicesSyncer<T>::GlobalIndex,typename IndicesSyncer<T>::Attribute>&
    \n-
    \n-\n-
    595 {
    \n-
    596 return *(std::get<1>(iterators_));
    \n-
    597 }
    \n-
    \n-
    598
    \n-
    599 template<typename T>
    \n-
    \n-\n-
    601 {
    \n-
    602 return *(std::get<2>(iterators_));
    \n-
    603 }
    \n-
    \n-
    604
    \n-
    605 template<typename T>
    \n-
    \n-\n-
    607 GlobalIndexList& globalIndices,
    \n-
    608 BoolList& booleans)
    \n-
    609 {
    \n-
    610 std::get<0>(iterators_) = remoteIndices.beginModify();
    \n-
    611 std::get<1>(iterators_) = globalIndices.beginModify();
    \n-
    612 std::get<2>(iterators_) = booleans.beginModify();
    \n-
    613 }
    \n-
    \n-
    614
    \n-
    615 template<typename T>
    \n-
    \n-\n-
    617 {
    \n-
    618 return std::get<0>(iterators_) != std::get<3>(iterators_);
    \n-
    619 }
    \n-
    \n-
    620
    \n-
    621 template<typename T>
    \n-
    \n-\n-
    623 {
    \n-
    624 return std::get<0>(iterators_) == std::get<3>(iterators_);
    \n-
    625 }
    \n-
    \n-
    626
    \n-
    627 template<typename T>
    \n-\n-
    629 {
    \n-
    630 MPI_Datatype type[2] = {MPI_INT, MPI_INT};
    \n-
    631 int blocklength[2] = {1,1};
    \n-
    632 MPI_Aint displacement[2];
    \n-
    633 MPI_Aint base;
    \n-
    634
    \n-
    635 // Compute displacement
    \n-
    636 MessageInformation message;
    \n-
    637
    \n-
    638 MPI_Get_address( &(message.publish), displacement);
    \n-
    639 MPI_Get_address( &(message.pairs), displacement+1);
    \n-
    640
    \n-
    641 // Make the displacement relative
    \n-
    642 MPI_Get_address(&message, &base);
    \n-
    643 displacement[0] -= base;
    \n-
    644 displacement[1] -= base;
    \n-
    645
    \n-
    646 MPI_Type_create_struct( 2, blocklength, displacement, type, &datatype_);
    \n-
    647 MPI_Type_commit(&datatype_);
    \n-
    648 }
    \n-
    649
    \n-
    650 template<typename T>
    \n-
    651 void IndicesSyncer<T>::calculateMessageSizes()
    \n-
    652 {
    \n-
    653 auto iEnd = indexSet_.end();
    \n-
    654 auto collIter = remoteIndices_.template iterator<true>();
    \n-
    655
    \n-
    656 for(auto index = indexSet_.begin(); index != iEnd; ++index) {
    \n-
    657 collIter.advance(index->global(), index->local().attribute());
    \n-
    658 if(collIter.empty())
    \n-
    659 break;
    \n-
    660 int knownRemote=0;
    \n-
    661 auto end = collIter.end();
    \n-
    662
    \n-
    663 // Count the remote indices we know.
    \n-
    664 for(auto valid = collIter.begin(); valid != end; ++valid) {
    \n-
    665 ++knownRemote;
    \n-
    666 }
    \n-
    667
    \n-
    668 if(knownRemote>0) {
    \n-
    669 Dune::dverb<<rank_<<": publishing "<<knownRemote<<" for index "<<index->global()<< " for processes ";
    \n-
    670
    \n-
    671 // Update MessageInformation
    \n-
    672 for(auto valid = collIter.begin(); valid != end; ++valid) {
    \n-
    673 ++(infoSend_[valid.process()].publish);
    \n-
    674 (infoSend_[valid.process()].pairs) += knownRemote;
    \n-
    675 Dune::dverb<<valid.process()<<" ";
    \n-
    676 Dune::dverb<<"(publish="<<infoSend_[valid.process()].publish<<", pairs="<<infoSend_[valid.process()].pairs
    \n-
    677 <<") ";
    \n-
    678 }
    \n-
    679 Dune::dverb<<std::endl;
    \n-
    680 }
    \n-
    681 }
    \n-
    682
    \n-
    683 const auto end = infoSend_.end();
    \n-
    684
    \n-
    685 // Now determine the buffersizes needed for each neighbour using MPI_Pack_size
    \n-
    686 MessageInformation dummy;
    \n-
    687
    \n-
    688 auto messageIter= infoSend_.begin();
    \n-
    689 const auto rend = remoteIndices_.end();
    \n-
    690 int neighbour=0;
    \n-
    691
    \n-
    692 for(auto remote = remoteIndices_.begin(); remote != rend; ++remote, ++neighbour) {
    \n-
    693 MessageInformation* message;
    \n-
    694 MessageInformation recv;
    \n-
    695
    \n-
    696 if(messageIter != end && messageIter->first==remote->first) {
    \n-
    697 // We want to send message information to that process
    \n-
    698 message = const_cast<MessageInformation*>(&(messageIter->second));
    \n-
    699 ++messageIter;
    \n-
    700 }else
    \n-
    701 // We do not want to send information but the other process might.
    \n-
    702 message = &dummy;
    \n-
    703
    \n-
    704 sendBufferSizes_[neighbour]=0;
    \n-
    705 int tsize;
    \n-
    706 // The number of indices published
    \n-
    707 MPI_Pack_size(1, MPI_INT,remoteIndices_.communicator(), &tsize);
    \n-
    708 sendBufferSizes_[neighbour] += tsize;
    \n-
    709
    \n-
    710 for(int i=0; i < message->publish; ++i) {
    \n-
    711 // The global index
    \n-
    712 MPI_Pack_size(1, MPITraits<GlobalIndex>::getType(), remoteIndices_.communicator(), &tsize);
    \n-
    713 sendBufferSizes_[neighbour] += tsize;
    \n-
    714 // The attribute in the local index
    \n-
    715 MPI_Pack_size(1, MPI_CHAR, remoteIndices_.communicator(), &tsize);
    \n-
    716 sendBufferSizes_[neighbour] += tsize;
    \n-
    717 // The number of corresponding remote indices
    \n-
    718 MPI_Pack_size(1, MPI_INT, remoteIndices_.communicator(), &tsize);
    \n-
    719 sendBufferSizes_[neighbour] += tsize;
    \n-
    720 }
    \n-
    721 for(int i=0; i < message->pairs; ++i) {
    \n-
    722 // The process of the remote index
    \n-
    723 MPI_Pack_size(1, MPI_INT, remoteIndices_.communicator(), &tsize);
    \n-
    724 sendBufferSizes_[neighbour] += tsize;
    \n-
    725 // The attribute of the remote index
    \n-
    726 MPI_Pack_size(1, MPI_CHAR, remoteIndices_.communicator(), &tsize);
    \n-
    727 sendBufferSizes_[neighbour] += tsize;
    \n-
    728 }
    \n-
    729
    \n-
    730 Dune::dverb<<rank_<<": Buffer (neighbour="<<remote->first<<") size is "<< sendBufferSizes_[neighbour]<<" for publish="<<message->publish<<" pairs="<<message->pairs<<std::endl;
    \n-
    731 }
    \n-
    732
    \n-
    733 }
    \n-
    734
    \n-
    735 template<typename T>
    \n-
    \n-\n-
    737 {
    \n-
    738 DefaultNumberer numberer;
    \n-
    739 sync(numberer);
    \n-
    740 }
    \n-
    \n-
    741
    \n-
    742 template<typename T>
    \n-
    743 template<typename T1>
    \n-
    \n-
    744 void IndicesSyncer<T>::sync(T1& numberer, bool useFixedOrder)
    \n-
    745 {
    \n-
    746 // The pointers to the local indices in the remote indices
    \n-
    747 // will become invalid due to the resorting of the index set.
    \n-
    748 // Therefore store the corresponding global indices.
    \n-
    749 // Mark all indices as not added
    \n-
    750 const auto end = remoteIndices_.end();
    \n-
    751
    \n-
    752 // Number of neighbours might change during the syncing.
    \n-
    753 // save the old neighbours
    \n-
    754 std::size_t noOldNeighbours = remoteIndices_.neighbours();
    \n-
    755 int* oldNeighbours = new int[noOldNeighbours];
    \n-
    756 sendBufferSizes_ = new std::size_t[noOldNeighbours];
    \n-
    757 std::size_t neighbourI = 0;
    \n-
    758
    \n-
    759 for(auto remote = remoteIndices_.begin(); remote != end; ++remote, ++neighbourI) {
    \n-
    760 oldNeighbours[neighbourI] = remote->first;
    \n-
    761
    \n-
    762 // Make sure we only have one remote index list.
    \n-
    763 assert(remote->second.first==remote->second.second);
    \n-
    764
    \n-
    765 RemoteIndexList& rList = *(remote->second.first);
    \n-
    766
    \n-
    767 // Store the corresponding global indices.
    \n-
    768 GlobalIndexList& global = globalMap_[remote->first];
    \n-
    769 BoolList& added = oldMap_[remote->first];
    \n-
    770 auto riEnd = rList.end();
    \n-
    771
    \n-
    772 for(auto index = rList.begin();
    \n-
    773 index != riEnd; ++index) {
    \n-
    774 global.push_back(std::make_pair(index->localIndexPair().global(),
    \n-
    775 index->localIndexPair().local().attribute()));
    \n-
    776 added.push_back(true);
    \n-
    777 }
    \n-
    778
    \n-
    779 Iterators iterators(rList, global, added);
    \n-
    780 iteratorsMap_.insert(std::make_pair(remote->first, iterators));
    \n-
    781 assert(checkReset(iteratorsMap_[remote->first], rList,global,added));
    \n-
    782 }
    \n-
    783
    \n-
    784 // Exchange indices with each neighbour
    \n-
    785 calculateMessageSizes();
    \n-
    786
    \n-
    787 // Allocate the buffers
    \n-
    788 receiveBufferSize_=1;
    \n-
    789 sendBuffers_ = new char*[noOldNeighbours];
    \n-
    790
    \n-
    791 for(std::size_t i=0; i<noOldNeighbours; ++i) {
    \n-
    792 sendBuffers_[i] = new char[sendBufferSizes_[i]];
    \n-
    793 receiveBufferSize_ = std::max(receiveBufferSize_, static_cast<int>(sendBufferSizes_[i]));
    \n-
    794 }
    \n-
    795
    \n-
    796 receiveBuffer_=new char[receiveBufferSize_];
    \n-
    797
    \n-
    798 indexSet_.beginResize();
    \n-
    799
    \n-
    800 Dune::dverb<<rank_<<": Neighbours: ";
    \n-
    801
    \n-
    802 for(std::size_t i = 0; i<noOldNeighbours; ++i)
    \n-
    803 Dune::dverb<<oldNeighbours[i]<<" ";
    \n-
    804
    \n-
    805 Dune::dverb<<std::endl;
    \n-
    806
    \n-
    807 MPI_Request* requests = new MPI_Request[noOldNeighbours];
    \n-
    808 MPI_Status* statuses = new MPI_Status[noOldNeighbours];
    \n-
    809
    \n-
    810 // Pack Message data and start the sends
    \n-
    811 for(std::size_t i = 0; i<noOldNeighbours; ++i)
    \n-
    812 packAndSend(oldNeighbours[i], sendBuffers_[i], sendBufferSizes_[i], requests[i]);
    \n-
    813
    \n-
    814 // Probe for incoming messages, receive and unpack them
    \n-
    815 for(std::size_t i = 0; i<noOldNeighbours; ++i)
    \n-
    816 recvAndUnpack(numberer, oldNeighbours[i], useFixedOrder);
    \n-
    817 // }else{
    \n-
    818 // recvAndUnpack(oldNeighbours[i], numberer);
    \n-
    819 // packAndSend(oldNeighbours[i]);
    \n-
    820 // }
    \n-
    821 // }
    \n-
    822
    \n-
    823 delete[] receiveBuffer_;
    \n-
    824
    \n-
    825 // Wait for the completion of the sends
    \n-
    826 // Wait for completion of sends
    \n-
    827 if(MPI_SUCCESS!=MPI_Waitall(noOldNeighbours, requests, statuses)) {
    \n-
    828 std::cerr<<": MPI_Error occurred while sending message"<<std::endl;
    \n-
    829 for(std::size_t i=0; i< noOldNeighbours; i++)
    \n-
    830 if(MPI_SUCCESS!=statuses[i].MPI_ERROR)
    \n-
    831 std::cerr<<"Destination "<<statuses[i].MPI_SOURCE<<" error code: "<<statuses[i].MPI_ERROR<<std::endl;
    \n-
    832 }
    \n-
    833
    \n-
    834 delete[] statuses;
    \n-
    835 delete[] requests;
    \n-
    836
    \n-
    837 for(std::size_t i=0; i<noOldNeighbours; ++i)
    \n-
    838 delete[] sendBuffers_[i];
    \n-
    839
    \n-
    840 delete[] sendBuffers_;
    \n-
    841 delete[] sendBufferSizes_;
    \n-
    842
    \n-
    843 // No need for the iterator tuples any more
    \n-
    844 iteratorsMap_.clear();
    \n-
    845
    \n-
    846 indexSet_.endResize();
    \n-
    847
    \n-
    848 delete[] oldNeighbours;
    \n-
    849
    \n-
    850 repairLocalIndexPointers(globalMap_, remoteIndices_, indexSet_);
    \n-
    851
    \n-
    852 oldMap_.clear();
    \n-
    853 globalMap_.clear();
    \n-
    854
    \n-
    855 // update the sequence number
    \n-
    856 remoteIndices_.sourceSeqNo_ = remoteIndices_.destSeqNo_ = indexSet_.seqNo();
    \n-
    857 }
    \n-
    \n-
    858
    \n-
    859 template<typename T>
    \n-
    860 void IndicesSyncer<T>::packAndSend(int destination, char* buffer, std::size_t bufferSize, MPI_Request& request)
    \n-
    861 {
    \n-
    862 auto iEnd = indexSet_.end();
    \n-
    863 int bpos = 0;
    \n-
    864 int published = 0;
    \n-
    865 int pairs = 0;
    \n-
    866
    \n-
    867 assert(checkReset());
    \n-
    868
    \n-
    869 // Pack the number of indices we publish
    \n-
    870 MPI_Pack(&(infoSend_[destination].publish), 1, MPI_INT, buffer, bufferSize, &bpos,
    \n-
    871 remoteIndices_.communicator());
    \n-
    872
    \n-
    873 for(auto index = indexSet_.begin(); index != iEnd; ++index) {
    \n-
    874 // Search for corresponding remote indices in all iterator tuples
    \n-
    875 auto iteratorsEnd = iteratorsMap_.end();
    \n-
    876
    \n-
    877 // advance all iterators to a position with global index >= index->global()
    \n-
    878 for(auto iterators = iteratorsMap_.begin(); iteratorsEnd != iterators; ++iterators) {
    \n-
    879 while(iterators->second.isNotAtEnd() &&
    \n-
    880 iterators->second.globalIndexPair().first < index->global())
    \n-
    881 ++(iterators->second);
    \n-
    882 assert(!iterators->second.isNotAtEnd() || iterators->second.globalIndexPair().first >= index->global());
    \n-
    883 }
    \n-
    884
    \n-
    885 // Add all remote indices positioned at global which were already present before calling sync
    \n-
    886 // to the message.
    \n-
    887 // Count how many remote indices we will send
    \n-
    888 int indices = 0;
    \n-
    889 bool knownRemote = false; // Is the remote process supposed to know this index?
    \n-
    890
    \n-
    891 for(auto iterators = iteratorsMap_.begin(); iteratorsEnd != iterators; ++iterators)
    \n-
    892 {
    \n-
    893 std::pair<GlobalIndex,Attribute> p;
    \n-
    894 if (iterators->second.isNotAtEnd())
    \n-
    895 {
    \n-
    896 p = iterators->second.globalIndexPair();
    \n-
    897 }
    \n-
    898
    \n-
    899 if(iterators->second.isNotAtEnd() && iterators->second.isOld()
    \n-
    900 && iterators->second.globalIndexPair().first == index->global()) {
    \n-
    901 indices++;
    \n-
    902 if(destination == iterators->first)
    \n-
    903 knownRemote = true;
    \n-
    904 }
    \n-
    905 }
    \n-
    906
    \n-
    907 if(!knownRemote)
    \n-
    908 // We do not need to send any indices
    \n-
    909 continue;
    \n-
    910
    \n-
    911 Dune::dverb<<rank_<<": sending "<<indices<<" for index "<<index->global()<<" to "<<destination<<std::endl;
    \n-
    912
    \n-
    913
    \n-
    914 // Pack the global index, the attribute and the number
    \n-
    915 MPI_Pack(const_cast<GlobalIndex*>(&(index->global())), 1, MPITraits<GlobalIndex>::getType(), buffer, bufferSize, &bpos,
    \n-
    916 remoteIndices_.communicator());
    \n-
    917
    \n-
    918 char attr = index->local().attribute();
    \n-
    919 MPI_Pack(&attr, 1, MPI_CHAR, buffer, bufferSize, &bpos,
    \n-
    920 remoteIndices_.communicator());
    \n-
    921
    \n-
    922 // Pack the number of remote indices we send.
    \n-
    923 MPI_Pack(&indices, 1, MPI_INT, buffer, bufferSize, &bpos,
    \n-
    924 remoteIndices_.communicator());
    \n-
    925
    \n-
    926 // Pack the information about the remote indices
    \n-
    927 for(auto iterators = iteratorsMap_.begin(); iteratorsEnd != iterators; ++iterators)
    \n-
    928 if(iterators->second.isNotAtEnd() && iterators->second.isOld()
    \n-
    929 && iterators->second.globalIndexPair().first == index->global()) {
    \n-
    930 int process = iterators->first;
    \n-
    931
    \n-
    932 ++pairs;
    \n-
    933 assert(pairs <= infoSend_[destination].pairs);
    \n-
    934 MPI_Pack(&process, 1, MPI_INT, buffer, bufferSize, &bpos,
    \n-
    935 remoteIndices_.communicator());
    \n-
    936 char attr2 = iterators->second.remoteIndex().attribute();
    \n-
    937
    \n-
    938 MPI_Pack(&attr2, 1, MPI_CHAR, buffer, bufferSize, &bpos,
    \n-
    939 remoteIndices_.communicator());
    \n-
    940 --indices;
    \n-
    941 }
    \n-
    942 assert(indices==0);
    \n-
    943 ++published;
    \n-
    944 Dune::dvverb<<" (publish="<<published<<", pairs="<<pairs<<")"<<std::endl;
    \n-
    945 assert(published <= infoSend_[destination].publish);
    \n-
    946 }
    \n-
    947
    \n-
    948 // Make sure we send all expected entries
    \n-
    949 assert(published == infoSend_[destination].publish);
    \n-
    950 assert(pairs == infoSend_[destination].pairs);
    \n-
    951 resetIteratorsMap();
    \n-
    952
    \n-
    953 Dune::dverb << rank_<<": Sending message of "<<bpos<<" bytes to "<<destination<<std::endl;
    \n-
    954
    \n-
    955 MPI_Issend(buffer, bpos, MPI_PACKED, destination, 345, remoteIndices_.communicator(),&request);
    \n-
    956 }
    \n-
    957
    \n-
    958 template<typename T>
    \n-
    959 inline void IndicesSyncer<T>::insertIntoRemoteIndexList(int process,
    \n-
    960 const std::pair<GlobalIndex,Attribute>& globalPair,
    \n-
    961 char attribute)
    \n-
    962 {
    \n-
    963 Dune::dverb<<"Inserting from "<<process<<" "<<globalPair.first<<", "<<
    \n-
    964 globalPair.second<<" "<<attribute<<std::endl;
    \n-
    965
    \n-
    966 resetIteratorsMap();
    \n-
    967
    \n-
    968 // There might be cases where there no remote indices for that process yet
    \n-
    969 typename IteratorsMap::iterator found = iteratorsMap_.find(process);
    \n-
    970
    \n-
    971 if( found == iteratorsMap_.end() ) {
    \n-
    972 Dune::dverb<<"Discovered new neighbour "<<process<<std::endl;
    \n-
    973 RemoteIndexList* rlist = new RemoteIndexList();
    \n-
    974 remoteIndices_.remoteIndices_.insert(std::make_pair(process,std::make_pair(rlist,rlist)));
    \n-
    975 Iterators iterators = Iterators(*rlist, globalMap_[process], oldMap_[process]);
    \n-
    976 found = iteratorsMap_.insert(std::make_pair(process, iterators)).first;
    \n-
    977 }
    \n-
    978
    \n-
    979 Iterators& iterators = found->second;
    \n-
    980
    \n-
    981 // Search for the remote index
    \n-
    982 while(iterators.isNotAtEnd() && iterators.globalIndexPair() < globalPair) {
    \n-
    983 // Increment all iterators
    \n-
    984 ++iterators;
    \n-
    985
    \n-
    986 }
    \n-
    987
    \n-
    988 if(iterators.isAtEnd() || iterators.globalIndexPair() != globalPair) {
    \n-
    989 // The entry is not yet known
    \n-
    990 // Insert in the list and do not change the first iterator.
    \n-
    991 iterators.insert(RemoteIndex(Attribute(attribute)),globalPair);
    \n-
    992 return;
    \n-
    993 }
    \n-
    994
    \n-
    995 // Global indices match
    \n-
    996 bool indexIsThere=false;
    \n-
    997 for(Iterators tmpIterators = iterators;
    \n-
    998 !tmpIterators.isAtEnd() && tmpIterators.globalIndexPair() == globalPair;
    \n-
    999 ++tmpIterators)
    \n-
    1000 //entry already exists with the same attribute
    \n-
    1001 if(tmpIterators.globalIndexPair().second == attribute) {
    \n-
    1002 indexIsThere=true;
    \n-
    1003 break;
    \n-
    1004 }
    \n-
    1005
    \n-
    1006 if(!indexIsThere)
    \n-
    1007 // The entry is not yet known
    \n-
    1008 // Insert in the list and do not change the first iterator.
    \n-
    1009 iterators.insert(RemoteIndex(Attribute(attribute)),globalPair);
    \n-
    1010 }
    \n-
    1011
    \n-
    1012 template<typename T>
    \n-
    1013 template<typename T1>
    \n-
    1014 void IndicesSyncer<T>::recvAndUnpack(T1& numberer, int hardSource, bool useHardSource)
    \n-
    1015 {
    \n-
    1016 const ParallelIndexSet& constIndexSet = indexSet_;
    \n-
    1017 auto iEnd = constIndexSet.end();
    \n-
    1018 auto index = constIndexSet.begin();
    \n-
    1019 int bpos = 0;
    \n-
    1020 int publish;
    \n-
    1021
    \n-
    1022 assert(checkReset());
    \n-
    1023
    \n-
    1024 MPI_Status status;
    \n-
    1025
    \n-
    1026 // We have to determine the message size and source before the receive
    \n-
    1027
    \n-
    1028 MPI_Probe(useHardSource ? hardSource : MPI_ANY_SOURCE, 345, remoteIndices_.communicator(), &status);
    \n-
    1029
    \n-
    1030 int source=status.MPI_SOURCE;
    \n-
    1031 int count;
    \n-
    1032 MPI_Get_count(&status, MPI_PACKED, &count);
    \n-
    1033
    \n-
    1034 Dune::dvverb<<rank_<<": Receiving message from "<< source<<" with "<<count<<" bytes"<<std::endl;
    \n-
    1035
    \n-
    1036 if(count>receiveBufferSize_) {
    \n-
    1037 receiveBufferSize_=count;
    \n-
    1038 delete[] receiveBuffer_;
    \n-
    1039 receiveBuffer_ = new char[receiveBufferSize_];
    \n-
    1040 }
    \n-
    1041
    \n-
    1042 MPI_Recv(receiveBuffer_, count, MPI_PACKED, source, 345, remoteIndices_.communicator(), &status);
    \n-
    1043
    \n-
    1044 // How many global entries were published?
    \n-
    1045 MPI_Unpack(receiveBuffer_, count, &bpos, &publish, 1, MPI_INT, remoteIndices_.communicator());
    \n-
    1046
    \n-
    1047 // Now unpack the remote indices and add them.
    \n-
    1048 while(publish>0) {
    \n-
    1049
    \n-
    1050 // Unpack information about the local index on the source process
    \n-
    1051 GlobalIndex global; // global index of the current entry
    \n-
    1052 char sourceAttribute; // Attribute on the source process
    \n-
    1053 int pairs;
    \n-
    1054
    \n-
    1055 MPI_Unpack(receiveBuffer_, count, &bpos, &global, 1, MPITraits<GlobalIndex>::getType(),
    \n-
    1056 remoteIndices_.communicator());
    \n-
    1057 MPI_Unpack(receiveBuffer_, count, &bpos, &sourceAttribute, 1, MPI_CHAR,
    \n-
    1058 remoteIndices_.communicator());
    \n-
    1059 MPI_Unpack(receiveBuffer_, count, &bpos, &pairs, 1, MPI_INT,
    \n-
    1060 remoteIndices_.communicator());
    \n-
    1061
    \n-
    1062 // Insert the entry on the remote process to our
    \n-
    1063 // remote index list
    \n-
    1064 SLList<std::pair<int,Attribute> > sourceAttributeList;
    \n-
    1065 sourceAttributeList.push_back(std::make_pair(source,Attribute(sourceAttribute)));
    \n-
    1066#ifndef NDEBUG
    \n-
    1067 bool foundSelf = false;
    \n-
    1068#endif
    \n-
    1069 Attribute myAttribute=Attribute();
    \n-
    1070
    \n-
    1071 // Unpack the remote indices
    \n-
    1072 for(; pairs>0; --pairs) {
    \n-
    1073 // Unpack the process id that knows the index
    \n-
    1074 int process;
    \n-
    1075 char attribute;
    \n-
    1076 MPI_Unpack(receiveBuffer_, count, &bpos, &process, 1, MPI_INT,
    \n-
    1077 remoteIndices_.communicator());
    \n-
    1078 // Unpack the attribute
    \n-
    1079 MPI_Unpack(receiveBuffer_, count, &bpos, &attribute, 1, MPI_CHAR,
    \n-
    1080 remoteIndices_.communicator());
    \n-
    1081
    \n-
    1082 if(process==rank_) {
    \n-
    1083#ifndef NDEBUG
    \n-
    1084 foundSelf=true;
    \n-
    1085#endif
    \n-
    1086 myAttribute=Attribute(attribute);
    \n-
    1087 // Now we know the local attribute of the global index
    \n-
    1088 //Only add the index if it is unknown.
    \n-
    1089 // Do we know that global index already?
    \n-
    1090 auto pos = std::lower_bound(index, iEnd, IndexPair(global));
    \n-
    1091
    \n-
    1092 if(pos == iEnd || pos->global() != global) {
    \n-
    1093 // no entry with this global index
    \n-
    1094 indexSet_.add(global,
    \n-
    1095 ParallelLocalIndex<Attribute>(numberer(global),
    \n-
    1096 myAttribute, true));
    \n-
    1097 Dune::dvverb << "Adding "<<global<<" "<<myAttribute<<std::endl;
    \n-
    1098 continue;
    \n-
    1099 }
    \n-
    1100
    \n-
    1101 // because of above the global indices match. Add only if the attribute is different
    \n-
    1102 bool indexIsThere = false;
    \n-
    1103 index=pos;
    \n-
    1104
    \n-
    1105 for(; pos->global()==global; ++pos)
    \n-
    1106 if(pos->local().attribute() == myAttribute) {
    \n-
    1107 Dune::dvverb<<"found "<<global<<" "<<myAttribute<<std::endl;
    \n-
    1108 indexIsThere = true;
    \n-
    1109 break;
    \n-
    1110 }
    \n-
    1111
    \n-
    1112 if(!indexIsThere) {
    \n-
    1113 indexSet_.add(global,
    \n-
    1114 ParallelLocalIndex<Attribute>(numberer(global),
    \n-
    1115 myAttribute, true));
    \n-
    1116 Dune::dvverb << "Adding "<<global<<" "<<myAttribute<<std::endl;
    \n-
    1117 }
    \n-
    1118
    \n-
    1119 }else{
    \n-
    1120 sourceAttributeList.push_back(std::make_pair(process,Attribute(attribute)));
    \n-
    1121 }
    \n-
    1122 }
    \n-
    1123 assert(foundSelf);
    \n-
    1124 // Insert remote indices
    \n-
    1125 typedef typename SLList<std::pair<int,Attribute> >::const_iterator Iter;
    \n-
    1126 for(Iter i=sourceAttributeList.begin(), end=sourceAttributeList.end();
    \n-
    1127 i!=end; ++i)
    \n-
    1128 insertIntoRemoteIndexList(i->first, std::make_pair(global, myAttribute),
    \n-
    1129 i->second);
    \n-
    1130 --publish;
    \n-
    1131 }
    \n-
    1132
    \n-
    1133 resetIteratorsMap();
    \n-
    1134 }
    \n-
    1135
    \n-
    1136 template<typename T>
    \n-
    1137 void IndicesSyncer<T>::resetIteratorsMap(){
    \n-
    1138
    \n-
    1139 // Reset iterators in all tuples.
    \n-
    1140 const auto remoteEnd = remoteIndices_.remoteIndices_.end();
    \n-
    1141 auto iterators = iteratorsMap_.begin();
    \n-
    1142 auto global = globalMap_.begin();
    \n-
    1143 auto added = oldMap_.begin();
    \n-
    1144
    \n-
    1145 for(auto remote = remoteIndices_.remoteIndices_.begin();
    \n-
    1146 remote != remoteEnd; ++remote, ++global, ++added, ++iterators) {
    \n-
    1147 iterators->second.reset(*(remote->second.first), global->second, added->second);
    \n-
    1148 }
    \n-
    1149 }
    \n-
    1150
    \n-
    1151 template<typename T>
    \n-
    1152 bool IndicesSyncer<T>::checkReset(const Iterators& iterators, RemoteIndexList& rList, GlobalIndexList& gList,
    \n-
    1153 BoolList& bList){
    \n-
    1154
    \n-
    1155 if(std::get<0>(iterators.iterators_) != rList.begin())
    \n-
    1156 return false;
    \n-
    1157 if(std::get<1>(iterators.iterators_) != gList.begin())
    \n-
    1158 return false;
    \n-
    1159 if(std::get<2>(iterators.iterators_) != bList.begin())
    \n-
    1160 return false;
    \n-
    1161 return true;
    \n-
    1162 }
    \n-
    1163
    \n-
    1164
    \n-
    1165 template<typename T>
    \n-
    1166 bool IndicesSyncer<T>::checkReset(){
    \n-
    1167
    \n-
    1168 // Reset iterators in all tuples.
    \n-
    1169 const auto remoteEnd = remoteIndices_.remoteIndices_.end();
    \n-
    1170 auto iterators = iteratorsMap_.begin();
    \n-
    1171 auto global = globalMap_.begin();
    \n-
    1172 auto added = oldMap_.begin();
    \n-
    1173 bool ret = true;
    \n-
    1174
    \n-
    1175 for(auto remote = remoteIndices_.remoteIndices_.begin();
    \n-
    1176 remote != remoteEnd; ++remote, ++global, ++added, ++iterators) {
    \n-
    1177 if(!checkReset(iterators->second, *(remote->second.first), global->second,
    \n-
    1178 added->second))
    \n-
    1179 ret=false;
    \n-
    1180 }
    \n-
    1181 return ret;
    \n-
    1182 }
    \n-
    1183}
    \n-
    1184
    \n-
    1185#endif // HAVE_MPI
    \n-
    1186#endif // DUNE_COMMON_PARALLEL_INDICESSYNCER_HH
    \n-
    Provides a map between global and local indices.
    \n-
    Classes describing a distributed indexset.
    \n-
    Standard Dune debug streams.
    \n-
    Implements a singly linked list together with the necessary iterators.
    \n-
    void push_back(const MemberType &item)
    Add a new entry to the end of the list.
    Definition sllist.hh:643
    \n-
    SLListIterator< T, A > iterator
    The mutable iterator of the list.
    Definition sllist.hh:69
    \n-
    iterator end()
    Get an iterator pointing to the end of the list.
    Definition sllist.hh:774
    \n-
    ModifyIterator beginModify()
    Get an iterator capable of deleting and inserting elements.
    Definition sllist.hh:787
    \n-
    SLListConstIterator< RemoteIndex, Allocator > const_iterator
    The constant iterator of the list.
    Definition sllist.hh:74
    \n-
    SLListModifyIterator< T, A > ModifyIterator
    The type of the iterator capable of deletion and insertion.
    Definition sllist.hh:103
    \n-
    iterator begin()
    Get an iterator pointing to the first element in the list.
    Definition sllist.hh:762
    \n-
    EnableIfInterOperable< T1, T2, bool >::type operator<(const RandomAccessIteratorFacade< T1, V1, R1, D > &lhs, const RandomAccessIteratorFacade< T2, V2, R2, D > &rhs)
    Comparison operator.
    Definition iteratorfacades.hh:638
    \n-
    EnableIfInterOperable< T1, T2, bool >::type operator==(const ForwardIteratorFacade< T1, V1, R1, D > &lhs, const ForwardIteratorFacade< T2, V2, R2, D > &rhs)
    Checks for equality.
    Definition iteratorfacades.hh:238
    \n-
    EnableIfInterOperable< T1, T2, bool >::type operator!=(const ForwardIteratorFacade< T1, V1, R1, D > &lhs, const ForwardIteratorFacade< T2, V2, R2, D > &rhs)
    Checks for inequality.
    Definition iteratorfacades.hh:260
    \n-
    Iterators()
    Default constructor.
    Definition indicessyncer.hh:563
    \n-
    Dune::RemoteIndices< ParallelIndexSet > RemoteIndices
    Type of the remote indices.
    Definition indicessyncer.hh:63
    \n-
    bool isOld() const
    Was this entry already in the remote index list before the sync process?
    Definition indicessyncer.hh:600
    \n-
    int publish
    The number of indices we publish for the other process.
    Definition indicessyncer.hh:132
    \n-
    void repairLocalIndexPointers(std::map< int, SLList< std::pair< typename T::GlobalIndex, typename T::LocalIndex::Attribute >, A > > &globalMap, RemoteIndices< T, A1 > &remoteIndices, const T &indexSet)
    Repair the pointers to the local indices in the remote indices.
    Definition indicessyncer.hh:495
    \n-
    bool isAtEnd() const
    Are we at the end of the list?
    Definition indicessyncer.hh:622
    \n-
    MPI_Comm communicator() const
    Get the mpi communicator used.
    Definition remoteindices.hh:1695
    \n-
    ParallelIndexSet::GlobalIndex GlobalIndex
    Type of the global index used in the index set.
    Definition indicessyncer.hh:55
    \n-
    int pairs
    The number of pairs (attribute and process number) we publish to the neighbour process.
    Definition indicessyncer.hh:137
    \n-
    const_iterator end() const
    Get an iterator over all remote index lists.
    Definition remoteindices.hh:1528
    \n-
    Attribute & attribute() const
    \n-
    Iterators & operator++()
    Increment all iterators.
    Definition indicessyncer.hh:568
    \n-
    ParallelIndexSet::LocalIndex::Attribute Attribute
    Type of the attribute used in the index set.
    Definition indicessyncer.hh:58
    \n-
    std::pair< GlobalIndex, Attribute > & globalIndexPair() const
    Get the global index of the remote index at current position.
    Definition indicessyncer.hh:594
    \n-
    IndicesSyncer(ParallelIndexSet &indexSet, RemoteIndices &remoteIndices)
    Constructor.
    Definition indicessyncer.hh:544
    \n-
    void reset(RemoteIndexList &remoteIndices, GlobalIndexList &globalIndices, BoolList &booleans)
    Reset all the underlying iterators.
    Definition indicessyncer.hh:606
    \n-
    std::size_t operator()(const GlobalIndex &global)
    Provide the local index, always std::numeric_limits<size_t>::max()
    Definition indicessyncer.hh:151
    \n-
    T ParallelIndexSet
    The type of the index set.
    Definition indicessyncer.hh:49
    \n-
    bool isNotAtEnd() const
    Are we not at the end of the list?
    Definition indicessyncer.hh:616
    \n-
    int neighbours() const
    Get the number of processors we share indices with.
    Definition remoteindices.hh:1445
    \n-
    TG GlobalIndex
    the type of the global index. This type has to provide at least a operator< for sorting.
    Definition indexset.hh:226
    \n-
    void storeGlobalIndicesOfRemoteIndices(std::map< int, SLList< std::pair< typename T::GlobalIndex, typename T::LocalIndex::Attribute >, A > > &globalMap, const RemoteIndices< T, A1 > &remoteIndices)
    Stores the corresponding global indices of the remote index information.
    Definition indicessyncer.hh:469
    \n-
    void sync()
    Sync the index set.
    Definition indicessyncer.hh:736
    \n-
    int seqNo() const
    Get the internal sequence number.
    \n-
    ParallelIndexSet::IndexPair IndexPair
    The type of the index pair.
    Definition indicessyncer.hh:52
    \n-
    const_iterator begin() const
    Get an iterator over all remote index lists.
    Definition remoteindices.hh:1521
    \n-
    RemoteIndex & remoteIndex() const
    Get the remote index at current position.
    Definition indicessyncer.hh:587
    \n-
    MessageInformation()
    Definition indicessyncer.hh:128
    \n-
    void insert(const RemoteIndex &index, const std::pair< GlobalIndex, Attribute > &global)
    Insert a new remote index to the underlying remote index list.
    Definition indicessyncer.hh:577
    \n-
    DVVerbType dvverb(std::cout)
    stream for very verbose output.
    Definition stdstreams.hh:96
    \n-
    DVerbType dverb(std::cout)
    Singleton of verbose debug stream.
    Definition stdstreams.hh:117
    \n-
    Dune namespace.
    Definition alignedallocator.hh:13
    \n-
    static MPI_Datatype getType()
    Definition mpitraits.hh:48
    \n-
    A pair consisting of a global and local index.
    Definition indexset.hh:85
    \n-
    Class for recomputing missing indices of a distributed index set.
    Definition indicessyncer.hh:45
    \n-
    An index present on the local process with an additional attribute flag.
    Definition plocalindex.hh:52
    \n-
    The indices present on remote processes.
    Definition remoteindices.hh:190
    \n-
    typename std::allocator_traits< A >::template rebind_alloc< RemoteIndex > Allocator
    The type of the allocator for the remote index list.
    Definition remoteindices.hh:238
    \n-
    Information about an index residing on another processor.
    Definition remoteindices.hh:74
    \n-
    A mutable iterator for the SLList.
    Definition sllist.hh:271
    \n-
    A single linked list.
    Definition sllist.hh:44
    \n+Go to the documentation of this file.
    1// SPDX-FileCopyrightInfo: Copyright \u00a9 DUNE Project contributors, see file LICENSE.md in module root
    \n+
    2// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception
    \n+
    3// Will be removed after the 2.7 release
    \n+
    4#warning "Deprecated header, use #include <dune/common/parallel/communication.hh> instead!"
    \n+\n+
    Implements an utility class that provides collective communication methods for sequential programs.
    \n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,1211 +1,21 @@\n dune-common\u00a02.10\n Loading...\n Searching...\n No Matches\n * _\bd_\bu_\bn_\be\n * _\bc_\bo_\bm_\bm_\bo_\bn\n * _\bp_\ba_\br_\ba_\bl_\bl_\be_\bl\n-indicessyncer.hh\n+collectivecommunication.hh\n _\bG_\bo_\b _\bt_\bo_\b _\bt_\bh_\be_\b _\bd_\bo_\bc_\bu_\bm_\be_\bn_\bt_\ba_\bt_\bi_\bo_\bn_\b _\bo_\bf_\b _\bt_\bh_\bi_\bs_\b _\bf_\bi_\bl_\be_\b.\n-1// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-\n-2// vi: set et ts=4 sw=2 sts=2:\n-3// SPDX-FileCopyrightInfo: Copyright \u00c2\u00a9 DUNE Project contributors, see file\n+1// SPDX-FileCopyrightInfo: Copyright \u00c2\u00a9 DUNE Project contributors, see file\n LICENSE.md in module root\n-4// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception\n-5#ifndef DUNE_COMMON_PARALLEL_INDICESSYNCER_HH\n-6#define DUNE_COMMON_PARALLEL_INDICESSYNCER_HH\n-7\n-8#if HAVE_MPI\n-9\n-10#include \n-11#include \n-12#include \n-13#include \n-14#include \n-15#include \n-16#include \n-17\n-18#include \n-19\n-20#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bs_\bt_\bd_\bs_\bt_\br_\be_\ba_\bm_\bs_\b._\bh_\bh>\n-21#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bs_\bl_\bl_\bi_\bs_\bt_\b._\bh_\bh>\n-22#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bp_\ba_\br_\ba_\bl_\bl_\be_\bl_\b/_\bi_\bn_\bd_\be_\bx_\bs_\be_\bt_\b._\bh_\bh>\n-23#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bp_\ba_\br_\ba_\bl_\bl_\be_\bl_\b/_\br_\be_\bm_\bo_\bt_\be_\bi_\bn_\bd_\bi_\bc_\be_\bs_\b._\bh_\bh>\n-24\n-25namespace _\bD_\bu_\bn_\be\n-26{\n-43 template\n-_\b4_\b4 class _\bI_\bn_\bd_\bi_\bc_\be_\bs_\bS_\by_\bn_\bc_\be_\br\n-45 {\n-46 public:\n-47\n-_\b4_\b9 typedef T _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt;\n-50\n-_\b5_\b2 typedef typename _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt_\b:_\b:_\bI_\bn_\bd_\be_\bx_\bP_\ba_\bi_\br _\bI_\bn_\bd_\be_\bx_\bP_\ba_\bi_\br;\n-53\n-_\b5_\b5 typedef typename _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt_\b:_\b:_\bG_\bl_\bo_\bb_\ba_\bl_\bI_\bn_\bd_\be_\bx _\bG_\bl_\bo_\bb_\ba_\bl_\bI_\bn_\bd_\be_\bx;\n-56\n-_\b5_\b8 typedef typename ParallelIndexSet::LocalIndex::Attribute _\bA_\bt_\bt_\br_\bi_\bb_\bu_\bt_\be;\n-59\n-_\b6_\b3 typedef _\bD_\bu_\bn_\be_\b:_\b:_\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\bi_\bc_\be_\bs_\b<_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt_\b> _\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\bi_\bc_\be_\bs;\n-64\n-74 _\bI_\bn_\bd_\bi_\bc_\be_\bs_\bS_\by_\bn_\bc_\be_\br(_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt& indexSet,\n-75 _\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\bi_\bc_\be_\bs& remoteIndices);\n-76\n-86 void _\bs_\by_\bn_\bc();\n-87\n-100 template\n-101 void _\bs_\by_\bn_\bc(T1& numberer, bool useFixedOrder = false);\n-102\n-103 private:\n-104\n-106 _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt& indexSet_;\n-107\n-109 _\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\bi_\bc_\be_\bs& remoteIndices_;\n-110\n-112 char** sendBuffers_;\n-113\n-115 char* receiveBuffer_;\n-116\n-118 std::size_t* sendBufferSizes_;\n-119\n-121 int receiveBufferSize_; // int because of MPI\n-122\n-126 struct MessageInformation\n-127 {\n-_\b1_\b2_\b8 _\bM_\be_\bs_\bs_\ba_\bg_\be_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn()\n-129 : _\bp_\bu_\bb_\bl_\bi_\bs_\bh(), _\bp_\ba_\bi_\br_\bs()\n-130 {}\n-_\b1_\b3_\b2 int _\bp_\bu_\bb_\bl_\bi_\bs_\bh;\n-_\b1_\b3_\b7 int _\bp_\ba_\bi_\br_\bs;\n-138 };\n-139\n-143 class DefaultNumberer\n-144 {\n-145 public:\n-_\b1_\b5_\b1 std::size_t _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b(_\b)([[maybe_unused]] const _\bG_\bl_\bo_\bb_\ba_\bl_\bI_\bn_\bd_\be_\bx& global)\n-152 {\n-153 return std::numeric_limits::max();\n-154 }\n-155 };\n-156\n-158 MPI_Datatype datatype_;\n-159\n-161 int rank_;\n-162\n-167 typedef _\bS_\bL_\bL_\bi_\bs_\bt_\b<_\bs_\bt_\bd_\b:_\b:_\bp_\ba_\bi_\br_\b<_\bG_\bl_\bo_\bb_\ba_\bl_\bI_\bn_\bd_\be_\bx_\b,_\bA_\bt_\bt_\br_\bi_\bb_\bu_\bt_\be_\b>, typename _\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\bi_\bc_\be_\bs_\b:_\b:\n-_\bA_\bl_\bl_\bo_\bc_\ba_\bt_\bo_\br> GlobalIndexList;\n-168\n-170 typedef typename _\bG_\bl_\bo_\bb_\ba_\bl_\bI_\bn_\bd_\be_\bx_\bL_\bi_\bs_\bt_\b:_\b:_\bM_\bo_\bd_\bi_\bf_\by_\bI_\bt_\be_\br_\ba_\bt_\bo_\br GlobalIndexModifier;\n-171\n-175 typedef typename _\bS_\bL_\bL_\bi_\bs_\bt_\b<_\bG_\bl_\bo_\bb_\ba_\bl_\bI_\bn_\bd_\be_\bx_\b,_\b _\bt_\by_\bp_\be_\bn_\ba_\bm_\be_\b _\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\bi_\bc_\be_\bs_\b:_\b:_\bA_\bl_\bl_\bo_\bc_\ba_\bt_\bo_\br_\b>_\b:_\b:\n-_\bi_\bt_\be_\br_\ba_\bt_\bo_\br\n-176 GlobalIndexIterator;\n-177\n-179 typedef std::map GlobalIndicesMap;\n-180\n-189 GlobalIndicesMap globalMap_;\n-190\n-194 typedef _\bS_\bL_\bL_\bi_\bs_\bt_\b<_\bb_\bo_\bo_\bl_\b,_\b _\bt_\by_\bp_\be_\bn_\ba_\bm_\be_\b _\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\bi_\bc_\be_\bs_\b:_\b:_\bA_\bl_\bl_\bo_\bc_\ba_\bt_\bo_\br_\b> BoolList;\n-195\n-199 typedef typename _\bB_\bo_\bo_\bl_\bL_\bi_\bs_\bt_\b:_\b:_\bi_\bt_\be_\br_\ba_\bt_\bo_\br BoolIterator;\n-200\n-202 typedef typename _\bB_\bo_\bo_\bl_\bL_\bi_\bs_\bt_\b:_\b:_\bM_\bo_\bd_\bi_\bf_\by_\bI_\bt_\be_\br_\ba_\bt_\bo_\br BoolListModifier;\n-203\n-205 typedef std::map BoolMap;\n-206\n-211 BoolMap oldMap_;\n-212\n-214 std::map infoSend_;\n-215\n-217 typedef typename _\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\bi_\bc_\be_\bs_\b:_\b:_\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\be_\bx_\bL_\bi_\bs_\bt RemoteIndexList;\n-218\n-220 typedef typename _\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\be_\bx_\bL_\bi_\bs_\bt_\b:_\b:_\bM_\bo_\bd_\bi_\bf_\by_\bI_\bt_\be_\br_\ba_\bt_\bo_\br RemoteIndexModifier;\n-221\n-223 typedef _\bD_\bu_\bn_\be_\b:_\b:_\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\be_\bx_\b<_\bG_\bl_\bo_\bb_\ba_\bl_\bI_\bn_\bd_\be_\bx_\b,_\bA_\bt_\bt_\br_\bi_\bb_\bu_\bt_\be_\b> _\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\be_\bx;\n-224\n-226 typedef typename _\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\be_\bx_\bL_\bi_\bs_\bt_\b:_\b:_\bi_\bt_\be_\br_\ba_\bt_\bo_\br RemoteIndexIterator;\n-227\n-229 typedef typename _\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\be_\bx_\bL_\bi_\bs_\bt_\b:_\b:_\bc_\bo_\bn_\bs_\bt_\b__\bi_\bt_\be_\br_\ba_\bt_\bo_\br ConstRemoteIndexIterator;\n-230\n-232 typedef std::\n-tuple IteratorTuple;\n-234\n-242 class Iterators\n-243 {\n-244 friend class _\bI_\bn_\bd_\bi_\bc_\be_\bs_\bS_\by_\bn_\bc_\be_\br;\n-245 public:\n-255 _\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bs(RemoteIndexList& remoteIndices, GlobalIndexList& globalIndices,\n-256 BoolList& booleans);\n-257\n-261 _\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bs();\n-262\n-266 _\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bs& _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b+_\b+();\n-267\n-273 void _\bi_\bn_\bs_\be_\br_\bt(const _\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\be_\bx& index,\n-274 const std::pair& global);\n-275\n-280 _\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\be_\bx& _\br_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\be_\bx() const;\n-281\n-286 std::pair& _\bg_\bl_\bo_\bb_\ba_\bl_\bI_\bn_\bd_\be_\bx_\bP_\ba_\bi_\br() const;\n-287\n-_\b2_\b8_\b8 _\bA_\bt_\bt_\br_\bi_\bb_\bu_\bt_\be& _\ba_\bt_\bt_\br_\bi_\bb_\bu_\bt_\be() const;\n-289\n-295 bool _\bi_\bs_\bO_\bl_\bd() const;\n-296\n-306 void _\br_\be_\bs_\be_\bt(_\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\be_\bx_\bL_\bi_\bs_\bt& remoteIndices, _\bG_\bl_\bo_\bb_\ba_\bl_\bI_\bn_\bd_\be_\bx_\bL_\bi_\bs_\bt& globalIndices,\n-307 _\bB_\bo_\bo_\bl_\bL_\bi_\bs_\bt& booleans);\n-308\n-314 bool _\bi_\bs_\bN_\bo_\bt_\bA_\bt_\bE_\bn_\bd() const;\n-315\n-321 bool _\bi_\bs_\bA_\bt_\bE_\bn_\bd() const;\n-322\n-323 private:\n-333 IteratorTuple iterators_;\n-334 };\n-335\n-337 typedef std::map IteratorsMap;\n-338\n-350 IteratorsMap iteratorsMap_;\n-351\n-353 void calculateMessageSizes();\n-354\n-362 void packAndSend(int destination, char* buffer, std::size_t bufferSize,\n-MPI_Request& req);\n-363\n-370 template\n-371 void recvAndUnpack(T1& numberer, int hardSource, bool useHardSource);\n-372\n-376 void registerMessageDatatype();\n-377\n-381 void insertIntoRemoteIndexList(int process,\n-382 const std::pair& global,\n-383 char attribute);\n-384\n-388 void resetIteratorsMap();\n-389\n-394 bool checkReset();\n-395\n-404 bool checkReset(const Iterators& iterators, _\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\be_\bx_\bL_\bi_\bs_\bt& rlist,\n-_\bG_\bl_\bo_\bb_\ba_\bl_\bI_\bn_\bd_\be_\bx_\bL_\bi_\bs_\bt& gList,\n-405 _\bB_\bo_\bo_\bl_\bL_\bi_\bs_\bt& bList);\n-406 };\n-407\n-408 template\n-_\b4_\b0_\b9 bool _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b<(const _\bI_\bn_\bd_\be_\bx_\bP_\ba_\bi_\br >& i1,\n-410 const std::pair& i2)\n-411 {\n-412 return i1.global() < i2.first ||\n-413 (i1.global() == i2.first && i1.local().attribute()\n-_\b4_\b1_\b7 bool _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b<(const std::pair& i1,\n-418 const _\bI_\bn_\bd_\be_\bx_\bP_\ba_\bi_\br >& i2)\n-419 {\n-420 return i1.first < i2.global() ||\n-421 (i1.first == i2.global() && i1.second\n-_\b4_\b2_\b5 bool _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b=_\b=(const _\bI_\bn_\bd_\be_\bx_\bP_\ba_\bi_\br >& i1,\n-426 const std::pair& i2)\n-427 {\n-428 return (i1.global() == i2.first && i1.local().attribute()==i2.second);\n-429 }\n-430\n-431 template\n-_\b4_\b3_\b2 bool _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b!_\b=(const _\bI_\bn_\bd_\be_\bx_\bP_\ba_\bi_\br >& i1,\n-433 const std::pair& i2)\n-434 {\n-435 return (i1.global() != i2.first || i1.local().attribute()!=i2.second);\n-436 }\n-437\n-438 template\n-_\b4_\b3_\b9 bool _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b=_\b=(const std::pair& i2,\n-440 const _\bI_\bn_\bd_\be_\bx_\bP_\ba_\bi_\br >& i1)\n-441 {\n-442 return (i1.global() == i2.first && i1.local().attribute()==i2.second);\n-443 }\n-444\n-445 template\n-_\b4_\b4_\b6 bool _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b!_\b=(const std::pair& i2,\n-447 const _\bI_\bn_\bd_\be_\bx_\bP_\ba_\bi_\br >& i1)\n-448 {\n-449 return (i1.global() != i2.first || i1.local().attribute()!=i2.second);\n-450 }\n-451\n-468 template\n-_\b4_\b6_\b9 void _\bs_\bt_\bo_\br_\be_\bG_\bl_\bo_\bb_\ba_\bl_\bI_\bn_\bd_\bi_\bc_\be_\bs_\bO_\bf_\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\bi_\bc_\be_\bs(std::map,A> >&\n-globalMap,\n-470 const _\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\bi_\bc_\be_\bs_\b<_\bT_\b,_\bA_\b1_\b>& remoteIndices)\n-471 {\n-472 for(auto remote = remoteIndices._\bb_\be_\bg_\bi_\bn(), end =remoteIndices._\be_\bn_\bd(); remote\n-!= end; ++remote) {\n-473 typedef typename _\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\bi_\bc_\be_\bs_\b<_\bT_\b,_\bA_\b1_\b>_\b:_\b:_\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\be_\bx_\bL_\bi_\bs_\bt RemoteIndexList;\n-474 typedef _\bS_\bL_\bL_\bi_\bs_\bt_\b<_\bs_\bt_\bd_\b:_\b:_\bp_\ba_\bi_\br_\b<_\bt_\by_\bp_\be_\bn_\ba_\bm_\be_\b _\bT_\b:_\b:_\bG_\bl_\bo_\bb_\ba_\bl_\bI_\bn_\bd_\be_\bx_\b,_\b _\bt_\by_\bp_\be_\bn_\ba_\bm_\be_\b _\bT_\b:_\b:_\bL_\bo_\bc_\ba_\bl_\bI_\bn_\bd_\be_\bx_\b:_\b:\n-_\bA_\bt_\bt_\br_\bi_\bb_\bu_\bt_\be_\b>,A> GlobalIndexList;\n-475 GlobalIndexList& global = globalMap[remote->first];\n-476 RemoteIndexList& rList = *(remote->second.first);\n-477\n-478 for(auto index = rList.begin(), riEnd = rList.end();\n-479 index != riEnd; ++index) {\n-480 global._\bp_\bu_\bs_\bh_\b__\bb_\ba_\bc_\bk(std::make_pair(index->localIndexPair().global(),\n-481 index->localIndexPair().local().attribute()));\n-482 }\n-483 }\n-484 }\n-485\n-494 template\n-_\b4_\b9_\b5 inline void _\br_\be_\bp_\ba_\bi_\br_\bL_\bo_\bc_\ba_\bl_\bI_\bn_\bd_\be_\bx_\bP_\bo_\bi_\bn_\bt_\be_\br_\bs(std::map,A> >& globalMap,\n-498 _\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\bi_\bc_\be_\bs_\b<_\bT_\b,_\bA_\b1_\b>& remoteIndices,\n-499 const T& indexSet)\n-500 {\n-501 assert(globalMap.size()==static_cast(remoteIndices._\bn_\be_\bi_\bg_\bh_\bb_\bo_\bu_\br_\bs\n-()));\n-502 // Repair pointers to index set in remote indices.\n-503 auto global = globalMap.begin();\n-504 auto end = remoteIndices.remoteIndices_.end();\n-505\n-506 for(auto remote = remoteIndices.remoteIndices_.begin(); remote != end;\n-++remote, ++global) {\n-507 assert(remote->first==global->first);\n-508 assert(remote->second.first->size() == global->second.size());\n-509\n-510 auto riEnd = remote->second.first->end();\n-511 auto rIndex = remote->second.first->begin();\n-512 auto gIndex = global->second.begin();\n-513 auto index = indexSet.begin();\n-514\n-515 assert(rIndex==riEnd || gIndex != global->second.end());\n-516 while(rIndex != riEnd) {\n-517 // Search for the index in the set.\n-518 assert(gIndex != global->second.end());\n-519\n-520 while(!(index->global() == gIndex->first\n-521 && index->local().attribute() == gIndex->second)) {\n-522 ++index;\n-523 // this is only needed for ALU, where there may exist\n-524 // more entries with the same global index in the remote index set\n-525 // than in the index set\n-526 if (index->global() > gIndex->first) {\n-527 index=indexSet.begin();\n-528 }\n-529 }\n-530\n-531 assert(index != indexSet.end() && *index == *gIndex);\n-532\n-533 rIndex->localIndex_ = &(*index);\n-534 ++index;\n-535 ++rIndex;\n-536 ++gIndex;\n-537 }\n-538 }\n-539 remoteIndices.sourceSeqNo_ = remoteIndices.source_->_\bs_\be_\bq_\bN_\bo();\n-540 remoteIndices.destSeqNo_ = remoteIndices.target_->_\bs_\be_\bq_\bN_\bo();\n-541 }\n-542\n-543 template\n-_\b5_\b4_\b4 _\bI_\bn_\bd_\bi_\bc_\be_\bs_\bS_\by_\bn_\bc_\be_\br_\b<_\bT_\b>_\b:_\b:_\bI_\bn_\bd_\bi_\bc_\be_\bs_\bS_\by_\bn_\bc_\be_\br(_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt& indexSet,\n-545 _\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\bi_\bc_\be_\bs& remoteIndices)\n-546 : indexSet_(indexSet), remoteIndices_(remoteIndices)\n-547 {\n-548 // index sets must match.\n-549 assert(remoteIndices.source_ == remoteIndices.target_);\n-550 assert(remoteIndices.source_ == &indexSet);\n-551 MPI_Comm_rank(remoteIndices_._\bc_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bo_\br(), &rank_);\n-552 }\n-553\n-554 template\n-_\b5_\b5_\b5 _\bI_\bn_\bd_\bi_\bc_\be_\bs_\bS_\by_\bn_\bc_\be_\br_\b<_\bT_\b>_\b:_\b:_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bs_\b:_\b:_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bs(_\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\be_\bx_\bL_\bi_\bs_\bt& remoteIndices,\n-556 _\bG_\bl_\bo_\bb_\ba_\bl_\bI_\bn_\bd_\be_\bx_\bL_\bi_\bs_\bt& globalIndices,\n-557 _\bB_\bo_\bo_\bl_\bL_\bi_\bs_\bt& booleans)\n-558 : iterators_(remoteIndices.beginModify(), globalIndices.beginModify(),\n-559 booleans.beginModify(), remoteIndices.end())\n-560 { }\n-561\n-562 template\n-_\b5_\b6_\b3 _\bI_\bn_\bd_\bi_\bc_\be_\bs_\bS_\by_\bn_\bc_\be_\br_\b<_\bT_\b>_\b:_\b:_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bs_\b:_\b:_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bs()\n-564 : iterators_()\n-565 {}\n-566\n-567 template\n-_\b5_\b6_\b8 inline typename _\bI_\bn_\bd_\bi_\bc_\be_\bs_\bS_\by_\bn_\bc_\be_\br_\b<_\bT_\b>_\b:_\b:_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bs& _\bI_\bn_\bd_\bi_\bc_\be_\bs_\bS_\by_\bn_\bc_\be_\br_\b<_\bT_\b>_\b:_\b:_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bs_\b:_\b:\n-_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b+_\b+()\n-569 {\n-570 ++(std::get<0>(iterators_));\n-571 ++(std::get<1>(iterators_));\n-572 ++(std::get<2>(iterators_));\n-573 return *this;\n-574 }\n-575\n-576 template\n-_\b5_\b7_\b7 inline void _\bI_\bn_\bd_\bi_\bc_\be_\bs_\bS_\by_\bn_\bc_\be_\br_\b<_\bT_\b>_\b:_\b:_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bs_\b:_\b:_\bi_\bn_\bs_\be_\br_\bt(const _\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\be_\bx & index,\n-578 const std::pair& global)\n-579 {\n-580 std::get<0>(iterators_).insert(index);\n-581 std::get<1>(iterators_).insert(global);\n-582 std::get<2>(iterators_).insert(false);\n-583 }\n-584\n-585 template\n-586 inline typename _\bI_\bn_\bd_\bi_\bc_\be_\bs_\bS_\by_\bn_\bc_\be_\br_\b<_\bT_\b>_\b:_\b:_\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\be_\bx&\n-_\b5_\b8_\b7 _\bI_\bn_\bd_\bi_\bc_\be_\bs_\bS_\by_\bn_\bc_\be_\br_\b<_\bT_\b>_\b:_\b:_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bs_\b:_\b:_\br_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\be_\bx() const\n-588 {\n-589 return *(std::get<0>(iterators_));\n-590 }\n-591\n-592 template\n-593 inline std::pair::GlobalIndex,typename\n-_\bI_\bn_\bd_\bi_\bc_\be_\bs_\bS_\by_\bn_\bc_\be_\br_\b<_\bT_\b>_\b:_\b:_\bA_\bt_\bt_\br_\bi_\bb_\bu_\bt_\be>&\n-_\b5_\b9_\b4 _\bI_\bn_\bd_\bi_\bc_\be_\bs_\bS_\by_\bn_\bc_\be_\br_\b<_\bT_\b>_\b:_\b:_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bs_\b:_\b:_\bg_\bl_\bo_\bb_\ba_\bl_\bI_\bn_\bd_\be_\bx_\bP_\ba_\bi_\br() const\n-595 {\n-596 return *(std::get<1>(iterators_));\n-597 }\n-598\n-599 template\n-_\b6_\b0_\b0 inline bool _\bI_\bn_\bd_\bi_\bc_\be_\bs_\bS_\by_\bn_\bc_\be_\br_\b<_\bT_\b>_\b:_\b:_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bs_\b:_\b:_\bi_\bs_\bO_\bl_\bd() const\n-601 {\n-602 return *(std::get<2>(iterators_));\n-603 }\n-604\n-605 template\n-_\b6_\b0_\b6 inline void _\bI_\bn_\bd_\bi_\bc_\be_\bs_\bS_\by_\bn_\bc_\be_\br_\b<_\bT_\b>_\b:_\b:_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bs_\b:_\b:_\br_\be_\bs_\be_\bt(_\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\be_\bx_\bL_\bi_\bs_\bt&\n-remoteIndices,\n-607 _\bG_\bl_\bo_\bb_\ba_\bl_\bI_\bn_\bd_\be_\bx_\bL_\bi_\bs_\bt& globalIndices,\n-608 _\bB_\bo_\bo_\bl_\bL_\bi_\bs_\bt& booleans)\n-609 {\n-610 std::get<0>(iterators_) = remoteIndices._\bb_\be_\bg_\bi_\bn_\bM_\bo_\bd_\bi_\bf_\by();\n-611 std::get<1>(iterators_) = globalIndices._\bb_\be_\bg_\bi_\bn_\bM_\bo_\bd_\bi_\bf_\by();\n-612 std::get<2>(iterators_) = booleans._\bb_\be_\bg_\bi_\bn_\bM_\bo_\bd_\bi_\bf_\by();\n-613 }\n-614\n-615 template\n-_\b6_\b1_\b6 inline bool _\bI_\bn_\bd_\bi_\bc_\be_\bs_\bS_\by_\bn_\bc_\be_\br_\b<_\bT_\b>_\b:_\b:_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bs_\b:_\b:_\bi_\bs_\bN_\bo_\bt_\bA_\bt_\bE_\bn_\bd() const\n-617 {\n-618 return std::get<0>(iterators_) != std::get<3>(iterators_);\n-619 }\n-620\n-621 template\n-_\b6_\b2_\b2 inline bool _\bI_\bn_\bd_\bi_\bc_\be_\bs_\bS_\by_\bn_\bc_\be_\br_\b<_\bT_\b>_\b:_\b:_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bs_\b:_\b:_\bi_\bs_\bA_\bt_\bE_\bn_\bd() const\n-623 {\n-624 return std::get<0>(iterators_) == std::get<3>(iterators_);\n-625 }\n-626\n-627 template\n-628 void _\bI_\bn_\bd_\bi_\bc_\be_\bs_\bS_\by_\bn_\bc_\be_\br_\b<_\bT_\b>_\b:_\b:_\br_\be_\bg_\bi_\bs_\bt_\be_\br_\bM_\be_\bs_\bs_\ba_\bg_\be_\bD_\ba_\bt_\ba_\bt_\by_\bp_\be()\n-629 {\n-630 MPI_Datatype type[2] = {MPI_INT, MPI_INT};\n-631 int blocklength[2] = {1,1};\n-632 MPI_Aint displacement[2];\n-633 MPI_Aint base;\n-634\n-635 // Compute displacement\n-636 MessageInformation message;\n-637\n-638 MPI_Get_address( &(message.publish), displacement);\n-639 MPI_Get_address( &(message.pairs), displacement+1);\n-640\n-641 // Make the displacement relative\n-642 MPI_Get_address(&message, &base);\n-643 displacement[0] -= base;\n-644 displacement[1] -= base;\n-645\n-646 MPI_Type_create_struct( 2, blocklength, displacement, type, &datatype_);\n-647 MPI_Type_commit(&datatype_);\n-648 }\n-649\n-650 template\n-651 void IndicesSyncer::calculateMessageSizes()\n-652 {\n-653 auto iEnd = indexSet_.end();\n-654 auto collIter = remoteIndices_.template iterator();\n-655\n-656 for(auto index = indexSet_.begin(); index != iEnd; ++index) {\n-657 collIter.advance(index->global(), index->local().attribute());\n-658 if(collIter.empty())\n-659 break;\n-660 int knownRemote=0;\n-661 auto end = collIter.end();\n-662\n-663 // Count the remote indices we know.\n-664 for(auto valid = collIter.begin(); valid != end; ++valid) {\n-665 ++knownRemote;\n-666 }\n-667\n-668 if(knownRemote>0) {\n-669 _\bD_\bu_\bn_\be_\b:_\b:_\bd_\bv_\be_\br_\bb<global()<< \" for processes \";\n-670\n-671 // Update MessageInformation\n-672 for(auto valid = collIter.begin(); valid != end; ++valid) {\n-673 ++(infoSend_[valid.process()].publish);\n-674 (infoSend_[valid.process()].pairs) += knownRemote;\n-675 _\bD_\bu_\bn_\be_\b:_\b:_\bd_\bv_\be_\br_\bb<first==remote->first) {\n-697 // We want to send message information to that process\n-698 message = const_cast(&(messageIter->second));\n-699 ++messageIter;\n-700 }else\n-701 // We do not want to send information but the other process might.\n-702 message = &dummy;\n-703\n-704 sendBufferSizes_[neighbour]=0;\n-705 int tsize;\n-706 // The number of indices published\n-707 MPI_Pack_size(1, MPI_INT,remoteIndices_._\bc_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bo_\br(), &tsize);\n-708 sendBufferSizes_[neighbour] += tsize;\n-709\n-710 for(int i=0; i < message->publish; ++i) {\n-711 // The global index\n-712 MPI_Pack_size(1, _\bM_\bP_\bI_\bT_\br_\ba_\bi_\bt_\bs_\b<_\bG_\bl_\bo_\bb_\ba_\bl_\bI_\bn_\bd_\be_\bx_\b>_\b:_\b:_\bg_\be_\bt_\bT_\by_\bp_\be(),\n-remoteIndices_._\bc_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bo_\br(), &tsize);\n-713 sendBufferSizes_[neighbour] += tsize;\n-714 // The attribute in the local index\n-715 MPI_Pack_size(1, MPI_CHAR, remoteIndices_._\bc_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bo_\br(), &tsize);\n-716 sendBufferSizes_[neighbour] += tsize;\n-717 // The number of corresponding remote indices\n-718 MPI_Pack_size(1, MPI_INT, remoteIndices_._\bc_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bo_\br(), &tsize);\n-719 sendBufferSizes_[neighbour] += tsize;\n-720 }\n-721 for(int i=0; i < message->pairs; ++i) {\n-722 // The process of the remote index\n-723 MPI_Pack_size(1, MPI_INT, remoteIndices_._\bc_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bo_\br(), &tsize);\n-724 sendBufferSizes_[neighbour] += tsize;\n-725 // The attribute of the remote index\n-726 MPI_Pack_size(1, MPI_CHAR, remoteIndices_._\bc_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bo_\br(), &tsize);\n-727 sendBufferSizes_[neighbour] += tsize;\n-728 }\n-729\n-730 _\bD_\bu_\bn_\be_\b:_\b:_\bd_\bv_\be_\br_\bb<first<<\") size is \"<<\n-sendBufferSizes_[neighbour]<<\" for publish=\"<publish<<\"\n-pairs=\"<pairs<\n-_\b7_\b3_\b6 inline void _\bI_\bn_\bd_\bi_\bc_\be_\bs_\bS_\by_\bn_\bc_\be_\br_\b<_\bT_\b>_\b:_\b:_\bs_\by_\bn_\bc()\n-737 {\n-738 DefaultNumberer numberer;\n-739 _\bs_\by_\bn_\bc(numberer);\n-740 }\n-741\n-742 template\n-743 template\n-_\b7_\b4_\b4 void _\bI_\bn_\bd_\bi_\bc_\be_\bs_\bS_\by_\bn_\bc_\be_\br_\b<_\bT_\b>_\b:_\b:_\bs_\by_\bn_\bc(T1& numberer, bool useFixedOrder)\n-745 {\n-746 // The pointers to the local indices in the remote indices\n-747 // will become invalid due to the resorting of the index set.\n-748 // Therefore store the corresponding global indices.\n-749 // Mark all indices as not added\n-750 const auto end = remoteIndices_._\be_\bn_\bd();\n-751\n-752 // Number of neighbours might change during the syncing.\n-753 // save the old neighbours\n-754 std::size_t noOldNeighbours = remoteIndices_._\bn_\be_\bi_\bg_\bh_\bb_\bo_\bu_\br_\bs();\n-755 int* oldNeighbours = new int[noOldNeighbours];\n-756 sendBufferSizes_ = new std::size_t[noOldNeighbours];\n-757 std::size_t neighbourI = 0;\n-758\n-759 for(auto remote = remoteIndices_._\bb_\be_\bg_\bi_\bn(); remote != end; ++remote,\n-++neighbourI) {\n-760 oldNeighbours[neighbourI] = remote->first;\n-761\n-762 // Make sure we only have one remote index list.\n-763 assert(remote->second.first==remote->second.second);\n-764\n-765 _\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\be_\bx_\bL_\bi_\bs_\bt& rList = *(remote->second.first);\n-766\n-767 // Store the corresponding global indices.\n-768 _\bG_\bl_\bo_\bb_\ba_\bl_\bI_\bn_\bd_\be_\bx_\bL_\bi_\bs_\bt& global = globalMap_[remote->first];\n-769 _\bB_\bo_\bo_\bl_\bL_\bi_\bs_\bt& added = oldMap_[remote->first];\n-770 auto riEnd = rList._\be_\bn_\bd();\n-771\n-772 for(auto index = rList._\bb_\be_\bg_\bi_\bn();\n-773 index != riEnd; ++index) {\n-774 global._\bp_\bu_\bs_\bh_\b__\bb_\ba_\bc_\bk(std::make_pair(index->localIndexPair().global(),\n-775 index->localIndexPair().local().attribute()));\n-776 added._\bp_\bu_\bs_\bh_\b__\bb_\ba_\bc_\bk(true);\n-777 }\n-778\n-779 Iterators iterators(rList, global, added);\n-780 iteratorsMap_.insert(std::make_pair(remote->first, iterators));\n-781 assert(checkReset(iteratorsMap_[remote->first], rList,global,added));\n-782 }\n-783\n-784 // Exchange indices with each neighbour\n-785 calculateMessageSizes();\n-786\n-787 // Allocate the buffers\n-788 receiveBufferSize_=1;\n-789 sendBuffers_ = new char*[noOldNeighbours];\n-790\n-791 for(std::size_t i=0; i\n-(sendBufferSizes_[i]));\n-794 }\n-795\n-796 receiveBuffer_=new char[receiveBufferSize_];\n-797\n-798 indexSet_.beginResize();\n-799\n-800 _\bD_\bu_\bn_\be_\b:_\b:_\bd_\bv_\be_\br_\bb<\n-860 void _\bI_\bn_\bd_\bi_\bc_\be_\bs_\bS_\by_\bn_\bc_\be_\br_\b<_\bT_\b>_\b:_\b:_\bp_\ba_\bc_\bk_\bA_\bn_\bd_\bS_\be_\bn_\bd(int destination, char* buffer, std::\n-size_t bufferSize, MPI_Request& request)\n-861 {\n-862 auto iEnd = indexSet_.end();\n-863 int bpos = 0;\n-864 int published = 0;\n-865 int pairs = 0;\n-866\n-867 assert(checkReset());\n-868\n-869 // Pack the number of indices we publish\n-870 MPI_Pack(&(infoSend_[destination].publish), 1, MPI_INT, buffer, bufferSize,\n-&bpos,\n-871 remoteIndices_._\bc_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bo_\br());\n-872\n-873 for(auto index = indexSet_.begin(); index != iEnd; ++index) {\n-874 // Search for corresponding remote indices in all iterator tuples\n-875 auto iteratorsEnd = iteratorsMap_.end();\n-876\n-877 // advance all iterators to a position with global index >= index->global()\n-878 for(auto iterators = iteratorsMap_.begin(); iteratorsEnd != iterators;\n-++iterators) {\n-879 while(iterators->second.isNotAtEnd() &&\n-880 iterators->second.globalIndexPair().first < index->global())\n-881 ++(iterators->second);\n-882 assert(!iterators->second.isNotAtEnd() || iterators->second.globalIndexPair\n-().first >= index->global());\n-883 }\n-884\n-885 // Add all remote indices positioned at global which were already present\n-before calling sync\n-886 // to the message.\n-887 // Count how many remote indices we will send\n-888 int indices = 0;\n-889 bool knownRemote = false; // Is the remote process supposed to know this\n-index?\n-890\n-891 for(auto iterators = iteratorsMap_.begin(); iteratorsEnd != iterators;\n-++iterators)\n-892 {\n-893 std::pair p;\n-894 if (iterators->second.isNotAtEnd())\n-895 {\n-896 p = iterators->second.globalIndexPair();\n-897 }\n-898\n-899 if(iterators->second.isNotAtEnd() && iterators->second.isOld()\n-900 && iterators->second.globalIndexPair().first == index->global()) {\n-901 indices++;\n-902 if(destination == iterators->first)\n-903 knownRemote = true;\n-904 }\n-905 }\n-906\n-907 if(!knownRemote)\n-908 // We do not need to send any indices\n-909 continue;\n-910\n-911 _\bD_\bu_\bn_\be_\b:_\b:_\bd_\bv_\be_\br_\bb<global\n-()<<\" to \"<(&(index->global())), 1,\n-_\bM_\bP_\bI_\bT_\br_\ba_\bi_\bt_\bs_\b<_\bG_\bl_\bo_\bb_\ba_\bl_\bI_\bn_\bd_\be_\bx_\b>_\b:_\b:_\bg_\be_\bt_\bT_\by_\bp_\be(), buffer, bufferSize, &bpos,\n-916 remoteIndices_._\bc_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bo_\br());\n-917\n-918 char attr = index->local().attribute();\n-919 MPI_Pack(&attr, 1, MPI_CHAR, buffer, bufferSize, &bpos,\n-920 remoteIndices_._\bc_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bo_\br());\n-921\n-922 // Pack the number of remote indices we send.\n-923 MPI_Pack(&indices, 1, MPI_INT, buffer, bufferSize, &bpos,\n-924 remoteIndices_._\bc_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bo_\br());\n-925\n-926 // Pack the information about the remote indices\n-927 for(auto iterators = iteratorsMap_.begin(); iteratorsEnd != iterators;\n-++iterators)\n-928 if(iterators->second.isNotAtEnd() && iterators->second.isOld()\n-929 && iterators->second.globalIndexPair().first == index->global()) {\n-930 int process = iterators->first;\n-931\n-932 ++pairs;\n-933 assert(pairs <= infoSend_[destination].pairs);\n-934 MPI_Pack(&process, 1, MPI_INT, buffer, bufferSize, &bpos,\n-935 remoteIndices_._\bc_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bo_\br());\n-936 char attr2 = iterators->second.remoteIndex().attribute();\n-937\n-938 MPI_Pack(&attr2, 1, MPI_CHAR, buffer, bufferSize, &bpos,\n-939 remoteIndices_._\bc_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bo_\br());\n-940 --indices;\n-941 }\n-942 assert(indices==0);\n-943 ++published;\n-944 _\bD_\bu_\bn_\be_\b:_\b:_\bd_\bv_\bv_\be_\br_\bb<<\" (publish=\"<\n-959 inline void IndicesSyncer::insertIntoRemoteIndexList(int process,\n-960 const std::pair& globalPair,\n-961 char attribute)\n-962 {\n-963 _\bD_\bu_\bn_\be_\b:_\b:_\bd_\bv_\be_\br_\bb<<\"Inserting from \"<second;\n-980\n-981 // Search for the remote index\n-982 while(iterators.isNotAtEnd() && iterators.globalIndexPair() < globalPair) {\n-983 // Increment all iterators\n-984 ++iterators;\n-985\n-986 }\n-987\n-988 if(iterators.isAtEnd() || iterators.globalIndexPair() != globalPair) {\n-989 // The entry is not yet known\n-990 // Insert in the list and do not change the first iterator.\n-991 iterators.insert(RemoteIndex(_\bA_\bt_\bt_\br_\bi_\bb_\bu_\bt_\be(attribute)),globalPair);\n-992 return;\n-993 }\n-994\n-995 // Global indices match\n-996 bool indexIsThere=false;\n-997 for(Iterators tmpIterators = iterators;\n-998 !tmpIterators.isAtEnd() && tmpIterators.globalIndexPair() == globalPair;\n-999 ++tmpIterators)\n-1000 //entry already exists with the same attribute\n-1001 if(tmpIterators.globalIndexPair().second == attribute) {\n-1002 indexIsThere=true;\n-1003 break;\n-1004 }\n-1005\n-1006 if(!indexIsThere)\n-1007 // The entry is not yet known\n-1008 // Insert in the list and do not change the first iterator.\n-1009 iterators.insert(RemoteIndex(_\bA_\bt_\bt_\br_\bi_\bb_\bu_\bt_\be(attribute)),globalPair);\n-1010 }\n-1011\n-1012 template\n-1013 template\n-1014 void IndicesSyncer::recvAndUnpack(T1& numberer, int hardSource, bool\n-useHardSource)\n-1015 {\n-1016 const _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt& constIndexSet = indexSet_;\n-1017 auto iEnd = constIndexSet.end();\n-1018 auto index = constIndexSet.begin();\n-1019 int bpos = 0;\n-1020 int publish;\n-1021\n-1022 assert(checkReset());\n-1023\n-1024 MPI_Status status;\n-1025\n-1026 // We have to determine the message size and source before the receive\n-1027\n-1028 MPI_Probe(useHardSource ? hardSource : MPI_ANY_SOURCE, 345,\n-remoteIndices_.communicator(), &status);\n-1029\n-1030 int source=status.MPI_SOURCE;\n-1031 int count;\n-1032 MPI_Get_count(&status, MPI_PACKED, &count);\n-1033\n-1034 _\bD_\bu_\bn_\be_\b:_\b:_\bd_\bv_\bv_\be_\br_\bb<receiveBufferSize_) {\n-1037 receiveBufferSize_=count;\n-1038 delete[] receiveBuffer_;\n-1039 receiveBuffer_ = new char[receiveBufferSize_];\n-1040 }\n-1041\n-1042 MPI_Recv(receiveBuffer_, count, MPI_PACKED, source, 345,\n-remoteIndices_._\bc_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bo_\br(), &status);\n-1043\n-1044 // How many global entries were published?\n-1045 MPI_Unpack(receiveBuffer_, count, &bpos, &publish, 1, MPI_INT,\n-remoteIndices_._\bc_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bo_\br());\n-1046\n-1047 // Now unpack the remote indices and add them.\n-1048 while(publish>0) {\n-1049\n-1050 // Unpack information about the local index on the source process\n-1051 _\bG_\bl_\bo_\bb_\ba_\bl_\bI_\bn_\bd_\be_\bx global; // global index of the current entry\n-1052 char sourceAttribute; // Attribute on the source process\n-1053 int pairs;\n-1054\n-1055 MPI_Unpack(receiveBuffer_, count, &bpos, &global, 1,\n-_\bM_\bP_\bI_\bT_\br_\ba_\bi_\bt_\bs_\b<_\bG_\bl_\bo_\bb_\ba_\bl_\bI_\bn_\bd_\be_\bx_\b>_\b:_\b:_\bg_\be_\bt_\bT_\by_\bp_\be(),\n-1056 remoteIndices_._\bc_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bo_\br());\n-1057 MPI_Unpack(receiveBuffer_, count, &bpos, &sourceAttribute, 1, MPI_CHAR,\n-1058 remoteIndices_._\bc_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bo_\br());\n-1059 MPI_Unpack(receiveBuffer_, count, &bpos, &pairs, 1, MPI_INT,\n-1060 remoteIndices_._\bc_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bo_\br());\n-1061\n-1062 // Insert the entry on the remote process to our\n-1063 // remote index list\n-1064 SLList > sourceAttributeList;\n-1065 sourceAttributeList.push_back(std::make_pair(source,_\bA_\bt_\bt_\br_\bi_\bb_\bu_\bt_\be\n-(sourceAttribute)));\n-1066#ifndef NDEBUG\n-1067 bool foundSelf = false;\n-1068#endif\n-1069 _\bA_\bt_\bt_\br_\bi_\bb_\bu_\bt_\be myAttribute=_\bA_\bt_\bt_\br_\bi_\bb_\bu_\bt_\be();\n-1070\n-1071 // Unpack the remote indices\n-1072 for(; pairs>0; --pairs) {\n-1073 // Unpack the process id that knows the index\n-1074 int process;\n-1075 char attribute;\n-1076 MPI_Unpack(receiveBuffer_, count, &bpos, &process, 1, MPI_INT,\n-1077 remoteIndices_._\bc_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bo_\br());\n-1078 // Unpack the attribute\n-1079 MPI_Unpack(receiveBuffer_, count, &bpos, &attribute, 1, MPI_CHAR,\n-1080 remoteIndices_._\bc_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bo_\br());\n-1081\n-1082 if(process==rank_) {\n-1083#ifndef NDEBUG\n-1084 foundSelf=true;\n-1085#endif\n-1086 myAttribute=_\bA_\bt_\bt_\br_\bi_\bb_\bu_\bt_\be(attribute);\n-1087 // Now we know the local attribute of the global index\n-1088 //Only add the index if it is unknown.\n-1089 // Do we know that global index already?\n-1090 auto pos = std::lower_bound(index, iEnd, _\bI_\bn_\bd_\be_\bx_\bP_\ba_\bi_\br(global));\n-1091\n-1092 if(pos == iEnd || pos->global() != global) {\n-1093 // no entry with this global index\n-1094 indexSet_.add(global,\n-1095 ParallelLocalIndex(numberer(global),\n-1096 myAttribute, true));\n-1097 _\bD_\bu_\bn_\be_\b:_\b:_\bd_\bv_\bv_\be_\br_\bb << \"Adding \"<global()==global; ++pos)\n-1106 if(pos->local().attribute() == myAttribute) {\n-1107 _\bD_\bu_\bn_\be_\b:_\b:_\bd_\bv_\bv_\be_\br_\bb<<\"found \"<(numberer(global),\n-1115 myAttribute, true));\n-1116 _\bD_\bu_\bn_\be_\b:_\b:_\bd_\bv_\bv_\be_\br_\bb << \"Adding \"< >::const_iterator Iter;\n-1126 for(Iter i=sourceAttributeList.begin(), end=sourceAttributeList.end();\n-1127 i!=end; ++i)\n-1128 insertIntoRemoteIndexList(i->first, std::make_pair(global, myAttribute),\n-1129 i->second);\n-1130 --publish;\n-1131 }\n-1132\n-1133 resetIteratorsMap();\n-1134 }\n-1135\n-1136 template\n-1137 void IndicesSyncer::resetIteratorsMap(){\n-1138\n-1139 // Reset iterators in all tuples.\n-1140 const auto remoteEnd = remoteIndices_.remoteIndices_.end();\n-1141 auto iterators = iteratorsMap_.begin();\n-1142 auto global = globalMap_.begin();\n-1143 auto added = oldMap_.begin();\n-1144\n-1145 for(auto remote = remoteIndices_.remoteIndices_.begin();\n-1146 remote != remoteEnd; ++remote, ++global, ++added, ++iterators) {\n-1147 iterators->second.reset(*(remote->second.first), global->second, added-\n->second);\n-1148 }\n-1149 }\n-1150\n-1151 template\n-1152 bool IndicesSyncer::checkReset(const Iterators& iterators,\n-RemoteIndexList& rList, GlobalIndexList& gList,\n-1153 BoolList& bList){\n-1154\n-1155 if(std::get<0>(iterators.iterators_) != rList.begin())\n-1156 return false;\n-1157 if(std::get<1>(iterators.iterators_) != gList.begin())\n-1158 return false;\n-1159 if(std::get<2>(iterators.iterators_) != bList.begin())\n-1160 return false;\n-1161 return true;\n-1162 }\n-1163\n-1164\n-1165 template\n-1166 bool IndicesSyncer::checkReset(){\n-1167\n-1168 // Reset iterators in all tuples.\n-1169 const auto remoteEnd = remoteIndices_.remoteIndices_.end();\n-1170 auto iterators = iteratorsMap_.begin();\n-1171 auto global = globalMap_.begin();\n-1172 auto added = oldMap_.begin();\n-1173 bool ret = true;\n-1174\n-1175 for(auto remote = remoteIndices_.remoteIndices_.begin();\n-1176 remote != remoteEnd; ++remote, ++global, ++added, ++iterators) {\n-1177 if(!checkReset(iterators->second, *(remote->second.first), global->second,\n-1178 added->second))\n-1179 ret=false;\n-1180 }\n-1181 return ret;\n-1182 }\n-1183}\n-1184\n-1185#endif // HAVE_MPI\n-1186#endif // DUNE_COMMON_PARALLEL_INDICESSYNCER_HH\n-_\bi_\bn_\bd_\be_\bx_\bs_\be_\bt_\b._\bh_\bh\n-Provides a map between global and local indices.\n-_\br_\be_\bm_\bo_\bt_\be_\bi_\bn_\bd_\bi_\bc_\be_\bs_\b._\bh_\bh\n-Classes describing a distributed indexset.\n-_\bs_\bt_\bd_\bs_\bt_\br_\be_\ba_\bm_\bs_\b._\bh_\bh\n-Standard Dune debug streams.\n-_\bs_\bl_\bl_\bi_\bs_\bt_\b._\bh_\bh\n-Implements a singly linked list together with the necessary iterators.\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bL_\bL_\bi_\bs_\bt_\b:_\b:_\bp_\bu_\bs_\bh_\b__\bb_\ba_\bc_\bk\n-void push_back(const MemberType &item)\n-Add a new entry to the end of the list.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn sllist.hh:643\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bL_\bL_\bi_\bs_\bt_\b:_\b:_\bi_\bt_\be_\br_\ba_\bt_\bo_\br\n-SLListIterator< T, A > iterator\n-The mutable iterator of the list.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn sllist.hh:69\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bL_\bL_\bi_\bs_\bt_\b:_\b:_\be_\bn_\bd\n-iterator end()\n-Get an iterator pointing to the end of the list.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn sllist.hh:774\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bL_\bL_\bi_\bs_\bt_\b:_\b:_\bb_\be_\bg_\bi_\bn_\bM_\bo_\bd_\bi_\bf_\by\n-ModifyIterator beginModify()\n-Get an iterator capable of deleting and inserting elements.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn sllist.hh:787\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bL_\bL_\bi_\bs_\bt_\b<_\b _\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\be_\bx_\b,_\b _\bA_\bl_\bl_\bo_\bc_\ba_\bt_\bo_\br_\b _\b>_\b:_\b:_\bc_\bo_\bn_\bs_\bt_\b__\bi_\bt_\be_\br_\ba_\bt_\bo_\br\n-SLListConstIterator< RemoteIndex, Allocator > const_iterator\n-The constant iterator of the list.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn sllist.hh:74\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bL_\bL_\bi_\bs_\bt_\b:_\b:_\bM_\bo_\bd_\bi_\bf_\by_\bI_\bt_\be_\br_\ba_\bt_\bo_\br\n-SLListModifyIterator< T, A > ModifyIterator\n-The type of the iterator capable of deletion and insertion.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn sllist.hh:103\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bL_\bL_\bi_\bs_\bt_\b:_\b:_\bb_\be_\bg_\bi_\bn\n-iterator begin()\n-Get an iterator pointing to the first element in the list.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn sllist.hh:762\n-_\bD_\bu_\bn_\be_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b<\n-EnableIfInterOperable< T1, T2, bool >::type operator<(const\n-RandomAccessIteratorFacade< T1, V1, R1, D > &lhs, const\n-RandomAccessIteratorFacade< T2, V2, R2, D > &rhs)\n-Comparison operator.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn iteratorfacades.hh:638\n-_\bD_\bu_\bn_\be_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b=_\b=\n-EnableIfInterOperable< T1, T2, bool >::type operator==(const\n-ForwardIteratorFacade< T1, V1, R1, D > &lhs, const ForwardIteratorFacade< T2,\n-V2, R2, D > &rhs)\n-Checks for equality.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn iteratorfacades.hh:238\n-_\bD_\bu_\bn_\be_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b!_\b=\n-EnableIfInterOperable< T1, T2, bool >::type operator!=(const\n-ForwardIteratorFacade< T1, V1, R1, D > &lhs, const ForwardIteratorFacade< T2,\n-V2, R2, D > &rhs)\n-Checks for inequality.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn iteratorfacades.hh:260\n-_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bd_\bi_\bc_\be_\bs_\bS_\by_\bn_\bc_\be_\br_\b:_\b:_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bs_\b:_\b:_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bs\n-Iterators()\n-Default constructor.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn indicessyncer.hh:563\n-_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bd_\bi_\bc_\be_\bs_\bS_\by_\bn_\bc_\be_\br_\b:_\b:_\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\bi_\bc_\be_\bs\n-Dune::RemoteIndices< ParallelIndexSet > RemoteIndices\n-Type of the remote indices.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn indicessyncer.hh:63\n-_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bd_\bi_\bc_\be_\bs_\bS_\by_\bn_\bc_\be_\br_\b:_\b:_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bs_\b:_\b:_\bi_\bs_\bO_\bl_\bd\n-bool isOld() const\n-Was this entry already in the remote index list before the sync process?\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn indicessyncer.hh:600\n-_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bd_\bi_\bc_\be_\bs_\bS_\by_\bn_\bc_\be_\br_\b:_\b:_\bM_\be_\bs_\bs_\ba_\bg_\be_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\bp_\bu_\bb_\bl_\bi_\bs_\bh\n-int publish\n-The number of indices we publish for the other process.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn indicessyncer.hh:132\n-_\bD_\bu_\bn_\be_\b:_\b:_\br_\be_\bp_\ba_\bi_\br_\bL_\bo_\bc_\ba_\bl_\bI_\bn_\bd_\be_\bx_\bP_\bo_\bi_\bn_\bt_\be_\br_\bs\n-void repairLocalIndexPointers(std::map< int, SLList< std::pair< typename T::\n-GlobalIndex, typename T::LocalIndex::Attribute >, A > > &globalMap,\n-RemoteIndices< T, A1 > &remoteIndices, const T &indexSet)\n-Repair the pointers to the local indices in the remote indices.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn indicessyncer.hh:495\n-_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bd_\bi_\bc_\be_\bs_\bS_\by_\bn_\bc_\be_\br_\b:_\b:_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bs_\b:_\b:_\bi_\bs_\bA_\bt_\bE_\bn_\bd\n-bool isAtEnd() const\n-Are we at the end of the list?\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn indicessyncer.hh:622\n-_\bD_\bu_\bn_\be_\b:_\b:_\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\bi_\bc_\be_\bs_\b:_\b:_\bc_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bo_\br\n-MPI_Comm communicator() const\n-Get the mpi communicator used.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn remoteindices.hh:1695\n-_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bd_\bi_\bc_\be_\bs_\bS_\by_\bn_\bc_\be_\br_\b:_\b:_\bG_\bl_\bo_\bb_\ba_\bl_\bI_\bn_\bd_\be_\bx\n-ParallelIndexSet::GlobalIndex GlobalIndex\n-Type of the global index used in the index set.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn indicessyncer.hh:55\n-_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bd_\bi_\bc_\be_\bs_\bS_\by_\bn_\bc_\be_\br_\b:_\b:_\bM_\be_\bs_\bs_\ba_\bg_\be_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\bp_\ba_\bi_\br_\bs\n-int pairs\n-The number of pairs (attribute and process number) we publish to the neighbour\n-process.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn indicessyncer.hh:137\n-_\bD_\bu_\bn_\be_\b:_\b:_\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\bi_\bc_\be_\bs_\b:_\b:_\be_\bn_\bd\n-const_iterator end() const\n-Get an iterator over all remote index lists.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn remoteindices.hh:1528\n-_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bd_\bi_\bc_\be_\bs_\bS_\by_\bn_\bc_\be_\br_\b:_\b:_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bs_\b:_\b:_\ba_\bt_\bt_\br_\bi_\bb_\bu_\bt_\be\n-Attribute & attribute() const\n-_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bd_\bi_\bc_\be_\bs_\bS_\by_\bn_\bc_\be_\br_\b:_\b:_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bs_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b+_\b+\n-Iterators & operator++()\n-Increment all iterators.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn indicessyncer.hh:568\n-_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bd_\bi_\bc_\be_\bs_\bS_\by_\bn_\bc_\be_\br_\b:_\b:_\bA_\bt_\bt_\br_\bi_\bb_\bu_\bt_\be\n-ParallelIndexSet::LocalIndex::Attribute Attribute\n-Type of the attribute used in the index set.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn indicessyncer.hh:58\n-_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bd_\bi_\bc_\be_\bs_\bS_\by_\bn_\bc_\be_\br_\b:_\b:_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bs_\b:_\b:_\bg_\bl_\bo_\bb_\ba_\bl_\bI_\bn_\bd_\be_\bx_\bP_\ba_\bi_\br\n-std::pair< GlobalIndex, Attribute > & globalIndexPair() const\n-Get the global index of the remote index at current position.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn indicessyncer.hh:594\n-_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bd_\bi_\bc_\be_\bs_\bS_\by_\bn_\bc_\be_\br_\b:_\b:_\bI_\bn_\bd_\bi_\bc_\be_\bs_\bS_\by_\bn_\bc_\be_\br\n-IndicesSyncer(ParallelIndexSet &indexSet, RemoteIndices &remoteIndices)\n-Constructor.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn indicessyncer.hh:544\n-_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bd_\bi_\bc_\be_\bs_\bS_\by_\bn_\bc_\be_\br_\b:_\b:_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bs_\b:_\b:_\br_\be_\bs_\be_\bt\n-void reset(RemoteIndexList &remoteIndices, GlobalIndexList &globalIndices,\n-BoolList &booleans)\n-Reset all the underlying iterators.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn indicessyncer.hh:606\n-_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bd_\bi_\bc_\be_\bs_\bS_\by_\bn_\bc_\be_\br_\b:_\b:_\bD_\be_\bf_\ba_\bu_\bl_\bt_\bN_\bu_\bm_\bb_\be_\br_\be_\br_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b(_\b)\n-std::size_t operator()(const GlobalIndex &global)\n-Provide the local index, always std::numeric_limits::max()\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn indicessyncer.hh:151\n-_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bd_\bi_\bc_\be_\bs_\bS_\by_\bn_\bc_\be_\br_\b:_\b:_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt\n-T ParallelIndexSet\n-The type of the index set.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn indicessyncer.hh:49\n-_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bd_\bi_\bc_\be_\bs_\bS_\by_\bn_\bc_\be_\br_\b:_\b:_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bs_\b:_\b:_\bi_\bs_\bN_\bo_\bt_\bA_\bt_\bE_\bn_\bd\n-bool isNotAtEnd() const\n-Are we not at the end of the list?\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn indicessyncer.hh:616\n-_\bD_\bu_\bn_\be_\b:_\b:_\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\bi_\bc_\be_\bs_\b:_\b:_\bn_\be_\bi_\bg_\bh_\bb_\bo_\bu_\br_\bs\n-int neighbours() const\n-Get the number of processors we share indices with.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn remoteindices.hh:1445\n-_\bD_\bu_\bn_\be_\b:_\b:_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt_\b:_\b:_\bG_\bl_\bo_\bb_\ba_\bl_\bI_\bn_\bd_\be_\bx\n-TG GlobalIndex\n-the type of the global index. This type has to provide at least a operator< for\n-sorting.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn indexset.hh:226\n-_\bD_\bu_\bn_\be_\b:_\b:_\bs_\bt_\bo_\br_\be_\bG_\bl_\bo_\bb_\ba_\bl_\bI_\bn_\bd_\bi_\bc_\be_\bs_\bO_\bf_\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\bi_\bc_\be_\bs\n-void storeGlobalIndicesOfRemoteIndices(std::map< int, SLList< std::pair<\n-typename T::GlobalIndex, typename T::LocalIndex::Attribute >, A > > &globalMap,\n-const RemoteIndices< T, A1 > &remoteIndices)\n-Stores the corresponding global indices of the remote index information.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn indicessyncer.hh:469\n-_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bd_\bi_\bc_\be_\bs_\bS_\by_\bn_\bc_\be_\br_\b:_\b:_\bs_\by_\bn_\bc\n-void sync()\n-Sync the index set.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn indicessyncer.hh:736\n-_\bD_\bu_\bn_\be_\b:_\b:_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt_\b:_\b:_\bs_\be_\bq_\bN_\bo\n-int seqNo() const\n-Get the internal sequence number.\n-_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bd_\bi_\bc_\be_\bs_\bS_\by_\bn_\bc_\be_\br_\b:_\b:_\bI_\bn_\bd_\be_\bx_\bP_\ba_\bi_\br\n-ParallelIndexSet::IndexPair IndexPair\n-The type of the index pair.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn indicessyncer.hh:52\n-_\bD_\bu_\bn_\be_\b:_\b:_\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\bi_\bc_\be_\bs_\b:_\b:_\bb_\be_\bg_\bi_\bn\n-const_iterator begin() const\n-Get an iterator over all remote index lists.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn remoteindices.hh:1521\n-_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bd_\bi_\bc_\be_\bs_\bS_\by_\bn_\bc_\be_\br_\b:_\b:_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bs_\b:_\b:_\br_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\be_\bx\n-RemoteIndex & remoteIndex() const\n-Get the remote index at current position.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn indicessyncer.hh:587\n-_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bd_\bi_\bc_\be_\bs_\bS_\by_\bn_\bc_\be_\br_\b:_\b:_\bM_\be_\bs_\bs_\ba_\bg_\be_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\bM_\be_\bs_\bs_\ba_\bg_\be_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn\n-MessageInformation()\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn indicessyncer.hh:128\n-_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bd_\bi_\bc_\be_\bs_\bS_\by_\bn_\bc_\be_\br_\b:_\b:_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bs_\b:_\b:_\bi_\bn_\bs_\be_\br_\bt\n-void insert(const RemoteIndex &index, const std::pair< GlobalIndex, Attribute >\n-&global)\n-Insert a new remote index to the underlying remote index list.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn indicessyncer.hh:577\n-_\bD_\bu_\bn_\be_\b:_\b:_\bd_\bv_\bv_\be_\br_\bb\n-DVVerbType dvverb(std::cout)\n-stream for very verbose output.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn stdstreams.hh:96\n-_\bD_\bu_\bn_\be_\b:_\b:_\bd_\bv_\be_\br_\bb\n-DVerbType dverb(std::cout)\n-Singleton of verbose debug stream.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn stdstreams.hh:117\n-_\bD_\bu_\bn_\be\n-Dune namespace.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn alignedallocator.hh:13\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\bP_\bI_\bT_\br_\ba_\bi_\bt_\bs_\b:_\b:_\bg_\be_\bt_\bT_\by_\bp_\be\n-static MPI_Datatype getType()\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mpitraits.hh:48\n-_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bd_\be_\bx_\bP_\ba_\bi_\br\n-A pair consisting of a global and local index.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn indexset.hh:85\n-_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bd_\bi_\bc_\be_\bs_\bS_\by_\bn_\bc_\be_\br\n-Class for recomputing missing indices of a distributed index set.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn indicessyncer.hh:45\n-_\bD_\bu_\bn_\be_\b:_\b:_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bL_\bo_\bc_\ba_\bl_\bI_\bn_\bd_\be_\bx\n-An index present on the local process with an additional attribute flag.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn plocalindex.hh:52\n-_\bD_\bu_\bn_\be_\b:_\b:_\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\bi_\bc_\be_\bs\n-The indices present on remote processes.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn remoteindices.hh:190\n-_\bD_\bu_\bn_\be_\b:_\b:_\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\bi_\bc_\be_\bs_\b:_\b:_\bA_\bl_\bl_\bo_\bc_\ba_\bt_\bo_\br\n-typename std::allocator_traits< A >::template rebind_alloc< RemoteIndex >\n-Allocator\n-The type of the allocator for the remote index list.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn remoteindices.hh:238\n-_\bD_\bu_\bn_\be_\b:_\b:_\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\be_\bx\n-Information about an index residing on another processor.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn remoteindices.hh:74\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bL_\bL_\bi_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br\n-A mutable iterator for the SLList.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn sllist.hh:271\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bL_\bL_\bi_\bs_\bt\n-A single linked list.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn sllist.hh:44\n+2// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception\n+3// Will be removed after the 2.7 release\n+4#warning \"Deprecated header, use #include instead!\"\n+5#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bp_\ba_\br_\ba_\bl_\bl_\be_\bl_\b/_\bc_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b._\bh_\bh>\n+_\bc_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b._\bh_\bh\n+Implements an utility class that provides collective communication methods for\n+sequential programs.\n ===============================================================================\n Generated by\u00a0_\b[_\bd_\bo_\bx_\by_\bg_\be_\bn_\b] 1.9.8\n"}]}, {"source1": "./usr/share/doc/libdune-common-doc/doxygen/a00086.html", "source2": "./usr/share/doc/libdune-common-doc/doxygen/a00086.html", "unified_diff": "@@ -1,15 +1,15 @@\n \n \n \n \n \n \n \n-dune-common: shared_ptr.hh File Reference\n+dune-common: future.hh File Reference\n \n \n \n \n \n \n \n@@ -65,63 +65,50 @@\n
    \n \n \n \n \n \n \n
    \n \n-
    shared_ptr.hh File Reference
    \n+Namespaces
    \n+
    future.hh File Reference
    \n \n
    \n-\n-

    This file implements several utilities related to std::shared_ptr. \n-More...

    \n
    #include <memory>
    \n-#include <dune/common/typetraits.hh>
    \n+#include <type_traits>
    \n+#include <dune/common/exceptions.hh>
    \n
    \n

    Go to the source code of this file.

    \n \n \n-\n-\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n \n

    \n Classes

    struct  Dune::null_deleter< T >
     implements the Deleter concept of shared_ptr without deleting anything More...
    class  Dune::InvalidFutureException
     This exception is thrown when ready(), wait() or get() is called on an invalid future. A future is valid until get() is called and if it is not default-constructed and it was not moved from. More...
     
    class  Dune::Future< T >
     Type-erasure for future-like objects. A future-like object is a object satisfying the interface of FutureBase. More...
     
    class  Dune::PseudoFuture< T >
     A wrapper-class for a object which is ready immediately. More...
     
    class  Dune::PseudoFuture< void >
     
    \n \n \n \n \n-

    \n Namespaces

    namespace  Dune
     Dune namespace.
     
    \n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n

    \n-Functions

    template<typename T >
    std::shared_ptr< T > Dune::stackobject_to_shared_ptr (T &t)
     Create a shared_ptr for a stack-allocated object.
     
    template<class T >
    auto Dune::wrap_or_move (T &&t)
     Capture R-value reference to shared_ptr.
     
    template<class T >
    auto Dune::wrap_or_move (T &t)
     Capture L-value reference to std::shared_ptr.
     
    \n-

    Detailed Description

    \n-

    This file implements several utilities related to std::shared_ptr.

    \n-
    Author
    Markus Blatt
    \n-
    \n+\n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,40 +1,34 @@\n dune-common\u00a02.10\n Loading...\n Searching...\n No Matches\n * _\bd_\bu_\bn_\be\n * _\bc_\bo_\bm_\bm_\bo_\bn\n-_\bC_\bl_\ba_\bs_\bs_\be_\bs | _\bN_\ba_\bm_\be_\bs_\bp_\ba_\bc_\be_\bs | _\bF_\bu_\bn_\bc_\bt_\bi_\bo_\bn_\bs\n-shared_ptr.hh File Reference\n-This file implements several utilities related to std::shared_ptr. _\bM_\bo_\br_\be_\b._\b._\b.\n+ * _\bp_\ba_\br_\ba_\bl_\bl_\be_\bl\n+_\bC_\bl_\ba_\bs_\bs_\be_\bs | _\bN_\ba_\bm_\be_\bs_\bp_\ba_\bc_\be_\bs\n+future.hh File Reference\n #include \n-#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bt_\by_\bp_\be_\bt_\br_\ba_\bi_\bt_\bs_\b._\bh_\bh>\n+#include \n+#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\be_\bx_\bc_\be_\bp_\bt_\bi_\bo_\bn_\bs_\b._\bh_\bh>\n _\bG_\bo_\b _\bt_\bo_\b _\bt_\bh_\be_\b _\bs_\bo_\bu_\br_\bc_\be_\b _\bc_\bo_\bd_\be_\b _\bo_\bf_\b _\bt_\bh_\bi_\bs_\b _\bf_\bi_\bl_\be_\b.\n C\bCl\bla\bas\bss\bse\bes\bs\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bn_\bu_\bl_\bl_\b__\bd_\be_\bl_\be_\bt_\be_\br_\b<_\b _\bT_\b _\b>\n-\u00a0 implements the Deleter concept of shared_ptr without deleting anything\n- _\bM_\bo_\br_\be_\b._\b._\b.\n+class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bv_\ba_\bl_\bi_\bd_\bF_\bu_\bt_\bu_\br_\be_\bE_\bx_\bc_\be_\bp_\bt_\bi_\bo_\bn\n+ This exception is thrown when ready(), wait() or _\bg_\be_\bt_\b(_\b) is called on an\n+\u00a0 invalid future. A future is valid until _\bg_\be_\bt_\b(_\b) is called and if it is\n+ not default-constructed and it was not moved from. _\bM_\bo_\br_\be_\b._\b._\b.\n \u00a0\n-N\bNa\bam\bme\bes\bsp\bpa\bac\bce\bes\bs\n-namespace \u00a0 _\bD_\bu_\bn_\be\n-\u00a0 _\bD_\bu_\bn_\be namespace.\n+class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bF_\bu_\bt_\bu_\br_\be_\b<_\b _\bT_\b _\b>\n+\u00a0 Type-erasure for future-like objects. A future-like object is a object\n+ satisfying the interface of FutureBase. _\bM_\bo_\br_\be_\b._\b._\b.\n \u00a0\n-F\bFu\bun\bnc\bct\bti\bio\bon\bns\bs\n-template\n-std::shared_ptr< T >\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bs_\bt_\ba_\bc_\bk_\bo_\bb_\bj_\be_\bc_\bt_\b__\bt_\bo_\b__\bs_\bh_\ba_\br_\be_\bd_\b__\bp_\bt_\br (T &t)\n-\u00a0 Create a shared_ptr for a stack-allocated object.\n+class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bP_\bs_\be_\bu_\bd_\bo_\bF_\bu_\bt_\bu_\br_\be_\b<_\b _\bT_\b _\b>\n+\u00a0 A wrapper-class for a object which is ready immediately. _\bM_\bo_\br_\be_\b._\b._\b.\n \u00a0\n-template\n- auto\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bw_\br_\ba_\bp_\b__\bo_\br_\b__\bm_\bo_\bv_\be (T &&t)\n-\u00a0 Capture R-value reference to shared_ptr.\n+class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bP_\bs_\be_\bu_\bd_\bo_\bF_\bu_\bt_\bu_\br_\be_\b<_\b _\bv_\bo_\bi_\bd_\b _\b>\n \u00a0\n-template\n- auto\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bw_\br_\ba_\bp_\b__\bo_\br_\b__\bm_\bo_\bv_\be (T &t)\n-\u00a0 Capture L-value reference to std::shared_ptr.\n+N\bNa\bam\bme\bes\bsp\bpa\bac\bce\bes\bs\n+namespace \u00a0 _\bD_\bu_\bn_\be\n+\u00a0 _\bD_\bu_\bn_\be namespace.\n \u00a0\n-*\b**\b**\b**\b**\b* D\bDe\bet\bta\bai\bil\ble\bed\bd D\bDe\bes\bsc\bcr\bri\bip\bpt\bti\bio\bon\bn *\b**\b**\b**\b**\b*\n-This file implements several utilities related to std::shared_ptr.\n- Author\n- Markus Blatt\n ===============================================================================\n Generated by\u00a0_\b[_\bd_\bo_\bx_\by_\bg_\be_\bn_\b] 1.9.8\n"}]}, {"source1": "./usr/share/doc/libdune-common-doc/doxygen/a00086_source.html", "source2": "./usr/share/doc/libdune-common-doc/doxygen/a00086_source.html", "unified_diff": "@@ -1,15 +1,15 @@\n \n \n \n \n \n \n \n-dune-common: shared_ptr.hh Source File\n+dune-common: future.hh Source File\n \n \n \n \n \n \n \n@@ -70,76 +70,256 @@\n \n \n \n \n \n \n \n
    \n-
    shared_ptr.hh
    \n+
    future.hh
    \n
    \n
    \n Go to the documentation of this file.
    1// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
    \n
    2// vi: set et ts=4 sw=2 sts=2:
    \n
    3// SPDX-FileCopyrightInfo: Copyright \u00a9 DUNE Project contributors, see file LICENSE.md in module root
    \n
    4// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception
    \n-
    5
    \n-
    6#ifndef DUNE_SHARED_PTR_HH
    \n-
    7#define DUNE_SHARED_PTR_HH
    \n-
    8
    \n-
    9#include <memory>
    \n+
    5#ifndef DUNE_COMMON_PARALLEL_FUTURE_HH
    \n+
    6#define DUNE_COMMON_PARALLEL_FUTURE_HH
    \n+
    7
    \n+
    8#include <memory>
    \n+
    9#include <type_traits>
    \n
    10
    \n-\n-
    17namespace Dune
    \n-
    18{
    \n-
    47 template<class T>
    \n-
    \n-\n-
    49 {
    \n-
    50 void operator() (T*) const {}
    \n-
    51 };
    \n-
    \n-
    52
    \n-
    71 template<typename T>
    \n-
    \n-
    72 inline std::shared_ptr<T> stackobject_to_shared_ptr(T & t)
    \n-
    73 {
    \n-
    74 return std::shared_ptr<T>(&t, null_deleter<T>());
    \n-
    75 }
    \n-
    \n-
    76
    \n-
    77
    \n-
    95 template<class T>
    \n-
    \n-
    96 auto wrap_or_move(T&& t)
    \n-
    97 {
    \n-
    98 return std::make_shared<std::decay_t<T>>(std::forward<T>(t));
    \n-
    99 }
    \n+\n+
    12
    \n+
    13namespace Dune{
    \n+
    14
    \n+
    \n+\n+
    20 {};
    \n+
    \n+
    21
    \n+
    22 // forward declaration
    \n+
    23 template<class T>
    \n+
    24 class PseudoFuture;
    \n+
    25
    \n+
    29 template<class T>
    \n+
    \n+
    30 class Future{
    \n+
    31 // Future interface:
    \n+
    32 class FutureBase{
    \n+
    33 public:
    \n+
    34 virtual ~FutureBase() = default;
    \n+
    35 virtual void wait() = 0;
    \n+
    36 virtual bool ready() const = 0;
    \n+
    37 virtual bool valid() const = 0;
    \n+
    38 virtual T get() = 0;
    \n+
    39 };
    \n+
    40
    \n+
    41 // model class
    \n+
    42 template<class F>
    \n+
    43 class FutureModel
    \n+
    44 : public FutureBase
    \n+
    45 {
    \n+
    46 F _future;
    \n+
    47 public:
    \n+
    48 FutureModel(F&& f)
    \n+
    49 : _future(std::forward<F>(f))
    \n+
    50 {}
    \n+
    51
    \n+
    52 virtual void wait() override
    \n+
    53 {
    \n+
    54 _future.wait();
    \n+
    55 }
    \n+
    56
    \n+
    57 virtual bool ready() const override
    \n+
    58 {
    \n+
    59 return _future.ready();
    \n+
    60 }
    \n+
    61
    \n+
    62 virtual bool valid() const override
    \n+
    63 {
    \n+
    64 return _future.valid();
    \n+
    65 }
    \n+
    66
    \n+
    67 virtual T get() override{
    \n+
    68 return (T)_future.get();
    \n+
    69 }
    \n+
    70 };
    \n+
    71
    \n+
    72 std::unique_ptr<FutureBase> _future;
    \n+
    73 public:
    \n+
    74 template<class F>
    \n+
    \n+
    75 Future(F&& f)
    \n+
    76 : _future(std::make_unique<FutureModel<F>>(std::forward<F>(f)))
    \n+
    77 {}
    \n+
    \n+
    78
    \n+
    79 template<class U, std::enable_if_t<std::is_same<U,T>::value && !std::is_same<T,void>::value>>
    \n+
    \n+
    80 Future(U&& data)
    \n+
    81 : _future(std::make_unique<FutureModel<PseudoFuture<T>>>(PseudoFuture<T>(std::forward<U>(data))))
    \n+
    82 {}
    \n+
    \n+
    83
    \n+
    84 Future() = default;
    \n+
    85
    \n+
    \n+
    89 void wait(){
    \n+
    90 _future->wait();
    \n+
    91 }
    \n+
    \n+
    92
    \n+
    \n+
    97 T get() {
    \n+
    98 return _future->get();
    \n+
    99 }
    \n
    \n
    100
    \n-
    118 template<class T>
    \n-
    \n-
    119 auto wrap_or_move(T& t)
    \n-
    120 {
    \n-\n-
    122 }
    \n-
    \n-
    123
    \n-
    124}
    \n-
    125#endif
    \n-
    Traits for type conversions and type information.
    \n+
    \n+
    105 bool ready() const {
    \n+
    106 return _future->ready();
    \n+
    107 }
    \n+
    \n+
    108
    \n+
    \n+
    114 bool valid() const {
    \n+
    115 if(_future)
    \n+
    116 return _future->valid();
    \n+
    117 return false;
    \n+
    118 }
    \n+
    \n+
    119 };
    \n+
    \n+
    120
    \n+
    123 template<class T>
    \n+
    \n+\n+
    125 bool valid_;
    \n+
    126 T data_;
    \n+
    127 public:
    \n+
    \n+\n+
    129 valid_(false)
    \n+
    130 {}
    \n+
    \n+
    131
    \n+
    132 template<class U>
    \n+
    \n+\n+
    134 valid_(true),
    \n+
    135 data_(std::forward<U>(u))
    \n+
    136 {}
    \n+
    \n+
    137
    \n+
    \n+
    138 void wait() {
    \n+
    139 if(!valid_)
    \n+
    140 DUNE_THROW(InvalidFutureException, "The PseudoFuture is not valid");
    \n+
    141 }
    \n+
    \n+
    142
    \n+
    \n+
    143 bool ready() const {
    \n+
    144 if(!valid_)
    \n+
    145 DUNE_THROW(InvalidFutureException, "The PseudoFuture is not valid");
    \n+
    146 return true;
    \n+
    147 }
    \n+
    \n+
    148
    \n+
    \n+
    149 T get() {
    \n+
    150 if(!valid_)
    \n+
    151 DUNE_THROW(InvalidFutureException, "The PseudoFuture is not valid");
    \n+
    152 valid_ = false;
    \n+
    153 return std::forward<T>(data_);
    \n+
    154 }
    \n+
    \n+
    155
    \n+
    \n+
    156 bool valid() const {
    \n+
    157 return valid_;
    \n+
    158 }
    \n+
    \n+
    159 };
    \n+
    \n+
    160
    \n+
    161 template<>
    \n+
    \n+
    162 class PseudoFuture<void>{
    \n+
    163 bool valid_;
    \n+
    164 public:
    \n+
    \n+
    165 PseudoFuture(bool valid = false) :
    \n+
    166 valid_(valid)
    \n+
    167 {}
    \n+
    \n+
    168
    \n+
    \n+
    169 void wait(){
    \n+
    170 if(!valid_)
    \n+
    171 DUNE_THROW(InvalidFutureException, "The PseudoFuture is not valid");
    \n+
    172 }
    \n+
    \n+
    \n+
    173 bool ready() const{
    \n+
    174 if(!valid_)
    \n+
    175 DUNE_THROW(InvalidFutureException, "The PseudoFuture is not valid");
    \n+
    176 return true;
    \n+
    177 }
    \n+
    \n+
    178
    \n+
    \n+
    179 void get(){
    \n+
    180 if(!valid_)
    \n+
    181 DUNE_THROW(InvalidFutureException, "The PseudoFuture is not valid");
    \n+
    182 valid_ = false;
    \n+
    183 }
    \n+
    \n+
    184
    \n+
    \n+
    185 bool valid() const{
    \n+
    186 return valid_;
    \n+
    187 }
    \n+
    \n+
    188 };
    \n+
    \n+
    189}
    \n+
    190
    \n+
    191#endif // DUNE_COMMON_PARALLEL_FUTURE_HH
    \n+
    A few common exception classes.
    \n+
    #define DUNE_THROW(E, m)
    Definition exceptions.hh:218
    \n+
    STL namespace.
    \n
    Dune namespace.
    Definition alignedallocator.hh:13
    \n-
    std::shared_ptr< T > stackobject_to_shared_ptr(T &t)
    Create a shared_ptr for a stack-allocated object.
    Definition shared_ptr.hh:72
    \n-
    auto wrap_or_move(T &&t)
    Capture R-value reference to shared_ptr.
    Definition shared_ptr.hh:96
    \n-
    implements the Deleter concept of shared_ptr without deleting anything
    Definition shared_ptr.hh:49
    \n-
    std::shared_ptr< T > stackobject_to_shared_ptr(T &t)
    Create a shared_ptr for a stack-allocated object.
    Definition shared_ptr.hh:72
    \n-
    void operator()(T *) const
    Definition shared_ptr.hh:50
    \n+
    constexpr auto get(std::integer_sequence< T, II... >, std::integral_constant< std::size_t, pos >={})
    Return the entry at position pos of the given sequence.
    Definition integersequence.hh:22
    \n+
    Default exception if a function was called while the object is not in a valid state for that function...
    Definition exceptions.hh:281
    \n+
    This exception is thrown when ready(), wait() or get() is called on an invalid future....
    Definition future.hh:20
    \n+
    A wrapper-class for a object which is ready immediately.
    Definition future.hh:124
    \n+
    bool ready() const
    Definition future.hh:143
    \n+
    T get()
    Definition future.hh:149
    \n+
    PseudoFuture(U &&u)
    Definition future.hh:133
    \n+
    PseudoFuture()
    Definition future.hh:128
    \n+
    void wait()
    Definition future.hh:138
    \n+
    bool valid() const
    Definition future.hh:156
    \n+
    Type-erasure for future-like objects. A future-like object is a object satisfying the interface of Fu...
    Definition future.hh:30
    \n+
    bool ready() const
    Definition future.hh:105
    \n+
    void wait()
    wait until the future is ready
    Definition future.hh:89
    \n+
    Future(U &&data)
    Definition future.hh:80
    \n+
    T get()
    Waits until the future is ready and returns the resulting value.
    Definition future.hh:97
    \n+
    Future()=default
    \n+
    bool valid() const
    Checks whether the future is valid. I.e. \u2018get()\u2019 was not called on that future and when it was not de...
    Definition future.hh:114
    \n+
    Future(F &&f)
    Definition future.hh:75
    \n+
    bool ready() const
    Definition future.hh:173
    \n+
    bool valid() const
    Definition future.hh:185
    \n+
    void get()
    Definition future.hh:179
    \n+
    PseudoFuture(bool valid=false)
    Definition future.hh:165
    \n+
    void wait()
    Definition future.hh:169
    \n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,74 +1,267 @@\n dune-common\u00a02.10\n Loading...\n Searching...\n No Matches\n * _\bd_\bu_\bn_\be\n * _\bc_\bo_\bm_\bm_\bo_\bn\n-shared_ptr.hh\n+ * _\bp_\ba_\br_\ba_\bl_\bl_\be_\bl\n+future.hh\n _\bG_\bo_\b _\bt_\bo_\b _\bt_\bh_\be_\b _\bd_\bo_\bc_\bu_\bm_\be_\bn_\bt_\ba_\bt_\bi_\bo_\bn_\b _\bo_\bf_\b _\bt_\bh_\bi_\bs_\b _\bf_\bi_\bl_\be_\b.\n 1// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-\n 2// vi: set et ts=4 sw=2 sts=2:\n 3// SPDX-FileCopyrightInfo: Copyright \u00c2\u00a9 DUNE Project contributors, see file\n LICENSE.md in module root\n 4// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception\n-5\n-6#ifndef DUNE_SHARED_PTR_HH\n-7#define DUNE_SHARED_PTR_HH\n-8\n-9#include \n+5#ifndef DUNE_COMMON_PARALLEL_FUTURE_HH\n+6#define DUNE_COMMON_PARALLEL_FUTURE_HH\n+7\n+8#include \n+9#include \n 10\n-11#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bt_\by_\bp_\be_\bt_\br_\ba_\bi_\bt_\bs_\b._\bh_\bh>\n-17namespace _\bD_\bu_\bn_\be\n-18{\n-47 template\n-_\b4_\b8 struct _\bn_\bu_\bl_\bl_\b__\bd_\be_\bl_\be_\bt_\be_\br\n-49 {\n-_\b5_\b0 void _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b(_\b)_\b (T*) const {}\n-51 };\n-52\n-71 template\n-_\b7_\b2 inline std::shared_ptr _\bs_\bt_\ba_\bc_\bk_\bo_\bb_\bj_\be_\bc_\bt_\b__\bt_\bo_\b__\bs_\bh_\ba_\br_\be_\bd_\b__\bp_\bt_\br(T & t)\n-73 {\n-74 return std::shared_ptr(&t, _\bn_\bu_\bl_\bl_\b__\bd_\be_\bl_\be_\bt_\be_\br_\b<_\bT_\b>());\n-75 }\n-76\n-77\n-95 template\n-_\b9_\b6 auto _\bw_\br_\ba_\bp_\b__\bo_\br_\b__\bm_\bo_\bv_\be(T&& t)\n-97 {\n-98 return std::make_shared>(std::forward(t));\n+11#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\be_\bx_\bc_\be_\bp_\bt_\bi_\bo_\bn_\bs_\b._\bh_\bh>\n+12\n+13namespace _\bD_\bu_\bn_\be{\n+14\n+_\b1_\b9 class _\bI_\bn_\bv_\ba_\bl_\bi_\bd_\bF_\bu_\bt_\bu_\br_\be_\bE_\bx_\bc_\be_\bp_\bt_\bi_\bo_\bn : public _\bI_\bn_\bv_\ba_\bl_\bi_\bd_\bS_\bt_\ba_\bt_\be_\bE_\bx_\bc_\be_\bp_\bt_\bi_\bo_\bn\n+20 {};\n+21\n+22 // forward declaration\n+23 template\n+24 class _\bP_\bs_\be_\bu_\bd_\bo_\bF_\bu_\bt_\bu_\br_\be;\n+25\n+29 template\n+_\b3_\b0 class _\bF_\bu_\bt_\bu_\br_\be{\n+31 // Future interface:\n+32 class FutureBase{\n+33 public:\n+34 virtual ~FutureBase() = default;\n+35 virtual void wait() = 0;\n+36 virtual bool ready() const = 0;\n+37 virtual bool valid() const = 0;\n+38 virtual T _\bg_\be_\bt() = 0;\n+39 };\n+40\n+41 // model class\n+42 template\n+43 class FutureModel\n+44 : public FutureBase\n+45 {\n+46 F _future;\n+47 public:\n+48 FutureModel(F&& f)\n+49 : _future(std::forward(f))\n+50 {}\n+51\n+52 virtual void wait() override\n+53 {\n+54 _future.wait();\n+55 }\n+56\n+57 virtual bool ready() const override\n+58 {\n+59 return _future.ready();\n+60 }\n+61\n+62 virtual bool valid() const override\n+63 {\n+64 return _future.valid();\n+65 }\n+66\n+67 virtual T _\bg_\be_\bt() override{\n+68 return (T)_future.get();\n+69 }\n+70 };\n+71\n+72 std::unique_ptr _future;\n+73 public:\n+74 template\n+_\b7_\b5 _\bF_\bu_\bt_\bu_\br_\be(F&& f)\n+76 : _future(_\bs_\bt_\bd::make_unique>(_\bs_\bt_\bd::forward(f)))\n+77 {}\n+78\n+79 template::value && !std::\n+is_same::value>>\n+_\b8_\b0 _\bF_\bu_\bt_\bu_\br_\be(U&& data)\n+81 : _future(_\bs_\bt_\bd::make_unique>>(_\bP_\bs_\be_\bu_\bd_\bo_\bF_\bu_\bt_\bu_\br_\be\n+(_\bs_\bt_\bd::forward(data))))\n+82 {}\n+83\n+_\b8_\b4 _\bF_\bu_\bt_\bu_\br_\be() = default;\n+85\n+_\b8_\b9 void _\bw_\ba_\bi_\bt(){\n+90 _future->wait();\n+91 }\n+92\n+_\b9_\b7 T _\bg_\be_\bt() {\n+98 return _future->get();\n 99 }\n 100\n-118 template\n-_\b1_\b1_\b9 auto _\bw_\br_\ba_\bp_\b__\bo_\br_\b__\bm_\bo_\bv_\be(T& t)\n-120 {\n-121 return _\bs_\bt_\ba_\bc_\bk_\bo_\bb_\bj_\be_\bc_\bt_\b__\bt_\bo_\b__\bs_\bh_\ba_\br_\be_\bd_\b__\bp_\bt_\br(t);\n-122 }\n-123\n-124}\n-125#endif\n-_\bt_\by_\bp_\be_\bt_\br_\ba_\bi_\bt_\bs_\b._\bh_\bh\n-Traits for type conversions and type information.\n+_\b1_\b0_\b5 bool _\br_\be_\ba_\bd_\by() const {\n+106 return _future->ready();\n+107 }\n+108\n+_\b1_\b1_\b4 bool _\bv_\ba_\bl_\bi_\bd() const {\n+115 if(_future)\n+116 return _future->valid();\n+117 return false;\n+118 }\n+119 };\n+120\n+123 template\n+_\b1_\b2_\b4 class _\bP_\bs_\be_\bu_\bd_\bo_\bF_\bu_\bt_\bu_\br_\be{\n+125 bool valid_;\n+126 T data_;\n+127 public:\n+_\b1_\b2_\b8 _\bP_\bs_\be_\bu_\bd_\bo_\bF_\bu_\bt_\bu_\br_\be() :\n+129 valid_(false)\n+130 {}\n+131\n+132 template\n+_\b1_\b3_\b3 _\bP_\bs_\be_\bu_\bd_\bo_\bF_\bu_\bt_\bu_\br_\be(U&& u) :\n+134 valid_(true),\n+135 data_(_\bs_\bt_\bd::forward(u))\n+136 {}\n+137\n+_\b1_\b3_\b8 void _\bw_\ba_\bi_\bt() {\n+139 if(!valid_)\n+140 _\bD_\bU_\bN_\bE_\b__\bT_\bH_\bR_\bO_\bW(_\bI_\bn_\bv_\ba_\bl_\bi_\bd_\bF_\bu_\bt_\bu_\br_\be_\bE_\bx_\bc_\be_\bp_\bt_\bi_\bo_\bn, \"The PseudoFuture is not valid\");\n+141 }\n+142\n+_\b1_\b4_\b3 bool _\br_\be_\ba_\bd_\by() const {\n+144 if(!valid_)\n+145 _\bD_\bU_\bN_\bE_\b__\bT_\bH_\bR_\bO_\bW(_\bI_\bn_\bv_\ba_\bl_\bi_\bd_\bF_\bu_\bt_\bu_\br_\be_\bE_\bx_\bc_\be_\bp_\bt_\bi_\bo_\bn, \"The PseudoFuture is not valid\");\n+146 return true;\n+147 }\n+148\n+_\b1_\b4_\b9 T _\bg_\be_\bt() {\n+150 if(!valid_)\n+151 _\bD_\bU_\bN_\bE_\b__\bT_\bH_\bR_\bO_\bW(_\bI_\bn_\bv_\ba_\bl_\bi_\bd_\bF_\bu_\bt_\bu_\br_\be_\bE_\bx_\bc_\be_\bp_\bt_\bi_\bo_\bn, \"The PseudoFuture is not valid\");\n+152 valid_ = false;\n+153 return std::forward(data_);\n+154 }\n+155\n+_\b1_\b5_\b6 bool _\bv_\ba_\bl_\bi_\bd() const {\n+157 return valid_;\n+158 }\n+159 };\n+160\n+161 template<>\n+_\b1_\b6_\b2 class _\bP_\bs_\be_\bu_\bd_\bo_\bF_\bu_\bt_\bu_\br_\be{\n+163 bool valid_;\n+164 public:\n+_\b1_\b6_\b5 _\bP_\bs_\be_\bu_\bd_\bo_\bF_\bu_\bt_\bu_\br_\be(bool _\bv_\ba_\bl_\bi_\bd = false) :\n+166 valid_(_\bv_\ba_\bl_\bi_\bd)\n+167 {}\n+168\n+_\b1_\b6_\b9 void _\bw_\ba_\bi_\bt(){\n+170 if(!valid_)\n+171 _\bD_\bU_\bN_\bE_\b__\bT_\bH_\bR_\bO_\bW(_\bI_\bn_\bv_\ba_\bl_\bi_\bd_\bF_\bu_\bt_\bu_\br_\be_\bE_\bx_\bc_\be_\bp_\bt_\bi_\bo_\bn, \"The PseudoFuture is not valid\");\n+172 }\n+_\b1_\b7_\b3 bool _\br_\be_\ba_\bd_\by() const{\n+174 if(!valid_)\n+175 _\bD_\bU_\bN_\bE_\b__\bT_\bH_\bR_\bO_\bW(_\bI_\bn_\bv_\ba_\bl_\bi_\bd_\bF_\bu_\bt_\bu_\br_\be_\bE_\bx_\bc_\be_\bp_\bt_\bi_\bo_\bn, \"The PseudoFuture is not valid\");\n+176 return true;\n+177 }\n+178\n+_\b1_\b7_\b9 void _\bg_\be_\bt(){\n+180 if(!valid_)\n+181 _\bD_\bU_\bN_\bE_\b__\bT_\bH_\bR_\bO_\bW(_\bI_\bn_\bv_\ba_\bl_\bi_\bd_\bF_\bu_\bt_\bu_\br_\be_\bE_\bx_\bc_\be_\bp_\bt_\bi_\bo_\bn, \"The PseudoFuture is not valid\");\n+182 valid_ = false;\n+183 }\n+184\n+_\b1_\b8_\b5 bool _\bv_\ba_\bl_\bi_\bd() const{\n+186 return valid_;\n+187 }\n+188 };\n+189}\n+190\n+191#endif // DUNE_COMMON_PARALLEL_FUTURE_HH\n+_\be_\bx_\bc_\be_\bp_\bt_\bi_\bo_\bn_\bs_\b._\bh_\bh\n+A few common exception classes.\n+_\bD_\bU_\bN_\bE_\b__\bT_\bH_\bR_\bO_\bW\n+#define DUNE_THROW(E, m)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn exceptions.hh:218\n+_\bs_\bt_\bd\n+STL namespace.\n _\bD_\bu_\bn_\be\n Dune namespace.\n D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn alignedallocator.hh:13\n-_\bD_\bu_\bn_\be_\b:_\b:_\bs_\bt_\ba_\bc_\bk_\bo_\bb_\bj_\be_\bc_\bt_\b__\bt_\bo_\b__\bs_\bh_\ba_\br_\be_\bd_\b__\bp_\bt_\br\n-std::shared_ptr< T > stackobject_to_shared_ptr(T &t)\n-Create a shared_ptr for a stack-allocated object.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn shared_ptr.hh:72\n-_\bD_\bu_\bn_\be_\b:_\b:_\bw_\br_\ba_\bp_\b__\bo_\br_\b__\bm_\bo_\bv_\be\n-auto wrap_or_move(T &&t)\n-Capture R-value reference to shared_ptr.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn shared_ptr.hh:96\n-_\bD_\bu_\bn_\be_\b:_\b:_\bn_\bu_\bl_\bl_\b__\bd_\be_\bl_\be_\bt_\be_\br\n-implements the Deleter concept of shared_ptr without deleting anything\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn shared_ptr.hh:49\n-_\bD_\bu_\bn_\be_\b:_\b:_\bn_\bu_\bl_\bl_\b__\bd_\be_\bl_\be_\bt_\be_\br_\b:_\b:_\bs_\bt_\ba_\bc_\bk_\bo_\bb_\bj_\be_\bc_\bt_\b__\bt_\bo_\b__\bs_\bh_\ba_\br_\be_\bd_\b__\bp_\bt_\br\n-std::shared_ptr< T > stackobject_to_shared_ptr(T &t)\n-Create a shared_ptr for a stack-allocated object.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn shared_ptr.hh:72\n-_\bD_\bu_\bn_\be_\b:_\b:_\bn_\bu_\bl_\bl_\b__\bd_\be_\bl_\be_\bt_\be_\br_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b(_\b)\n-void operator()(T *) const\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn shared_ptr.hh:50\n+_\bD_\bu_\bn_\be_\b:_\b:_\bg_\be_\bt\n+constexpr auto get(std::integer_sequence< T, II... >, std::integral_constant<\n+std::size_t, pos >={})\n+Return the entry at position pos of the given sequence.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn integersequence.hh:22\n+_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bv_\ba_\bl_\bi_\bd_\bS_\bt_\ba_\bt_\be_\bE_\bx_\bc_\be_\bp_\bt_\bi_\bo_\bn\n+Default exception if a function was called while the object is not in a valid\n+state for that function...\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn exceptions.hh:281\n+_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bv_\ba_\bl_\bi_\bd_\bF_\bu_\bt_\bu_\br_\be_\bE_\bx_\bc_\be_\bp_\bt_\bi_\bo_\bn\n+This exception is thrown when ready(), wait() or get() is called on an invalid\n+future....\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn future.hh:20\n+_\bD_\bu_\bn_\be_\b:_\b:_\bP_\bs_\be_\bu_\bd_\bo_\bF_\bu_\bt_\bu_\br_\be\n+A wrapper-class for a object which is ready immediately.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn future.hh:124\n+_\bD_\bu_\bn_\be_\b:_\b:_\bP_\bs_\be_\bu_\bd_\bo_\bF_\bu_\bt_\bu_\br_\be_\b:_\b:_\br_\be_\ba_\bd_\by\n+bool ready() const\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn future.hh:143\n+_\bD_\bu_\bn_\be_\b:_\b:_\bP_\bs_\be_\bu_\bd_\bo_\bF_\bu_\bt_\bu_\br_\be_\b:_\b:_\bg_\be_\bt\n+T get()\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn future.hh:149\n+_\bD_\bu_\bn_\be_\b:_\b:_\bP_\bs_\be_\bu_\bd_\bo_\bF_\bu_\bt_\bu_\br_\be_\b:_\b:_\bP_\bs_\be_\bu_\bd_\bo_\bF_\bu_\bt_\bu_\br_\be\n+PseudoFuture(U &&u)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn future.hh:133\n+_\bD_\bu_\bn_\be_\b:_\b:_\bP_\bs_\be_\bu_\bd_\bo_\bF_\bu_\bt_\bu_\br_\be_\b:_\b:_\bP_\bs_\be_\bu_\bd_\bo_\bF_\bu_\bt_\bu_\br_\be\n+PseudoFuture()\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn future.hh:128\n+_\bD_\bu_\bn_\be_\b:_\b:_\bP_\bs_\be_\bu_\bd_\bo_\bF_\bu_\bt_\bu_\br_\be_\b:_\b:_\bw_\ba_\bi_\bt\n+void wait()\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn future.hh:138\n+_\bD_\bu_\bn_\be_\b:_\b:_\bP_\bs_\be_\bu_\bd_\bo_\bF_\bu_\bt_\bu_\br_\be_\b:_\b:_\bv_\ba_\bl_\bi_\bd\n+bool valid() const\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn future.hh:156\n+_\bD_\bu_\bn_\be_\b:_\b:_\bF_\bu_\bt_\bu_\br_\be\n+Type-erasure for future-like objects. A future-like object is a object\n+satisfying the interface of Fu...\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn future.hh:30\n+_\bD_\bu_\bn_\be_\b:_\b:_\bF_\bu_\bt_\bu_\br_\be_\b:_\b:_\br_\be_\ba_\bd_\by\n+bool ready() const\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn future.hh:105\n+_\bD_\bu_\bn_\be_\b:_\b:_\bF_\bu_\bt_\bu_\br_\be_\b:_\b:_\bw_\ba_\bi_\bt\n+void wait()\n+wait until the future is ready\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn future.hh:89\n+_\bD_\bu_\bn_\be_\b:_\b:_\bF_\bu_\bt_\bu_\br_\be_\b:_\b:_\bF_\bu_\bt_\bu_\br_\be\n+Future(U &&data)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn future.hh:80\n+_\bD_\bu_\bn_\be_\b:_\b:_\bF_\bu_\bt_\bu_\br_\be_\b:_\b:_\bg_\be_\bt\n+T get()\n+Waits until the future is ready and returns the resulting value.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn future.hh:97\n+_\bD_\bu_\bn_\be_\b:_\b:_\bF_\bu_\bt_\bu_\br_\be_\b:_\b:_\bF_\bu_\bt_\bu_\br_\be\n+Future()=default\n+_\bD_\bu_\bn_\be_\b:_\b:_\bF_\bu_\bt_\bu_\br_\be_\b:_\b:_\bv_\ba_\bl_\bi_\bd\n+bool valid() const\n+Checks whether the future is valid. I.e. \u00e2\u0080\u0098get()\u00e2\u0080\u0099 was not called on that\n+future and when it was not de...\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn future.hh:114\n+_\bD_\bu_\bn_\be_\b:_\b:_\bF_\bu_\bt_\bu_\br_\be_\b:_\b:_\bF_\bu_\bt_\bu_\br_\be\n+Future(F &&f)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn future.hh:75\n+_\bD_\bu_\bn_\be_\b:_\b:_\bP_\bs_\be_\bu_\bd_\bo_\bF_\bu_\bt_\bu_\br_\be_\b<_\b _\bv_\bo_\bi_\bd_\b _\b>_\b:_\b:_\br_\be_\ba_\bd_\by\n+bool ready() const\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn future.hh:173\n+_\bD_\bu_\bn_\be_\b:_\b:_\bP_\bs_\be_\bu_\bd_\bo_\bF_\bu_\bt_\bu_\br_\be_\b<_\b _\bv_\bo_\bi_\bd_\b _\b>_\b:_\b:_\bv_\ba_\bl_\bi_\bd\n+bool valid() const\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn future.hh:185\n+_\bD_\bu_\bn_\be_\b:_\b:_\bP_\bs_\be_\bu_\bd_\bo_\bF_\bu_\bt_\bu_\br_\be_\b<_\b _\bv_\bo_\bi_\bd_\b _\b>_\b:_\b:_\bg_\be_\bt\n+void get()\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn future.hh:179\n+_\bD_\bu_\bn_\be_\b:_\b:_\bP_\bs_\be_\bu_\bd_\bo_\bF_\bu_\bt_\bu_\br_\be_\b<_\b _\bv_\bo_\bi_\bd_\b _\b>_\b:_\b:_\bP_\bs_\be_\bu_\bd_\bo_\bF_\bu_\bt_\bu_\br_\be\n+PseudoFuture(bool valid=false)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn future.hh:165\n+_\bD_\bu_\bn_\be_\b:_\b:_\bP_\bs_\be_\bu_\bd_\bo_\bF_\bu_\bt_\bu_\br_\be_\b<_\b _\bv_\bo_\bi_\bd_\b _\b>_\b:_\b:_\bw_\ba_\bi_\bt\n+void wait()\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn future.hh:169\n ===============================================================================\n Generated by\u00a0_\b[_\bd_\bo_\bx_\by_\bg_\be_\bn_\b] 1.9.8\n"}]}, {"source1": "./usr/share/doc/libdune-common-doc/doxygen/a00089.html", "source2": "./usr/share/doc/libdune-common-doc/doxygen/a00089.html", "unified_diff": "@@ -1,15 +1,15 @@\n \n \n \n \n \n \n \n-dune-common: math.hh File Reference\n+dune-common: localindex.hh File Reference\n \n \n \n \n \n \n \n@@ -65,202 +65,55 @@\n
    \n \n \n \n \n \n \n
    \n \n-
    math.hh File Reference
    \n+Enumerations
    \n+ \n \n
    \n \n-

    Some useful basic math stuff. \n+

    Provides classes for use as the local index in ParallelIndexSet. \n More...

    \n-
    #include <cmath>
    \n-#include <complex>
    \n-#include <limits>
    \n-#include <type_traits>
    \n-#include <dune/common/typeutilities.hh>
    \n+
    #include <cstddef>
    \n
    \n

    Go to the source code of this file.

    \n \n \n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n+\n+\n \n

    \n Classes

    struct  Dune::StandardMathematicalConstants< T >
     Standard implementation of MathematicalConstants. More...
     
    struct  Dune::MathematicalConstants< Field >
     Provides commonly used mathematical constants. More...
     
    struct  Dune::Factorial< m >
     
    struct  Dune::Factorial< 0 >
     end of recursion of factorial via specialization More...
     
    struct  Dune::MathOverloads::ADLTag
     Tag to make sure the functions in this namespace can be found by ADL. More...
     
    struct  Dune::MathImpl::isUnorderedImpl
    class  Dune::LocalIndex
     An index present on the local process. More...
     
    \n \n \n \n \n-\n-\n-\n-\n-\n

    \n Namespaces

    namespace  Dune
     Dune namespace.
     
    namespace  Dune::MathOverloads
     namespace for customization of math functions with Dune-Semantics
     
    namespace  Dune::MathImpl
     
    \n-\n-\n-\n-\n-\n-

    \n-Macros

    #define DUNE_COMMON_MATH_ISFUNCTION(function, stdfunction)
     
    #define DUNE_COMMON_MATH_ISFUNCTION_FUNCTOR(function)
     
    \n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n+\n+\n+\n+\n

    \n-Functions

    template<class Base , class Exponent >
    constexpr Base Dune::power (Base m, Exponent p)
     Power method for integer exponents.
     
    template<class T >
    static constexpr T Dune::factorial (const T &n) noexcept
     calculate the factorial of n as a constexpr
     
    template<class T , T n>
    static constexpr auto Dune::factorial (std::integral_constant< T, n >) noexcept
     calculate the factorial of n as a constexpr
     
    template<class T >
    static constexpr T Dune::binomial (const T &n, const T &k) noexcept
     calculate the binomial coefficient n over k as a constexpr
     
    template<class T , T n, T k>
    static constexpr auto Dune::binomial (std::integral_constant< T, n >, std::integral_constant< T, k >) noexcept
     calculate the binomial coefficient n over k as a constexpr
     
    template<class T , T n>
    static constexpr auto Dune::binomial (std::integral_constant< T, n >, std::integral_constant< T, n >) noexcept
     
    template<class K >
    Dune::conjugateComplex (const K &x)
     compute conjugate complex of x
     
    template<class T >
    int Dune::sign (const T &val)
     Return the sign of the value.
     
     Dune::MathOverloads::DUNE_COMMON_MATH_ISFUNCTION (isNaN, isnan)
     
     Dune::MathOverloads::DUNE_COMMON_MATH_ISFUNCTION (isInf, isinf)
     
     Dune::MathOverloads::DUNE_COMMON_MATH_ISFUNCTION (isFinite, isfinite)
     
    template<class T >
    auto Dune::MathOverloads::isUnordered (const T &t1, const T &t2, PriorityTag< 1 >, ADLTag) -> decltype(isUnordered(t1, t2))
     
    template<class T >
    auto Dune::MathOverloads::isUnordered (const T &t1, const T &t2, PriorityTag< 0 >, ADLTag)
     
     Dune::MathImpl::DUNE_COMMON_MATH_ISFUNCTION_FUNCTOR (isNaN)
     
     Dune::MathImpl::DUNE_COMMON_MATH_ISFUNCTION_FUNCTOR (isInf)
     
     Dune::MathImpl::DUNE_COMMON_MATH_ISFUNCTION_FUNCTOR (isFinite)
     
    template<class T , class = std::enable_if_t<Impl::isComplexLike<T>::value>>
    auto Dune::MathOverloads::isNaN (const T &t, PriorityTag< 2 >, ADLTag)
     
    template<class T , class = std::enable_if_t<Impl::isComplexLike<T>::value>>
    auto Dune::MathOverloads::isInf (const T &t, PriorityTag< 2 >, ADLTag)
     
    template<class T , class = std::enable_if_t<Impl::isComplexLike<T>::value>>
    auto Dune::MathOverloads::isFinite (const T &t, PriorityTag< 2 >, ADLTag)
     

    \n+Enumerations

    enum  Dune::LocalIndexState { Dune::VALID\n+, Dune::DELETED\n+ }
     The states available for the local indices. More...
     
    \n

    Detailed Description

    \n-

    Some useful basic math stuff.

    \n-

    Macro Definition Documentation

    \n-\n-

    ◆ DUNE_COMMON_MATH_ISFUNCTION

    \n-\n-
    \n-
    \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n-
    #define DUNE_COMMON_MATH_ISFUNCTION( function,
     stdfunction 
    )
    \n-
    \n-Value:
    template<class T> \\
    \n-
    auto function(const T &t, PriorityTag<1>, ADLTag) \\
    \n-
    -> decltype(function(t)) { \\
    \n-
    return function(t); \\
    \n-
    } \\
    \n-
    template<class T> \\
    \n-
    auto function(const T &t, PriorityTag<0>, ADLTag) { \\
    \n-
    using std::stdfunction; \\
    \n-
    return stdfunction(t); \\
    \n-
    } \\
    \n-
    static_assert(true, "Require semicolon to unconfuse editors")
    \n-
    \n-
    \n-
    \n-\n-

    ◆ DUNE_COMMON_MATH_ISFUNCTION_FUNCTOR

    \n-\n-
    \n-
    \n- \n- \n- \n- \n- \n- \n- \n- \n-
    #define DUNE_COMMON_MATH_ISFUNCTION_FUNCTOR( function)
    \n-
    \n-Value:
    struct function##Impl { \\
    \n-
    template<class T> \\
    \n-
    constexpr auto operator()(const T &t) const { \\
    \n-
    return function(t, PriorityTag<10>{}, MathOverloads::ADLTag{}); \\
    \n-
    } \\
    \n-
    }; \\
    \n-
    static_assert(true, "Require semicolon to unconfuse editors")
    \n-
    \n-
    \n-
    \n-
    \n+

    Provides classes for use as the local index in ParallelIndexSet.

    \n+
    Author
    Markus Blatt
    \n+
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,154 +1,31 @@\n dune-common\u00a02.10\n Loading...\n Searching...\n No Matches\n * _\bd_\bu_\bn_\be\n * _\bc_\bo_\bm_\bm_\bo_\bn\n-_\bC_\bl_\ba_\bs_\bs_\be_\bs | _\bN_\ba_\bm_\be_\bs_\bp_\ba_\bc_\be_\bs | _\bM_\ba_\bc_\br_\bo_\bs | _\bF_\bu_\bn_\bc_\bt_\bi_\bo_\bn_\bs\n-math.hh File Reference\n-Some useful basic math stuff. _\bM_\bo_\br_\be_\b._\b._\b.\n-#include \n-#include \n-#include \n-#include \n-#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bt_\by_\bp_\be_\bu_\bt_\bi_\bl_\bi_\bt_\bi_\be_\bs_\b._\bh_\bh>\n+ * _\bp_\ba_\br_\ba_\bl_\bl_\be_\bl\n+_\bC_\bl_\ba_\bs_\bs_\be_\bs | _\bN_\ba_\bm_\be_\bs_\bp_\ba_\bc_\be_\bs | _\bE_\bn_\bu_\bm_\be_\br_\ba_\bt_\bi_\bo_\bn_\bs\n+localindex.hh File Reference\n+_\bC_\bo_\bm_\bm_\bo_\bn \u00bb _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\b _\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn \u00bb _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\b _\bC_\bo_\bm_\bp_\bu_\bt_\bi_\bn_\bg_\b _\bb_\ba_\bs_\be_\bd_\b _\bo_\bn_\b _\bI_\bn_\bd_\be_\bx_\bs_\be_\bt_\bs\n+Provides classes for use as the local index in ParallelIndexSet. _\bM_\bo_\br_\be_\b._\b._\b.\n+#include \n _\bG_\bo_\b _\bt_\bo_\b _\bt_\bh_\be_\b _\bs_\bo_\bu_\br_\bc_\be_\b _\bc_\bo_\bd_\be_\b _\bo_\bf_\b _\bt_\bh_\bi_\bs_\b _\bf_\bi_\bl_\be_\b.\n C\bCl\bla\bas\bss\bse\bes\bs\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bS_\bt_\ba_\bn_\bd_\ba_\br_\bd_\bM_\ba_\bt_\bh_\be_\bm_\ba_\bt_\bi_\bc_\ba_\bl_\bC_\bo_\bn_\bs_\bt_\ba_\bn_\bt_\bs_\b<_\b _\bT_\b _\b>\n-\u00a0 Standard implementation of _\bM_\ba_\bt_\bh_\be_\bm_\ba_\bt_\bi_\bc_\ba_\bl_\bC_\bo_\bn_\bs_\bt_\ba_\bn_\bt_\bs. _\bM_\bo_\br_\be_\b._\b._\b.\n-\u00a0\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\bh_\be_\bm_\ba_\bt_\bi_\bc_\ba_\bl_\bC_\bo_\bn_\bs_\bt_\ba_\bn_\bt_\bs_\b<_\b _\bF_\bi_\be_\bl_\bd_\b _\b>\n-\u00a0 Provides commonly used mathematical constants. _\bM_\bo_\br_\be_\b._\b._\b.\n-\u00a0\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bF_\ba_\bc_\bt_\bo_\br_\bi_\ba_\bl_\b<_\b _\bm_\b _\b>\n-\u00a0\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bF_\ba_\bc_\bt_\bo_\br_\bi_\ba_\bl_\b<_\b _\b0_\b _\b>\n-\u00a0 end of recursion of factorial via specialization _\bM_\bo_\br_\be_\b._\b._\b.\n-\u00a0\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\bh_\bO_\bv_\be_\br_\bl_\bo_\ba_\bd_\bs_\b:_\b:_\bA_\bD_\bL_\bT_\ba_\bg\n-\u00a0 Tag to make sure the functions in this namespace can be found by ADL.\n- _\bM_\bo_\br_\be_\b._\b._\b.\n-\u00a0\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\bh_\bI_\bm_\bp_\bl_\b:_\b:_\bi_\bs_\bU_\bn_\bo_\br_\bd_\be_\br_\be_\bd_\bI_\bm_\bp_\bl\n+class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bL_\bo_\bc_\ba_\bl_\bI_\bn_\bd_\be_\bx\n+\u00a0 An index present on the local process. _\bM_\bo_\br_\be_\b._\b._\b.\n \u00a0\n N\bNa\bam\bme\bes\bsp\bpa\bac\bce\bes\bs\n namespace \u00a0 _\bD_\bu_\bn_\be\n \u00a0 _\bD_\bu_\bn_\be namespace.\n \u00a0\n-namespace \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\bh_\bO_\bv_\be_\br_\bl_\bo_\ba_\bd_\bs\n-\u00a0 namespace for customization of math functions with Dune-Semantics\n-\u00a0\n-namespace \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\bh_\bI_\bm_\bp_\bl\n-\u00a0\n-M\bMa\bac\bcr\bro\bos\bs\n-#define\u00a0 _\bD_\bU_\bN_\bE_\b__\bC_\bO_\bM_\bM_\bO_\bN_\b__\bM_\bA_\bT_\bH_\b__\bI_\bS_\bF_\bU_\bN_\bC_\bT_\bI_\bO_\bN(function, stdfunction)\n-\u00a0\n-#define\u00a0 _\bD_\bU_\bN_\bE_\b__\bC_\bO_\bM_\bM_\bO_\bN_\b__\bM_\bA_\bT_\bH_\b__\bI_\bS_\bF_\bU_\bN_\bC_\bT_\bI_\bO_\bN_\b__\bF_\bU_\bN_\bC_\bT_\bO_\bR(function)\n-\u00a0\n-F\bFu\bun\bnc\bct\bti\bio\bon\bns\bs\n-template\n- constexpr Base\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bp_\bo_\bw_\be_\br (Base m, Exponent p)\n-\u00a0 Power method for integer exponents.\n-\u00a0\n-template\n- static constexpr T\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bf_\ba_\bc_\bt_\bo_\br_\bi_\ba_\bl (const T &n) noexcept\n-\u00a0 calculate the factorial of n as a constexpr\n-\u00a0\n-template\n-static constexpr auto\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bf_\ba_\bc_\bt_\bo_\br_\bi_\ba_\bl (std::integral_constant< T, n >)\n- noexcept\n-\u00a0 calculate the factorial of n as a constexpr\n-\u00a0\n-template\n- static constexpr T\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bb_\bi_\bn_\bo_\bm_\bi_\ba_\bl (const T &n, const T &k) noexcept\n-\u00a0 calculate the binomial coefficient n over k as a\n- constexpr\n-\u00a0\n-template\n-static constexpr auto\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bb_\bi_\bn_\bo_\bm_\bi_\ba_\bl (std::integral_constant< T, n >, std::\n- integral_constant< T, k >) noexcept\n-\u00a0 calculate the binomial coefficient n over k as a\n- constexpr\n-\u00a0\n-template\n-static constexpr auto\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bb_\bi_\bn_\bo_\bm_\bi_\ba_\bl (std::integral_constant< T, n >, std::\n- integral_constant< T, n >) noexcept\n-\u00a0\n-template\n- K\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bc_\bo_\bn_\bj_\bu_\bg_\ba_\bt_\be_\bC_\bo_\bm_\bp_\bl_\be_\bx (const K &x)\n-\u00a0 compute conjugate complex of x\n-\u00a0\n-template\n- int\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bs_\bi_\bg_\bn (const T &val)\n-\u00a0 Return the sign of the value.\n-\u00a0\n- \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\bh_\bO_\bv_\be_\br_\bl_\bo_\ba_\bd_\bs_\b:_\b:_\bD_\bU_\bN_\bE_\b__\bC_\bO_\bM_\bM_\bO_\bN_\b__\bM_\bA_\bT_\bH_\b__\bI_\bS_\bF_\bU_\bN_\bC_\bT_\bI_\bO_\bN (_\bi_\bs_\bN_\ba_\bN,\n- isnan)\n-\u00a0\n- \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\bh_\bO_\bv_\be_\br_\bl_\bo_\ba_\bd_\bs_\b:_\b:_\bD_\bU_\bN_\bE_\b__\bC_\bO_\bM_\bM_\bO_\bN_\b__\bM_\bA_\bT_\bH_\b__\bI_\bS_\bF_\bU_\bN_\bC_\bT_\bI_\bO_\bN (_\bi_\bs_\bI_\bn_\bf,\n- isinf)\n-\u00a0\n- \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\bh_\bO_\bv_\be_\br_\bl_\bo_\ba_\bd_\bs_\b:_\b:_\bD_\bU_\bN_\bE_\b__\bC_\bO_\bM_\bM_\bO_\bN_\b__\bM_\bA_\bT_\bH_\b__\bI_\bS_\bF_\bU_\bN_\bC_\bT_\bI_\bO_\bN\n- (_\bi_\bs_\bF_\bi_\bn_\bi_\bt_\be, isfinite)\n-\u00a0\n-template\n- auto\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\bh_\bO_\bv_\be_\br_\bl_\bo_\ba_\bd_\bs_\b:_\b:_\bi_\bs_\bU_\bn_\bo_\br_\bd_\be_\br_\be_\bd (const T &t1, const T\n- &t2, _\bP_\br_\bi_\bo_\br_\bi_\bt_\by_\bT_\ba_\bg< 1 >, _\bA_\bD_\bL_\bT_\ba_\bg) -> decltype(isUnordered\n- (t1, t2))\n-\u00a0\n-template\n- auto\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\bh_\bO_\bv_\be_\br_\bl_\bo_\ba_\bd_\bs_\b:_\b:_\bi_\bs_\bU_\bn_\bo_\br_\bd_\be_\br_\be_\bd (const T &t1, const T\n- &t2, _\bP_\br_\bi_\bo_\br_\bi_\bt_\by_\bT_\ba_\bg< 0 >, _\bA_\bD_\bL_\bT_\ba_\bg)\n-\u00a0\n- \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\bh_\bI_\bm_\bp_\bl_\b:_\b:_\bD_\bU_\bN_\bE_\b__\bC_\bO_\bM_\bM_\bO_\bN_\b__\bM_\bA_\bT_\bH_\b__\bI_\bS_\bF_\bU_\bN_\bC_\bT_\bI_\bO_\bN_\b__\bF_\bU_\bN_\bC_\bT_\bO_\bR\n- (isNaN)\n-\u00a0\n- \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\bh_\bI_\bm_\bp_\bl_\b:_\b:_\bD_\bU_\bN_\bE_\b__\bC_\bO_\bM_\bM_\bO_\bN_\b__\bM_\bA_\bT_\bH_\b__\bI_\bS_\bF_\bU_\bN_\bC_\bT_\bI_\bO_\bN_\b__\bF_\bU_\bN_\bC_\bT_\bO_\bR\n- (isInf)\n-\u00a0\n- \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\bh_\bI_\bm_\bp_\bl_\b:_\b:_\bD_\bU_\bN_\bE_\b__\bC_\bO_\bM_\bM_\bO_\bN_\b__\bM_\bA_\bT_\bH_\b__\bI_\bS_\bF_\bU_\bN_\bC_\bT_\bI_\bO_\bN_\b__\bF_\bU_\bN_\bC_\bT_\bO_\bR\n- (isFinite)\n-\u00a0\n-template::value>>\n- auto\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\bh_\bO_\bv_\be_\br_\bl_\bo_\ba_\bd_\bs_\b:_\b:_\bi_\bs_\bN_\ba_\bN (const T &t, _\bP_\br_\bi_\bo_\br_\bi_\bt_\by_\bT_\ba_\bg< 2\n- >, _\bA_\bD_\bL_\bT_\ba_\bg)\n-\u00a0\n-template::value>>\n- auto\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\bh_\bO_\bv_\be_\br_\bl_\bo_\ba_\bd_\bs_\b:_\b:_\bi_\bs_\bI_\bn_\bf (const T &t, _\bP_\br_\bi_\bo_\br_\bi_\bt_\by_\bT_\ba_\bg< 2\n- >, _\bA_\bD_\bL_\bT_\ba_\bg)\n-\u00a0\n-template::value>>\n- auto\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\bh_\bO_\bv_\be_\br_\bl_\bo_\ba_\bd_\bs_\b:_\b:_\bi_\bs_\bF_\bi_\bn_\bi_\bt_\be (const T &t, _\bP_\br_\bi_\bo_\br_\bi_\bt_\by_\bT_\ba_\bg<\n- 2 >, _\bA_\bD_\bL_\bT_\ba_\bg)\n+E\bEn\bnu\bum\bme\ber\bra\bat\bti\bio\bon\bns\bs\n+enum \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bL_\bo_\bc_\ba_\bl_\bI_\bn_\bd_\be_\bx_\bS_\bt_\ba_\bt_\be { _\bD_\bu_\bn_\be_\b:_\b:_\bV_\bA_\bL_\bI_\bD , _\bD_\bu_\bn_\be_\b:_\b:_\bD_\bE_\bL_\bE_\bT_\bE_\bD }\n+\u00a0 The states available for the local indices. _\bM_\bo_\br_\be_\b._\b._\b.\n \u00a0\n *\b**\b**\b**\b**\b* D\bDe\bet\bta\bai\bil\ble\bed\bd D\bDe\bes\bsc\bcr\bri\bip\bpt\bti\bio\bon\bn *\b**\b**\b**\b**\b*\n-Some useful basic math stuff.\n-*\b**\b**\b**\b**\b* M\bMa\bac\bcr\bro\bo D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn D\bDo\boc\bcu\bum\bme\ben\bnt\bta\bat\bti\bio\bon\bn *\b**\b**\b**\b**\b*\n-*\b**\b**\b**\b**\b* _\b?\b\u25c6_\b?\b\u00a0D\bDU\bUN\bNE\bE_\b_C\bCO\bOM\bMM\bMO\bON\bN_\b_M\bMA\bAT\bTH\bH_\b_I\bIS\bSF\bFU\bUN\bNC\bCT\bTI\bIO\bON\bN *\b**\b**\b**\b**\b*\n-#define DUNE_COMMON_MATH_ISFUNCTION ( \u00a0 function,\n- \u00a0 stdfunction\u00a0\n- )\n-V\bVa\bal\blu\bue\be:\b:\n-template \\\n-auto function(const T &t, PriorityTag<1>, ADLTag) \\\n--> decltype(function(t)) { \\\n-return function(t); \\\n-} \\\n-template \\\n-auto function(const T &t, PriorityTag<0>, ADLTag) { \\\n-using std::stdfunction; \\\n-return stdfunction(t); \\\n-} \\\n-static_assert(true, \"Require semicolon to unconfuse editors\")\n-*\b**\b**\b**\b**\b* _\b?\b\u25c6_\b?\b\u00a0D\bDU\bUN\bNE\bE_\b_C\bCO\bOM\bMM\bMO\bON\bN_\b_M\bMA\bAT\bTH\bH_\b_I\bIS\bSF\bFU\bUN\bNC\bCT\bTI\bIO\bON\bN_\b_F\bFU\bUN\bNC\bCT\bTO\bOR\bR *\b**\b**\b**\b**\b*\n-#define DUNE_COMMON_MATH_ISFUNCTION_FUNCTOR ( \u00a0 function )\n-V\bVa\bal\blu\bue\be:\b:\n-struct function##Impl { \\\n-template \\\n-constexpr auto operator()(const T &t) const { \\\n-return function(t, PriorityTag<10>{}, MathOverloads::ADLTag{}); \\\n-} \\\n-}; \\\n-static_assert(true, \"Require semicolon to unconfuse editors\")\n+Provides classes for use as the local index in ParallelIndexSet.\n+ Author\n+ Markus Blatt\n ===============================================================================\n Generated by\u00a0_\b[_\bd_\bo_\bx_\by_\bg_\be_\bn_\b] 1.9.8\n"}]}, {"source1": "./usr/share/doc/libdune-common-doc/doxygen/a00089_source.html", "source2": "./usr/share/doc/libdune-common-doc/doxygen/a00089_source.html", "unified_diff": "@@ -1,15 +1,15 @@\n \n \n \n \n \n \n \n-dune-common: math.hh Source File\n+dune-common: localindex.hh Source File\n \n \n \n \n \n \n \n@@ -70,377 +70,117 @@\n \n \n \n \n \n \n \n
    \n-
    math.hh
    \n+
    localindex.hh
    \n
    \n
    \n Go to the documentation of this file.
    1// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
    \n
    2// vi: set et ts=4 sw=2 sts=2:
    \n
    3// SPDX-FileCopyrightInfo: Copyright \u00a9 DUNE Project contributors, see file LICENSE.md in module root
    \n
    4// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception
    \n-
    5#ifndef DUNE_MATH_HH
    \n-
    6#define DUNE_MATH_HH
    \n-
    7
    \n-
    12#include <cmath>
    \n-
    13#include <complex>
    \n-
    14#include <limits>
    \n-
    15#include <type_traits>
    \n-
    16
    \n-\n-
    18
    \n-
    19namespace Dune
    \n-
    20{
    \n-
    21
    \n-
    32 template< class T >
    \n-
    \n-\n-
    34 {
    \n-
    \n-
    38 static const T e ()
    \n-
    39 {
    \n-
    40 using std::exp;
    \n-
    41 static const T e = exp( T( 1 ) );
    \n-
    42 return e;
    \n-
    43 }
    \n+
    5
    \n+
    6#ifndef DUNE_COMMON_PARALLEL_LOCALINDEX_HH
    \n+
    7#define DUNE_COMMON_PARALLEL_LOCALINDEX_HH
    \n+
    8
    \n+
    9#include <cstddef>
    \n+
    10
    \n+
    11namespace Dune
    \n+
    12{
    \n+
    13
    \n+
    14
    \n+\n+
    29
    \n+
    30
    \n+
    \n+\n+
    35 {
    \n+
    36 public:
    \n+
    \n+\n+
    42 localIndex_(0), state_(VALID){}
    \n
    \n+
    43
    \n
    44
    \n-
    \n-
    48 static const T pi ()
    \n-
    49 {
    \n-
    50 using std::acos;
    \n-
    51 static const T pi = acos( T( -1 ) );
    \n-
    52 return pi;
    \n-
    53 }
    \n+
    \n+
    49 LocalIndex(std::size_t index) :
    \n+
    50 localIndex_(index), state_(VALID){}
    \n
    \n-
    54 };
    \n-
    \n-
    55
    \n+
    55 inline const std::size_t& local() const;
    \n
    56
    \n-
    64 template< class Field >
    \n-
    \n-\n-
    66 : public StandardMathematicalConstants<Field>
    \n-
    67 {};
    \n-
    \n+
    60 inline operator std::size_t() const;
    \n+
    61
    \n+
    67 inline LocalIndex& operator=(std::size_t index);
    \n
    68
    \n-
    69
    \n-
    74 template <class Base, class Exponent>
    \n-
    \n-
    75 constexpr Base power(Base m, Exponent p)
    \n-
    76 {
    \n-
    77 static_assert(std::numeric_limits<Exponent>::is_integer, "Exponent must be an integer type!");
    \n-
    78
    \n-
    79 auto result = Base(1);
    \n-
    80 auto absp = (p<0) ? -p : p; // This is simply abs, but std::abs is not constexpr
    \n-
    81 for (Exponent i = Exponent(0); i<absp; i++)
    \n-
    82 result *= m;
    \n-
    83
    \n-
    84 if (p<0)
    \n-
    85 result = Base(1)/result;
    \n-
    86
    \n-
    87 return result;
    \n-
    88 }
    \n-
    \n-
    89
    \n-
    92 template <int m>
    \n-
    \n-
    93 struct Factorial
    \n-
    94 {
    \n-
    96 static constexpr int factorial = m * Factorial<m-1>::factorial;
    \n-
    97 };
    \n-
    \n-
    98
    \n-
    100 template <>
    \n-
    \n-
    101 struct [[deprecated("Use function factorial instead! Will be removed after Dune 2.9")]] Factorial<0>
    \n-
    102 {
    \n-
    103 // 0! = 1
    \n-
    104 static constexpr int factorial = 1;
    \n-
    105 };
    \n-
    \n-
    106
    \n-
    107
    \n-
    109 // T has to be an integral type
    \n-
    110 template<class T>
    \n-
    \n-
    111 constexpr inline static T factorial(const T& n) noexcept
    \n-
    112 {
    \n-
    113 static_assert(std::numeric_limits<T>::is_integer, "`factorial(n)` has to be called with an integer type.");
    \n-
    114 T fac = 1;
    \n-
    115 for(T k = 0; k < n; ++k)
    \n-
    116 fac *= k+1;
    \n-
    117 return fac;
    \n-
    118 }
    \n-
    \n-
    119
    \n-
    121 template<class T, T n>
    \n-
    \n-
    122 constexpr inline static auto factorial (std::integral_constant<T, n>) noexcept
    \n-
    123 {
    \n-
    124 return std::integral_constant<T, factorial(n)>{};
    \n-
    125 }
    \n-
    \n-
    126
    \n-
    127
    \n-
    129 // T has to be an integral type
    \n-
    130 template<class T>
    \n-
    \n-
    131 constexpr inline static T binomial (const T& n, const T& k) noexcept
    \n-
    132 {
    \n-
    133 static_assert(std::numeric_limits<T>::is_integer, "`binomial(n, k)` has to be called with an integer type.");
    \n-
    134
    \n-
    135 if( k < 0 || k > n )
    \n-
    136 return 0;
    \n-
    137
    \n-
    138 if (2*k > n)
    \n-
    139 return binomial(n, n-k);
    \n-
    140
    \n-
    141 T bin = 1;
    \n-
    142 for(auto i = n-k; i < n; ++i)
    \n-
    143 bin *= i+1;
    \n-
    144 return bin / factorial(k);
    \n-
    145 }
    \n-
    \n-
    146
    \n-
    148 template<class T, T n, T k>
    \n-
    \n-
    149 constexpr inline static auto binomial (std::integral_constant<T, n>, std::integral_constant<T, k>) noexcept
    \n-
    150 {
    \n-
    151 return std::integral_constant<T, binomial(n, k)>{};
    \n-
    152 }
    \n-
    \n-
    153
    \n-
    154 template<class T, T n>
    \n-
    \n-
    155 constexpr inline static auto binomial (std::integral_constant<T, n>, std::integral_constant<T, n>) noexcept
    \n-
    156 {
    \n-
    157 return std::integral_constant<T, (n >= 0 ? 1 : 0)>{};
    \n-
    158 }
    \n-
    \n-
    159
    \n-
    160
    \n-
    162 // conjugate complex does nothing for non-complex types
    \n-
    163 template<class K>
    \n-
    \n-
    164 inline K conjugateComplex (const K& x)
    \n-
    165 {
    \n-
    166 return x;
    \n-
    167 }
    \n-
    \n-
    168
    \n-
    169#ifndef DOXYGEN
    \n-
    170 // specialization for complex
    \n-
    171 template<class K>
    \n-
    172 inline std::complex<K> conjugateComplex (const std::complex<K>& c)
    \n-
    173 {
    \n-
    174 return std::complex<K>(c.real(),-c.imag());
    \n-
    175 }
    \n-
    176#endif
    \n-
    177
    \n-
    179 template <class T>
    \n-
    \n-
    180 int sign(const T& val)
    \n-
    181 {
    \n-
    182 return (val < 0 ? -1 : 1);
    \n-
    183 }
    \n-
    \n-
    184
    \n-
    185
    \n-
    186 namespace Impl {
    \n-
    187 // Returns whether a given type behaves like std::complex<>, i.e. whether
    \n-
    188 // real() and imag() are defined
    \n-
    189 template<class T>
    \n-
    190 struct isComplexLike {
    \n-
    191 private:
    \n-
    192 template<class U>
    \n-
    193 static auto test(U* u) -> decltype(u->real(), u->imag(), std::true_type());
    \n-
    194
    \n-
    195 template<class U>
    \n-
    196 static auto test(...) -> decltype(std::false_type());
    \n-
    197
    \n-
    198 public:
    \n-
    199 static const bool value = decltype(test<T>(0))::value;
    \n-
    200 };
    \n-
    201 } // namespace Impl
    \n-
    202
    \n-
    204
    \n-
    227 namespace MathOverloads {
    \n-
    228
    \n-
    230 struct ADLTag {};
    \n-
    231
    \n-
    \n-
    232#define DUNE_COMMON_MATH_ISFUNCTION(function, stdfunction) \\
    \n-
    233 template<class T> \\
    \n-
    234 auto function(const T &t, PriorityTag<1>, ADLTag) \\
    \n-
    235 -> decltype(function(t)) { \\
    \n-
    236 return function(t); \\
    \n-
    237 } \\
    \n-
    238 template<class T> \\
    \n-
    239 auto function(const T &t, PriorityTag<0>, ADLTag) { \\
    \n-
    240 using std::stdfunction; \\
    \n-
    241 return stdfunction(t); \\
    \n-
    242 } \\
    \n-
    243 static_assert(true, "Require semicolon to unconfuse editors")
    \n-
    \n-
    244
    \n-\n-\n-\n-
    248#undef DUNE_COMMON_MATH_ISFUNCTION
    \n-
    249
    \n-
    250 template<class T>
    \n-
    \n-
    251 auto isUnordered(const T &t1, const T &t2, PriorityTag<1>, ADLTag)
    \n-
    252 -> decltype(isUnordered(t1, t2)) {
    \n-
    253 return isUnordered(t1, t2);
    \n-
    254 }
    \n-
    \n-
    255
    \n-
    256 template<class T>
    \n-
    \n-
    257 auto isUnordered(const T &t1, const T &t2, PriorityTag<0>, ADLTag) {
    \n-
    258 using std::isunordered;
    \n-
    259 return isunordered(t1, t2);
    \n-
    260 }
    \n-
    \n-
    261 }
    \n-
    262
    \n-
    \n-
    263 namespace MathImpl {
    \n-
    264
    \n-
    265 // NOTE: it is important that these functors have names different from the
    \n-
    266 // names of the functions they are forwarding to. Otherwise the
    \n-
    267 // unqualified call would find the functor type, not a function, and ADL
    \n-
    268 // would never be attempted.
    \n-
    \n-
    269#define DUNE_COMMON_MATH_ISFUNCTION_FUNCTOR(function) \\
    \n-
    270 struct function##Impl { \\
    \n-
    271 template<class T> \\
    \n-
    272 constexpr auto operator()(const T &t) const { \\
    \n-
    273 return function(t, PriorityTag<10>{}, MathOverloads::ADLTag{}); \\
    \n-
    274 } \\
    \n-
    275 }; \\
    \n-
    276 static_assert(true, "Require semicolon to unconfuse editors")
    \n-
    \n-
    277
    \n-\n-\n-\n-
    281#undef DUNE_COMMON_MATH_ISFUNCTION_FUNCTOR
    \n-
    282
    \n-
    \n-\n-
    284 template<class T>
    \n-
    \n-
    285 constexpr auto operator()(const T &t1, const T &t2) const {
    \n-
    286 return isUnordered(t1, t2, PriorityTag<10>{}, MathOverloads::ADLTag{});
    \n-
    287 }
    \n-
    \n-
    288 };
    \n-
    \n-
    289
    \n-
    290 } //MathImpl
    \n-
    \n-
    291
    \n-
    292
    \n-
    293 namespace Impl {
    \n-
    294 /* This helper has a math functor as a static constexpr member. Doing
    \n-
    295 this as a static member of a template struct means we can do this
    \n-
    296 without violating the ODR or putting the definition into a separate
    \n-
    297 compilation unit, while still still ensuring the functor is the same
    \n-
    298 lvalue across all compilation units.
    \n-
    299 */
    \n-
    300 template<class T>
    \n-
    301 struct MathDummy
    \n-
    302 {
    \n-
    303 static constexpr T value{};
    \n-
    304 };
    \n-
    305
    \n-
    306 template<class T>
    \n-
    307 constexpr T MathDummy<T>::value;
    \n-
    308
    \n-
    309 } //namespace Impl
    \n-
    310
    \n-
    311 namespace {
    \n-
    312 /* Provide the math functors directly in the `Dune` namespace.
    \n-
    313
    \n-
    314 This actually declares a different name in each translation unit, but
    \n-
    315 they all resolve to the same lvalue.
    \n-
    316 */
    \n-
    317
    \n-
    319
    \n-
    323 constexpr auto const &isNaN = Impl::MathDummy<MathImpl::isNaNImpl>::value;
    \n-
    324
    \n-
    326
    \n-
    330 constexpr auto const &isInf = Impl::MathDummy<MathImpl::isInfImpl>::value;
    \n-
    331
    \n-
    333
    \n-
    337 constexpr auto const &isFinite = Impl::MathDummy<MathImpl::isFiniteImpl>::value;
    \n-
    338
    \n-
    340
    \n-
    345 constexpr auto const &isUnordered = Impl::MathDummy<MathImpl::isUnorderedImpl>::value;
    \n-
    346 }
    \n-
    347
    \n-
    348 namespace MathOverloads {
    \n-
    349 /*Overloads for complex types*/
    \n-
    350 template<class T, class = std::enable_if_t<Impl::isComplexLike<T>::value> >
    \n-
    \n-
    351 auto isNaN(const T &t, PriorityTag<2>, ADLTag) {
    \n-
    352 return Dune::isNaN(real(t)) || Dune::isNaN(imag(t));
    \n-
    353 }
    \n-
    \n-
    354
    \n-
    355 template<class T, class = std::enable_if_t<Impl::isComplexLike<T>::value> >
    \n-
    \n-
    356 auto isInf(const T &t, PriorityTag<2>, ADLTag) {
    \n-
    357 return Dune::isInf(real(t)) || Dune::isInf(imag(t));
    \n-
    358 }
    \n-
    \n-
    359
    \n-
    360 template<class T, class = std::enable_if_t<Impl::isComplexLike<T>::value> >
    \n-
    \n-
    361 auto isFinite(const T &t, PriorityTag<2>, ADLTag) {
    \n-
    362 return Dune::isFinite(real(t)) && Dune::isFinite(imag(t));
    \n-
    363 }
    \n-
    \n-
    364 } //MathOverloads
    \n-
    365}
    \n-
    366
    \n-
    367#endif // #ifndef DUNE_MATH_HH
    \n-
    #define DUNE_COMMON_MATH_ISFUNCTION_FUNCTOR(function)
    Definition math.hh:269
    \n-
    #define DUNE_COMMON_MATH_ISFUNCTION(function, stdfunction)
    Definition math.hh:232
    \n-
    Utilities for type computations, constraining overloads, ...
    \n+
    73 inline LocalIndexState state() const;
    \n+
    74
    \n+
    79 inline void setState(LocalIndexState state);
    \n+
    80
    \n+
    81 private:
    \n+
    83 std::size_t localIndex_;
    \n+
    84
    \n+
    91 char state_;
    \n+
    92
    \n+
    93 };
    \n+
    \n+
    94
    \n+
    95
    \n+
    96
    \n+
    \n+
    97 inline const std::size_t& LocalIndex::local() const {
    \n+
    98 return localIndex_;
    \n+
    99 }
    \n+
    \n+
    100
    \n+
    \n+
    101 inline LocalIndex::operator std::size_t() const {
    \n+
    102 return localIndex_;
    \n+
    103 }
    \n+
    \n+
    104
    \n+
    \n+
    105 inline LocalIndex& LocalIndex::operator=(std::size_t index){
    \n+
    106 localIndex_ = index;
    \n+
    107 return *this;
    \n+
    108 }
    \n+
    \n+
    109
    \n+
    \n+\n+
    111 return static_cast<LocalIndexState>(state_);
    \n+
    112 }
    \n+
    \n+
    113
    \n+
    \n+\n+
    115 state_ = static_cast<char>(state);
    \n+
    116 }
    \n+
    \n+
    117
    \n+
    120} // namespace Dune
    \n+
    121
    \n+
    122#endif // DUNE_COMMON_PARALLEL_LOCALINDEX_HH
    \n+
    LocalIndexState
    The states available for the local indices.
    Definition localindex.hh:28
    \n+
    LocalIndex & operator=(std::size_t index)
    Assign a new local index.
    Definition localindex.hh:105
    \n+
    LocalIndexState state() const
    Get the state.
    Definition localindex.hh:110
    \n+
    const std::size_t & local() const
    get the local index.
    Definition localindex.hh:97
    \n+
    void setState(LocalIndexState state)
    Set the state.
    Definition localindex.hh:114
    \n+
    @ VALID
    Definition localindex.hh:28
    \n+
    @ DELETED
    Definition localindex.hh:28
    \n
    Dune namespace.
    Definition alignedallocator.hh:13
    \n-
    static constexpr T binomial(const T &n, const T &k) noexcept
    calculate the binomial coefficient n over k as a constexpr
    Definition math.hh:131
    \n-
    constexpr Base power(Base m, Exponent p)
    Power method for integer exponents.
    Definition math.hh:75
    \n-
    static constexpr T factorial(const T &n) noexcept
    calculate the factorial of n as a constexpr
    Definition math.hh:111
    \n-
    int sign(const T &val)
    Return the sign of the value.
    Definition math.hh:180
    \n-
    K conjugateComplex(const K &x)
    compute conjugate complex of x
    Definition math.hh:164
    \n-
    bool isNaN(const FieldVector< K, SIZE > &b, PriorityTag< 2 >, ADLTag)
    Returns whether any entry is NaN.
    Definition fvector.hh:627
    \n-
    bool isInf(const FieldVector< K, SIZE > &b, PriorityTag< 2 >, ADLTag)
    Returns whether any entry is infinite.
    Definition fvector.hh:615
    \n-
    auto isFinite(const FieldVector< K, SIZE > &b, PriorityTag< 2 >, ADLTag)
    Returns whether all entries are finite.
    Definition fvector.hh:604
    \n-
    bool isUnordered(const FieldVector< K, 1 > &b, const FieldVector< K, 1 > &c, PriorityTag< 2 >, ADLTag)
    Returns true if either b or c is NaN.
    Definition fvector.hh:639
    \n-
    Standard implementation of MathematicalConstants.
    Definition math.hh:34
    \n-
    static const T e()
    Euler's number.
    Definition math.hh:38
    \n-
    static const T pi()
    Archimedes' constant.
    Definition math.hh:48
    \n-
    Provides commonly used mathematical constants.
    Definition math.hh:67
    \n-
    Definition math.hh:94
    \n-
    static constexpr int factorial
    factorial stores m!
    Definition math.hh:96
    \n-
    Tag to make sure the functions in this namespace can be found by ADL.
    Definition math.hh:230
    \n-
    Definition math.hh:283
    \n-
    constexpr auto operator()(const T &t1, const T &t2) const
    Definition math.hh:285
    \n-
    Helper class for tagging priorities.
    Definition typeutilities.hh:73
    \n+
    An index present on the local process.
    Definition localindex.hh:35
    \n+
    LocalIndex()
    Constructor. known to other processes.
    Definition localindex.hh:41
    \n+
    LocalIndex(std::size_t index)
    Constructor.
    Definition localindex.hh:49
    \n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,385 +1,121 @@\n dune-common\u00a02.10\n Loading...\n Searching...\n No Matches\n * _\bd_\bu_\bn_\be\n * _\bc_\bo_\bm_\bm_\bo_\bn\n-math.hh\n+ * _\bp_\ba_\br_\ba_\bl_\bl_\be_\bl\n+localindex.hh\n _\bG_\bo_\b _\bt_\bo_\b _\bt_\bh_\be_\b _\bd_\bo_\bc_\bu_\bm_\be_\bn_\bt_\ba_\bt_\bi_\bo_\bn_\b _\bo_\bf_\b _\bt_\bh_\bi_\bs_\b _\bf_\bi_\bl_\be_\b.\n 1// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-\n 2// vi: set et ts=4 sw=2 sts=2:\n 3// SPDX-FileCopyrightInfo: Copyright \u00c2\u00a9 DUNE Project contributors, see file\n LICENSE.md in module root\n 4// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception\n-5#ifndef DUNE_MATH_HH\n-6#define DUNE_MATH_HH\n-7\n-12#include \n-13#include \n-14#include \n-15#include \n-16\n-17#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bt_\by_\bp_\be_\bu_\bt_\bi_\bl_\bi_\bt_\bi_\be_\bs_\b._\bh_\bh>\n-18\n-19namespace _\bD_\bu_\bn_\be\n-20{\n-21\n-32 template< class T >\n-_\b3_\b3 struct _\bS_\bt_\ba_\bn_\bd_\ba_\br_\bd_\bM_\ba_\bt_\bh_\be_\bm_\ba_\bt_\bi_\bc_\ba_\bl_\bC_\bo_\bn_\bs_\bt_\ba_\bn_\bt_\bs\n-34 {\n-_\b3_\b8 static const T _\be ()\n-39 {\n-40 using std::exp;\n-41 static const T _\be = exp( T( 1 ) );\n-42 return _\be;\n-43 }\n+5\n+6#ifndef DUNE_COMMON_PARALLEL_LOCALINDEX_HH\n+7#define DUNE_COMMON_PARALLEL_LOCALINDEX_HH\n+8\n+9#include \n+10\n+11namespace _\bD_\bu_\bn_\be\n+12{\n+13\n+14\n+_\b2_\b8 enum _\bL_\bo_\bc_\ba_\bl_\bI_\bn_\bd_\be_\bx_\bS_\bt_\ba_\bt_\be {_\bV_\bA_\bL_\bI_\bD, _\bD_\bE_\bL_\bE_\bT_\bE_\bD};\n+29\n+30\n+_\b3_\b4 class _\bL_\bo_\bc_\ba_\bl_\bI_\bn_\bd_\be_\bx\n+35 {\n+36 public:\n+_\b4_\b1 _\bL_\bo_\bc_\ba_\bl_\bI_\bn_\bd_\be_\bx() :\n+42 localIndex_(0), state_(_\bV_\bA_\bL_\bI_\bD){}\n+43\n 44\n-_\b4_\b8 static const T _\bp_\bi ()\n-49 {\n-50 using std::acos;\n-51 static const T _\bp_\bi = acos( T( -1 ) );\n-52 return _\bp_\bi;\n-53 }\n-54 };\n-55\n+_\b4_\b9 _\bL_\bo_\bc_\ba_\bl_\bI_\bn_\bd_\be_\bx(std::size_t index) :\n+50 localIndex_(index), state_(_\bV_\bA_\bL_\bI_\bD){}\n+55 inline const std::size_t& _\bl_\bo_\bc_\ba_\bl() const;\n 56\n-64 template< class Field >\n-_\b6_\b5 struct _\bM_\ba_\bt_\bh_\be_\bm_\ba_\bt_\bi_\bc_\ba_\bl_\bC_\bo_\bn_\bs_\bt_\ba_\bn_\bt_\bs\n-66 : public _\bS_\bt_\ba_\bn_\bd_\ba_\br_\bd_\bM_\ba_\bt_\bh_\be_\bm_\ba_\bt_\bi_\bc_\ba_\bl_\bC_\bo_\bn_\bs_\bt_\ba_\bn_\bt_\bs\n-67 {};\n+60 inline operator std::size_t() const;\n+61\n+67 inline _\bL_\bo_\bc_\ba_\bl_\bI_\bn_\bd_\be_\bx& _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b=(std::size_t index);\n 68\n-69\n-74 template \n-_\b7_\b5 constexpr Base _\bp_\bo_\bw_\be_\br(Base m, Exponent p)\n-76 {\n-77 static_assert(std::numeric_limits::is_integer, \"Exponent must be\n-an integer type!\");\n-78\n-79 auto result = Base(1);\n-80 auto absp = (p<0) ? -p : p; // This is simply abs, but std::abs is not\n-constexpr\n-81 for (Exponent i = Exponent(0); i\n-_\b9_\b3 struct _\bF_\ba_\bc_\bt_\bo_\br_\bi_\ba_\bl\n-94 {\n-_\b9_\b6 static constexpr int _\bf_\ba_\bc_\bt_\bo_\br_\bi_\ba_\bl = m * _\bF_\ba_\bc_\bt_\bo_\br_\bi_\ba_\bl_\b:_\b:_\bf_\ba_\bc_\bt_\bo_\br_\bi_\ba_\bl;\n-97 };\n-98\n-100 template <>\n-_\b1_\b0_\b1 struct [[deprecated(\"Use function factorial instead! Will be removed after\n-Dune 2.9\")]] _\bF_\ba_\bc_\bt_\bo_\br_\bi_\ba_\bl<0>\n-102 {\n-103 // 0! = 1\n-_\b1_\b0_\b4 static constexpr int _\bf_\ba_\bc_\bt_\bo_\br_\bi_\ba_\bl = 1;\n-105 };\n-106\n-107\n-109 // T has to be an integral type\n-110 template\n-_\b1_\b1_\b1 constexpr inline static T _\bf_\ba_\bc_\bt_\bo_\br_\bi_\ba_\bl(const T& n) noexcept\n-112 {\n-113 static_assert(std::numeric_limits::is_integer, \"`factorial(n)` has to be\n-called with an integer type.\");\n-114 T fac = 1;\n-115 for(T k = 0; k < n; ++k)\n-116 fac *= k+1;\n-117 return fac;\n-118 }\n-119\n-121 template\n-_\b1_\b2_\b2 constexpr inline static auto _\bf_\ba_\bc_\bt_\bo_\br_\bi_\ba_\bl (std::integral_constant)\n-noexcept\n-123 {\n-124 return std::integral_constant{};\n-125 }\n-126\n-127\n-129 // T has to be an integral type\n-130 template\n-_\b1_\b3_\b1 constexpr inline static T _\bb_\bi_\bn_\bo_\bm_\bi_\ba_\bl (const T& n, const T& k) noexcept\n-132 {\n-133 static_assert(std::numeric_limits::is_integer, \"`binomial(n, k)` has to\n-be called with an integer type.\");\n-134\n-135 if( k < 0 || k > n )\n-136 return 0;\n-137\n-138 if (2*k > n)\n-139 return _\bb_\bi_\bn_\bo_\bm_\bi_\ba_\bl(n, n-k);\n-140\n-141 T bin = 1;\n-142 for(auto i = n-k; i < n; ++i)\n-143 bin *= i+1;\n-144 return bin / _\bf_\ba_\bc_\bt_\bo_\br_\bi_\ba_\bl(k);\n-145 }\n-146\n-148 template\n-_\b1_\b4_\b9 constexpr inline static auto _\bb_\bi_\bn_\bo_\bm_\bi_\ba_\bl (std::integral_constant, std::\n-integral_constant) noexcept\n-150 {\n-151 return std::integral_constant{};\n-152 }\n-153\n-154 template\n-_\b1_\b5_\b5 constexpr inline static auto _\bb_\bi_\bn_\bo_\bm_\bi_\ba_\bl (std::integral_constant, std::\n-integral_constant) noexcept\n-156 {\n-157 return std::integral_constant= 0 ? 1 : 0)>{};\n-158 }\n-159\n-160\n-162 // conjugate complex does nothing for non-complex types\n-163 template\n-_\b1_\b6_\b4 inline K _\bc_\bo_\bn_\bj_\bu_\bg_\ba_\bt_\be_\bC_\bo_\bm_\bp_\bl_\be_\bx (const K& x)\n-165 {\n-166 return x;\n-167 }\n-168\n-169#ifndef DOXYGEN\n-170 // specialization for complex\n-171 template\n-172 inline std::complex _\bc_\bo_\bn_\bj_\bu_\bg_\ba_\bt_\be_\bC_\bo_\bm_\bp_\bl_\be_\bx (const std::complex& c)\n-173 {\n-174 return std::complex(c.real(),-c.imag());\n-175 }\n-176#endif\n-177\n-179 template \n-_\b1_\b8_\b0 int _\bs_\bi_\bg_\bn(const T& val)\n-181 {\n-182 return (val < 0 ? -1 : 1);\n-183 }\n-184\n-185\n-186 namespace Impl {\n-187 // Returns whether a given type behaves like std::complex<>, i.e. whether\n-188 // real() and imag() are defined\n-189 template\n-190 struct isComplexLike {\n-191 private:\n-192 template\n-193 static auto test(U* u) -> decltype(u->real(), u->imag(), std::true_type());\n-194\n-195 template\n-196 static auto test(...) -> decltype(std::false_type());\n-197\n-198 public:\n-199 static const bool value = decltype(test(0))::value;\n-200 };\n-201 } // namespace Impl\n-202\n-204\n-227 namespace MathOverloads {\n-228\n-_\b2_\b3_\b0 struct _\bA_\bD_\bL_\bT_\ba_\bg {};\n-231\n-_\b2_\b3_\b2#define DUNE_COMMON_MATH_ISFUNCTION(function, stdfunction) \\\n-233 template \\\n-234 auto function(const T &t, PriorityTag<1>, ADLTag) \\\n-235 -> decltype(function(t)) { \\\n-236 return function(t); \\\n-237 } \\\n-238 template \\\n-239 auto function(const T &t, PriorityTag<0>, ADLTag) { \\\n-240 using std::stdfunction; \\\n-241 return stdfunction(t); \\\n-242 } \\\n-243 static_assert(true, \"Require semicolon to unconfuse editors\")\n-244\n-_\b2_\b4_\b5 _\bD_\bU_\bN_\bE_\b__\bC_\bO_\bM_\bM_\bO_\bN_\b__\bM_\bA_\bT_\bH_\b__\bI_\bS_\bF_\bU_\bN_\bC_\bT_\bI_\bO_\bN(_\bi_\bs_\bN_\ba_\bN,isnan);\n-_\b2_\b4_\b6 _\bD_\bU_\bN_\bE_\b__\bC_\bO_\bM_\bM_\bO_\bN_\b__\bM_\bA_\bT_\bH_\b__\bI_\bS_\bF_\bU_\bN_\bC_\bT_\bI_\bO_\bN(_\bi_\bs_\bI_\bn_\bf,isinf);\n-_\b2_\b4_\b7 _\bD_\bU_\bN_\bE_\b__\bC_\bO_\bM_\bM_\bO_\bN_\b__\bM_\bA_\bT_\bH_\b__\bI_\bS_\bF_\bU_\bN_\bC_\bT_\bI_\bO_\bN(_\bi_\bs_\bF_\bi_\bn_\bi_\bt_\be,isfinite);\n-248#undef DUNE_COMMON_MATH_ISFUNCTION\n-249\n-250 template\n-_\b2_\b5_\b1 auto _\bi_\bs_\bU_\bn_\bo_\br_\bd_\be_\br_\be_\bd(const T &t1, const T &t2, _\bP_\br_\bi_\bo_\br_\bi_\bt_\by_\bT_\ba_\bg_\b<_\b1_\b>, _\bA_\bD_\bL_\bT_\ba_\bg)\n-252 -> decltype(_\bi_\bs_\bU_\bn_\bo_\br_\bd_\be_\br_\be_\bd(t1, t2)) {\n-253 return _\bi_\bs_\bU_\bn_\bo_\br_\bd_\be_\br_\be_\bd(t1, t2);\n-254 }\n-255\n-256 template\n-_\b2_\b5_\b7 auto _\bi_\bs_\bU_\bn_\bo_\br_\bd_\be_\br_\be_\bd(const T &t1, const T &t2, _\bP_\br_\bi_\bo_\br_\bi_\bt_\by_\bT_\ba_\bg_\b<_\b0_\b>, _\bA_\bD_\bL_\bT_\ba_\bg) {\n-258 using std::isunordered;\n-259 return isunordered(t1, t2);\n-260 }\n-261 }\n-262\n-_\b2_\b6_\b3 namespace MathImpl {\n-264\n-265 // NOTE: it is important that these functors have names different from the\n-266 // names of the functions they are forwarding to. Otherwise the\n-267 // unqualified call would find the functor type, not a function, and ADL\n-268 // would never be attempted.\n-_\b2_\b6_\b9#define DUNE_COMMON_MATH_ISFUNCTION_FUNCTOR(function) \\\n-270 struct function##Impl { \\\n-271 template \\\n-272 constexpr auto operator()(const T &t) const { \\\n-273 return function(t, PriorityTag<10>{}, MathOverloads::ADLTag{}); \\\n-274 } \\\n-275 }; \\\n-276 static_assert(true, \"Require semicolon to unconfuse editors\")\n-277\n-_\b2_\b7_\b8 _\bD_\bU_\bN_\bE_\b__\bC_\bO_\bM_\bM_\bO_\bN_\b__\bM_\bA_\bT_\bH_\b__\bI_\bS_\bF_\bU_\bN_\bC_\bT_\bI_\bO_\bN_\b__\bF_\bU_\bN_\bC_\bT_\bO_\bR(isNaN);\n-_\b2_\b7_\b9 _\bD_\bU_\bN_\bE_\b__\bC_\bO_\bM_\bM_\bO_\bN_\b__\bM_\bA_\bT_\bH_\b__\bI_\bS_\bF_\bU_\bN_\bC_\bT_\bI_\bO_\bN_\b__\bF_\bU_\bN_\bC_\bT_\bO_\bR(isInf);\n-_\b2_\b8_\b0 _\bD_\bU_\bN_\bE_\b__\bC_\bO_\bM_\bM_\bO_\bN_\b__\bM_\bA_\bT_\bH_\b__\bI_\bS_\bF_\bU_\bN_\bC_\bT_\bI_\bO_\bN_\b__\bF_\bU_\bN_\bC_\bT_\bO_\bR(isFinite);\n-281#undef DUNE_COMMON_MATH_ISFUNCTION_FUNCTOR\n-282\n-_\b2_\b8_\b3 struct _\bi_\bs_\bU_\bn_\bo_\br_\bd_\be_\br_\be_\bd_\bI_\bm_\bp_\bl {\n-284 template\n-_\b2_\b8_\b5 constexpr auto _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b(_\b)(const T &t1, const T &t2) const {\n-286 return isUnordered(t1, t2, _\bP_\br_\bi_\bo_\br_\bi_\bt_\by_\bT_\ba_\bg_\b<_\b1_\b0_\b>{}, _\bM_\ba_\bt_\bh_\bO_\bv_\be_\br_\bl_\bo_\ba_\bd_\bs_\b:_\b:_\bA_\bD_\bL_\bT_\ba_\bg{});\n-287 }\n-288 };\n-289\n-290 } //MathImpl\n-291\n-292\n-293 namespace Impl {\n-294 /* This helper has a math functor as a static constexpr member. Doing\n-295 this as a static member of a template struct means we can do this\n-296 without violating the ODR or putting the definition into a separate\n-297 compilation unit, while still still ensuring the functor is the same\n-298 lvalue across all compilation units.\n-299 */\n-300 template\n-301 struct MathDummy\n-302 {\n-303 static constexpr T value{};\n-304 };\n-305\n-306 template\n-307 constexpr T MathDummy::value;\n-308\n-309 } //namespace Impl\n-310\n-311 namespace {\n-312 /* Provide the math functors directly in the `Dune` namespace.\n-313\n-314 This actually declares a different name in each translation unit, but\n-315 they all resolve to the same lvalue.\n-316 */\n-317\n-319\n-323 constexpr auto const &_\bi_\bs_\bN_\ba_\bN = Impl::MathDummy::value;\n-324\n-326\n-330 constexpr auto const &_\bi_\bs_\bI_\bn_\bf = Impl::MathDummy::value;\n-331\n-333\n-337 constexpr auto const &_\bi_\bs_\bF_\bi_\bn_\bi_\bt_\be = Impl::MathDummy::\n-value;\n-338\n-340\n-345 constexpr auto const &_\bi_\bs_\bU_\bn_\bo_\br_\bd_\be_\br_\be_\bd = Impl::MathDummy::value;\n-346 }\n-347\n-348 namespace MathOverloads {\n-349 /*Overloads for complex types*/\n-350 template::value> >\n-_\b3_\b5_\b1 auto _\bi_\bs_\bN_\ba_\bN(const T &t, _\bP_\br_\bi_\bo_\br_\bi_\bt_\by_\bT_\ba_\bg_\b<_\b2_\b>, _\bA_\bD_\bL_\bT_\ba_\bg) {\n-352 return Dune::isNaN(real(t)) || Dune::isNaN(imag(t));\n-353 }\n-354\n-355 template::value> >\n-_\b3_\b5_\b6 auto _\bi_\bs_\bI_\bn_\bf(const T &t, _\bP_\br_\bi_\bo_\br_\bi_\bt_\by_\bT_\ba_\bg_\b<_\b2_\b>, _\bA_\bD_\bL_\bT_\ba_\bg) {\n-357 return Dune::isInf(real(t)) || Dune::isInf(imag(t));\n-358 }\n-359\n-360 template::value> >\n-_\b3_\b6_\b1 auto _\bi_\bs_\bF_\bi_\bn_\bi_\bt_\be(const T &t, _\bP_\br_\bi_\bo_\br_\bi_\bt_\by_\bT_\ba_\bg_\b<_\b2_\b>, _\bA_\bD_\bL_\bT_\ba_\bg) {\n-362 return Dune::isFinite(real(t)) && Dune::isFinite(imag(t));\n-363 }\n-364 } //MathOverloads\n-365}\n-366\n-367#endif // #ifndef DUNE_MATH_HH\n-_\bD_\bU_\bN_\bE_\b__\bC_\bO_\bM_\bM_\bO_\bN_\b__\bM_\bA_\bT_\bH_\b__\bI_\bS_\bF_\bU_\bN_\bC_\bT_\bI_\bO_\bN_\b__\bF_\bU_\bN_\bC_\bT_\bO_\bR\n-#define DUNE_COMMON_MATH_ISFUNCTION_FUNCTOR(function)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn math.hh:269\n-_\bD_\bU_\bN_\bE_\b__\bC_\bO_\bM_\bM_\bO_\bN_\b__\bM_\bA_\bT_\bH_\b__\bI_\bS_\bF_\bU_\bN_\bC_\bT_\bI_\bO_\bN\n-#define DUNE_COMMON_MATH_ISFUNCTION(function, stdfunction)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn math.hh:232\n-_\bt_\by_\bp_\be_\bu_\bt_\bi_\bl_\bi_\bt_\bi_\be_\bs_\b._\bh_\bh\n-Utilities for type computations, constraining overloads, ...\n+73 inline _\bL_\bo_\bc_\ba_\bl_\bI_\bn_\bd_\be_\bx_\bS_\bt_\ba_\bt_\be _\bs_\bt_\ba_\bt_\be() const;\n+74\n+79 inline void _\bs_\be_\bt_\bS_\bt_\ba_\bt_\be(_\bL_\bo_\bc_\ba_\bl_\bI_\bn_\bd_\be_\bx_\bS_\bt_\ba_\bt_\be _\bs_\bt_\ba_\bt_\be);\n+80\n+81 private:\n+83 std::size_t localIndex_;\n+84\n+91 char state_;\n+92\n+93 };\n+94\n+95\n+96\n+_\b9_\b7 inline const std::size_t& _\bL_\bo_\bc_\ba_\bl_\bI_\bn_\bd_\be_\bx_\b:_\b:_\bl_\bo_\bc_\ba_\bl() const {\n+98 return localIndex_;\n+99 }\n+100\n+_\b1_\b0_\b1 inline LocalIndex::operator std::size_t() const {\n+102 return localIndex_;\n+103 }\n+104\n+_\b1_\b0_\b5 inline _\bL_\bo_\bc_\ba_\bl_\bI_\bn_\bd_\be_\bx& _\bL_\bo_\bc_\ba_\bl_\bI_\bn_\bd_\be_\bx_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b=(std::size_t index){\n+106 localIndex_ = index;\n+107 return *this;\n+108 }\n+109\n+_\b1_\b1_\b0 inline _\bL_\bo_\bc_\ba_\bl_\bI_\bn_\bd_\be_\bx_\bS_\bt_\ba_\bt_\be _\bL_\bo_\bc_\ba_\bl_\bI_\bn_\bd_\be_\bx_\b:_\b:_\bs_\bt_\ba_\bt_\be() const {\n+111 return static_cast<_\bL_\bo_\bc_\ba_\bl_\bI_\bn_\bd_\be_\bx_\bS_\bt_\ba_\bt_\be>(state_);\n+112 }\n+113\n+_\b1_\b1_\b4 inline void _\bL_\bo_\bc_\ba_\bl_\bI_\bn_\bd_\be_\bx_\b:_\b:_\bs_\be_\bt_\bS_\bt_\ba_\bt_\be(_\bL_\bo_\bc_\ba_\bl_\bI_\bn_\bd_\be_\bx_\bS_\bt_\ba_\bt_\be state){\n+115 state_ = static_cast(_\bs_\bt_\ba_\bt_\be);\n+116 }\n+117\n+120} // namespace Dune\n+121\n+122#endif // DUNE_COMMON_PARALLEL_LOCALINDEX_HH\n+_\bD_\bu_\bn_\be_\b:_\b:_\bL_\bo_\bc_\ba_\bl_\bI_\bn_\bd_\be_\bx_\bS_\bt_\ba_\bt_\be\n+LocalIndexState\n+The states available for the local indices.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn localindex.hh:28\n+_\bD_\bu_\bn_\be_\b:_\b:_\bL_\bo_\bc_\ba_\bl_\bI_\bn_\bd_\be_\bx_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b=\n+LocalIndex & operator=(std::size_t index)\n+Assign a new local index.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn localindex.hh:105\n+_\bD_\bu_\bn_\be_\b:_\b:_\bL_\bo_\bc_\ba_\bl_\bI_\bn_\bd_\be_\bx_\b:_\b:_\bs_\bt_\ba_\bt_\be\n+LocalIndexState state() const\n+Get the state.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn localindex.hh:110\n+_\bD_\bu_\bn_\be_\b:_\b:_\bL_\bo_\bc_\ba_\bl_\bI_\bn_\bd_\be_\bx_\b:_\b:_\bl_\bo_\bc_\ba_\bl\n+const std::size_t & local() const\n+get the local index.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn localindex.hh:97\n+_\bD_\bu_\bn_\be_\b:_\b:_\bL_\bo_\bc_\ba_\bl_\bI_\bn_\bd_\be_\bx_\b:_\b:_\bs_\be_\bt_\bS_\bt_\ba_\bt_\be\n+void setState(LocalIndexState state)\n+Set the state.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn localindex.hh:114\n+_\bD_\bu_\bn_\be_\b:_\b:_\bV_\bA_\bL_\bI_\bD\n+@ VALID\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn localindex.hh:28\n+_\bD_\bu_\bn_\be_\b:_\b:_\bD_\bE_\bL_\bE_\bT_\bE_\bD\n+@ DELETED\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn localindex.hh:28\n _\bD_\bu_\bn_\be\n Dune namespace.\n D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn alignedallocator.hh:13\n-_\bD_\bu_\bn_\be_\b:_\b:_\bb_\bi_\bn_\bo_\bm_\bi_\ba_\bl\n-static constexpr T binomial(const T &n, const T &k) noexcept\n-calculate the binomial coefficient n over k as a constexpr\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn math.hh:131\n-_\bD_\bu_\bn_\be_\b:_\b:_\bp_\bo_\bw_\be_\br\n-constexpr Base power(Base m, Exponent p)\n-Power method for integer exponents.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn math.hh:75\n-_\bD_\bu_\bn_\be_\b:_\b:_\bf_\ba_\bc_\bt_\bo_\br_\bi_\ba_\bl\n-static constexpr T factorial(const T &n) noexcept\n-calculate the factorial of n as a constexpr\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn math.hh:111\n-_\bD_\bu_\bn_\be_\b:_\b:_\bs_\bi_\bg_\bn\n-int sign(const T &val)\n-Return the sign of the value.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn math.hh:180\n-_\bD_\bu_\bn_\be_\b:_\b:_\bc_\bo_\bn_\bj_\bu_\bg_\ba_\bt_\be_\bC_\bo_\bm_\bp_\bl_\be_\bx\n-K conjugateComplex(const K &x)\n-compute conjugate complex of x\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn math.hh:164\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\bh_\bO_\bv_\be_\br_\bl_\bo_\ba_\bd_\bs_\b:_\b:_\bi_\bs_\bN_\ba_\bN\n-bool isNaN(const FieldVector< K, SIZE > &b, PriorityTag< 2 >, ADLTag)\n-Returns whether any entry is NaN.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn fvector.hh:627\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\bh_\bO_\bv_\be_\br_\bl_\bo_\ba_\bd_\bs_\b:_\b:_\bi_\bs_\bI_\bn_\bf\n-bool isInf(const FieldVector< K, SIZE > &b, PriorityTag< 2 >, ADLTag)\n-Returns whether any entry is infinite.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn fvector.hh:615\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\bh_\bO_\bv_\be_\br_\bl_\bo_\ba_\bd_\bs_\b:_\b:_\bi_\bs_\bF_\bi_\bn_\bi_\bt_\be\n-auto isFinite(const FieldVector< K, SIZE > &b, PriorityTag< 2 >, ADLTag)\n-Returns whether all entries are finite.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn fvector.hh:604\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\bh_\bO_\bv_\be_\br_\bl_\bo_\ba_\bd_\bs_\b:_\b:_\bi_\bs_\bU_\bn_\bo_\br_\bd_\be_\br_\be_\bd\n-bool isUnordered(const FieldVector< K, 1 > &b, const FieldVector< K, 1 > &c,\n-PriorityTag< 2 >, ADLTag)\n-Returns true if either b or c is NaN.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn fvector.hh:639\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bt_\ba_\bn_\bd_\ba_\br_\bd_\bM_\ba_\bt_\bh_\be_\bm_\ba_\bt_\bi_\bc_\ba_\bl_\bC_\bo_\bn_\bs_\bt_\ba_\bn_\bt_\bs\n-Standard implementation of MathematicalConstants.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn math.hh:34\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bt_\ba_\bn_\bd_\ba_\br_\bd_\bM_\ba_\bt_\bh_\be_\bm_\ba_\bt_\bi_\bc_\ba_\bl_\bC_\bo_\bn_\bs_\bt_\ba_\bn_\bt_\bs_\b:_\b:_\be\n-static const T e()\n-Euler's number.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn math.hh:38\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bt_\ba_\bn_\bd_\ba_\br_\bd_\bM_\ba_\bt_\bh_\be_\bm_\ba_\bt_\bi_\bc_\ba_\bl_\bC_\bo_\bn_\bs_\bt_\ba_\bn_\bt_\bs_\b:_\b:_\bp_\bi\n-static const T pi()\n-Archimedes' constant.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn math.hh:48\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\bh_\be_\bm_\ba_\bt_\bi_\bc_\ba_\bl_\bC_\bo_\bn_\bs_\bt_\ba_\bn_\bt_\bs\n-Provides commonly used mathematical constants.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn math.hh:67\n-_\bD_\bu_\bn_\be_\b:_\b:_\bF_\ba_\bc_\bt_\bo_\br_\bi_\ba_\bl\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn math.hh:94\n-_\bD_\bu_\bn_\be_\b:_\b:_\bF_\ba_\bc_\bt_\bo_\br_\bi_\ba_\bl_\b:_\b:_\bf_\ba_\bc_\bt_\bo_\br_\bi_\ba_\bl\n-static constexpr int factorial\n-factorial stores m!\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn math.hh:96\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\bh_\bO_\bv_\be_\br_\bl_\bo_\ba_\bd_\bs_\b:_\b:_\bA_\bD_\bL_\bT_\ba_\bg\n-Tag to make sure the functions in this namespace can be found by ADL.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn math.hh:230\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\bh_\bI_\bm_\bp_\bl_\b:_\b:_\bi_\bs_\bU_\bn_\bo_\br_\bd_\be_\br_\be_\bd_\bI_\bm_\bp_\bl\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn math.hh:283\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\bh_\bI_\bm_\bp_\bl_\b:_\b:_\bi_\bs_\bU_\bn_\bo_\br_\bd_\be_\br_\be_\bd_\bI_\bm_\bp_\bl_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b(_\b)\n-constexpr auto operator()(const T &t1, const T &t2) const\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn math.hh:285\n-_\bD_\bu_\bn_\be_\b:_\b:_\bP_\br_\bi_\bo_\br_\bi_\bt_\by_\bT_\ba_\bg\n-Helper class for tagging priorities.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn typeutilities.hh:73\n+_\bD_\bu_\bn_\be_\b:_\b:_\bL_\bo_\bc_\ba_\bl_\bI_\bn_\bd_\be_\bx\n+An index present on the local process.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn localindex.hh:35\n+_\bD_\bu_\bn_\be_\b:_\b:_\bL_\bo_\bc_\ba_\bl_\bI_\bn_\bd_\be_\bx_\b:_\b:_\bL_\bo_\bc_\ba_\bl_\bI_\bn_\bd_\be_\bx\n+LocalIndex()\n+Constructor. known to other processes.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn localindex.hh:41\n+_\bD_\bu_\bn_\be_\b:_\b:_\bL_\bo_\bc_\ba_\bl_\bI_\bn_\bd_\be_\bx_\b:_\b:_\bL_\bo_\bc_\ba_\bl_\bI_\bn_\bd_\be_\bx\n+LocalIndex(std::size_t index)\n+Constructor.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn localindex.hh:49\n ===============================================================================\n Generated by\u00a0_\b[_\bd_\bo_\bx_\by_\bg_\be_\bn_\b] 1.9.8\n"}]}, {"source1": "./usr/share/doc/libdune-common-doc/doxygen/a00092.html", "source2": "./usr/share/doc/libdune-common-doc/doxygen/a00092.html", "unified_diff": "@@ -1,15 +1,15 @@\n \n \n \n \n \n \n \n-dune-common: ios_state.hh File Reference\n+dune-common: mpitraits.hh File Reference\n \n \n \n \n \n \n \n@@ -65,45 +65,50 @@\n
    \n
    \n \n \n \n \n \n
    \n \n-
    ios_state.hh File Reference
    \n+
    mpitraits.hh File Reference
    \n
    \n
    \n \n-

    Utility class for storing and resetting stream attributes. \n+

    Traits classes for mapping types onto MPI_Datatype. \n More...

    \n-
    #include <ios>
    \n+
    #include <complex>
    \n+#include <cstddef>
    \n+#include <cstdint>
    \n+#include <type_traits>
    \n+#include <utility>
    \n+#include <mpi.h>
    \n
    \n

    Go to the source code of this file.

    \n \n \n-\n-\n+\n+\n \n

    \n Classes

    class  Dune::ios_base_all_saver
     Utility class for storing and resetting stream attributes. More...
    struct  Dune::MPITraits< T >
     A traits class describing the mapping of types onto MPI_Datatypes. More...
     
    \n \n \n \n \n

    \n Namespaces

    namespace  Dune
     Dune namespace.
     
    \n

    Detailed Description

    \n-

    Utility class for storing and resetting stream attributes.

    \n+

    Traits classes for mapping types onto MPI_Datatype.

    \n
    Author
    Markus Blatt
    \n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,26 +1,33 @@\n dune-common\u00a02.10\n Loading...\n Searching...\n No Matches\n * _\bd_\bu_\bn_\be\n * _\bc_\bo_\bm_\bm_\bo_\bn\n+ * _\bp_\ba_\br_\ba_\bl_\bl_\be_\bl\n _\bC_\bl_\ba_\bs_\bs_\be_\bs | _\bN_\ba_\bm_\be_\bs_\bp_\ba_\bc_\be_\bs\n-ios_state.hh File Reference\n-_\bC_\bo_\bm_\bm_\bo_\bn\n-Utility class for storing and resetting stream attributes. _\bM_\bo_\br_\be_\b._\b._\b.\n-#include \n+mpitraits.hh File Reference\n+_\bC_\bo_\bm_\bm_\bo_\bn \u00bb _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\b _\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn\n+Traits classes for mapping types onto MPI_Datatype. _\bM_\bo_\br_\be_\b._\b._\b.\n+#include \n+#include \n+#include \n+#include \n+#include \n+#include \n _\bG_\bo_\b _\bt_\bo_\b _\bt_\bh_\be_\b _\bs_\bo_\bu_\br_\bc_\be_\b _\bc_\bo_\bd_\be_\b _\bo_\bf_\b _\bt_\bh_\bi_\bs_\b _\bf_\bi_\bl_\be_\b.\n C\bCl\bla\bas\bss\bse\bes\bs\n-class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bi_\bo_\bs_\b__\bb_\ba_\bs_\be_\b__\ba_\bl_\bl_\b__\bs_\ba_\bv_\be_\br\n-\u00a0 Utility class for storing and resetting stream attributes. _\bM_\bo_\br_\be_\b._\b._\b.\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bM_\bP_\bI_\bT_\br_\ba_\bi_\bt_\bs_\b<_\b _\bT_\b _\b>\n+\u00a0 A traits class describing the mapping of types onto MPI_Datatypes.\n+ _\bM_\bo_\br_\be_\b._\b._\b.\n \u00a0\n N\bNa\bam\bme\bes\bsp\bpa\bac\bce\bes\bs\n namespace \u00a0 _\bD_\bu_\bn_\be\n \u00a0 _\bD_\bu_\bn_\be namespace.\n \u00a0\n *\b**\b**\b**\b**\b* D\bDe\bet\bta\bai\bil\ble\bed\bd D\bDe\bes\bsc\bcr\bri\bip\bpt\bti\bio\bon\bn *\b**\b**\b**\b**\b*\n-Utility class for storing and resetting stream attributes.\n+Traits classes for mapping types onto MPI_Datatype.\n Author\n Markus Blatt\n ===============================================================================\n Generated by\u00a0_\b[_\bd_\bo_\bx_\by_\bg_\be_\bn_\b] 1.9.8\n"}]}, {"source1": "./usr/share/doc/libdune-common-doc/doxygen/a00092_source.html", "source2": "./usr/share/doc/libdune-common-doc/doxygen/a00092_source.html", "unified_diff": "@@ -1,15 +1,15 @@\n \n \n \n \n \n \n \n-dune-common: ios_state.hh Source File\n+dune-common: mpitraits.hh Source File\n \n \n \n \n \n \n \n@@ -70,59 +70,218 @@\n
    \n
    \n \n \n \n \n \n
    \n-
    ios_state.hh
    \n+
    mpitraits.hh
    \n
    \n
    \n Go to the documentation of this file.
    1// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
    \n
    2// vi: set et ts=4 sw=2 sts=2:
    \n
    3// SPDX-FileCopyrightInfo: Copyright \u00a9 DUNE Project contributors, see file LICENSE.md in module root
    \n
    4// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception
    \n-
    5#ifndef DUNE_COMMON_IOS_STATE_HH
    \n-
    6#define DUNE_COMMON_IOS_STATE_HH
    \n+
    5#ifndef DUNE_COMMON_PARALLEL_MPITRAITS_HH
    \n+
    6#define DUNE_COMMON_PARALLEL_MPITRAITS_HH
    \n
    7
    \n-
    8#include <ios>
    \n-
    9
    \n-
    10namespace Dune {
    \n-
    \n-\n-
    34 {
    \n-
    35 public:
    \n-
    37 typedef std::ios_base state_type;
    \n-
    38
    \n-\n-
    49
    \n-\n-
    54
    \n-
    61 void restore();
    \n+
    18#if HAVE_MPI
    \n+
    19
    \n+
    20#include <complex>
    \n+
    21#include <cstddef>
    \n+
    22#include <cstdint>
    \n+
    23#include <type_traits>
    \n+
    24#include <utility>
    \n+
    25
    \n+
    26#include <mpi.h>
    \n+
    27
    \n+
    28namespace Dune
    \n+
    29{
    \n+
    39 template<typename T>
    \n+
    \n+
    40 struct MPITraits
    \n+
    41 {
    \n+
    42 private:
    \n+
    43 MPITraits(){}
    \n+
    44 MPITraits(const MPITraits&){}
    \n+
    45 static MPI_Datatype datatype;
    \n+
    46 static MPI_Datatype vectortype;
    \n+
    47 public:
    \n+
    \n+
    48 static inline MPI_Datatype getType()
    \n+
    49 {
    \n+
    50 if(datatype==MPI_DATATYPE_NULL) {
    \n+
    51 MPI_Type_contiguous(sizeof(T),MPI_BYTE,&datatype);
    \n+
    52 MPI_Type_commit(&datatype);
    \n+
    53 }
    \n+
    54 return datatype;
    \n+
    55 }
    \n+
    \n+
    56 static constexpr bool is_intrinsic = false;
    \n+
    57 };
    \n+
    \n+
    58 template<class T>
    \n+
    59 MPI_Datatype MPITraits<T>::datatype = MPI_DATATYPE_NULL;
    \n+
    60
    \n+
    61#ifndef DOXYGEN
    \n
    62
    \n-
    63 private:
    \n-
    65 state_type& ios;
    \n-
    67 state_type::fmtflags oldflags;
    \n-
    69 std::streamsize oldprec;
    \n-
    71 std::streamsize oldwidth;
    \n-
    72 };
    \n-
    \n-
    73
    \n-
    75}
    \n-
    76
    \n-
    77#endif // DUNE_COMMON_IOS_STATE_HH
    \n-
    ~ios_base_all_saver()
    Destructor that restores the flags stored by the constructor.
    Definition ios_state.cc:20
    \n-
    void restore()
    Restore flags now.
    Definition ios_state.cc:25
    \n-
    std::ios_base state_type
    Export type of object we save the state for.
    Definition ios_state.hh:37
    \n+
    63 // A Macro for defining traits for the primitive data types
    \n+
    64#define ComposeMPITraits(p,m) \\
    \n+
    65 template<> \\
    \n+
    66 struct MPITraits<p>{ \\
    \n+
    67 static inline MPI_Datatype getType(){ \\
    \n+
    68 return m; \\
    \n+
    69 } \\
    \n+
    70 static constexpr bool is_intrinsic = true; \\
    \n+
    71 }
    \n+
    72
    \n+
    73 ComposeMPITraits(char, MPI_CHAR);
    \n+
    74 ComposeMPITraits(unsigned char,MPI_UNSIGNED_CHAR);
    \n+
    75 ComposeMPITraits(short,MPI_SHORT);
    \n+
    76 ComposeMPITraits(unsigned short,MPI_UNSIGNED_SHORT);
    \n+
    77 ComposeMPITraits(int,MPI_INT);
    \n+
    78 ComposeMPITraits(unsigned int,MPI_UNSIGNED);
    \n+
    79 ComposeMPITraits(long,MPI_LONG);
    \n+
    80 ComposeMPITraits(unsigned long,MPI_UNSIGNED_LONG);
    \n+
    81 ComposeMPITraits(float,MPI_FLOAT);
    \n+
    82 ComposeMPITraits(double,MPI_DOUBLE);
    \n+
    83 ComposeMPITraits(long double,MPI_LONG_DOUBLE);
    \n+
    84 ComposeMPITraits(std::complex<double>, MPI_CXX_DOUBLE_COMPLEX);
    \n+
    85 ComposeMPITraits(std::complex<long double>, MPI_CXX_LONG_DOUBLE_COMPLEX);
    \n+
    86 ComposeMPITraits(std::complex<float>, MPI_CXX_FLOAT_COMPLEX);
    \n+
    87
    \n+
    88
    \n+
    89#undef ComposeMPITraits
    \n+
    90
    \n+
    91 template<class K, int n> class FieldVector;
    \n+
    92
    \n+
    93 template<class K, int n>
    \n+
    94 struct MPITraits<FieldVector<K,n> >
    \n+
    95 {
    \n+
    96 static MPI_Datatype datatype;
    \n+
    97 static MPI_Datatype vectortype;
    \n+
    98
    \n+
    99 static inline MPI_Datatype getType()
    \n+
    100 {
    \n+
    101 if(datatype==MPI_DATATYPE_NULL) {
    \n+
    102 MPI_Type_contiguous(n, MPITraits<K>::getType(), &vectortype);
    \n+
    103 MPI_Type_commit(&vectortype);
    \n+
    104 FieldVector<K,n> fvector;
    \n+
    105 MPI_Aint base;
    \n+
    106 MPI_Aint displ;
    \n+
    107 MPI_Get_address(&fvector, &base);
    \n+
    108 MPI_Get_address(&(fvector[0]), &displ);
    \n+
    109 displ -= base;
    \n+
    110 int length[1]={1};
    \n+
    111
    \n+
    112 MPI_Type_create_struct(1, length, &displ, &vectortype, &datatype);
    \n+
    113 MPI_Type_commit(&datatype);
    \n+
    114 }
    \n+
    115 return datatype;
    \n+
    116 }
    \n+
    117
    \n+
    118 };
    \n+
    119
    \n+
    120 template<class K, int n>
    \n+
    121 MPI_Datatype MPITraits<FieldVector<K,n> >::datatype = MPI_DATATYPE_NULL;
    \n+
    122 template<class K, int n>
    \n+
    123 MPI_Datatype MPITraits<FieldVector<K,n> >::vectortype = {MPI_DATATYPE_NULL};
    \n+
    124
    \n+
    125
    \n+
    126 template<int k>
    \n+
    127 class bigunsignedint;
    \n+
    128
    \n+
    129 template<int k>
    \n+
    130 struct MPITraits<bigunsignedint<k> >
    \n+
    131 {
    \n+
    132 static MPI_Datatype datatype;
    \n+
    133 static MPI_Datatype vectortype;
    \n+
    134
    \n+
    135 static inline MPI_Datatype getType()
    \n+
    136 {
    \n+
    137 if(datatype==MPI_DATATYPE_NULL) {
    \n+\n+
    139 &vectortype);
    \n+
    140 //MPI_Type_commit(&vectortype);
    \n+
    141 bigunsignedint<k> data;
    \n+
    142 MPI_Aint base;
    \n+
    143 MPI_Aint displ;
    \n+
    144 MPI_Get_address(&data, &base);
    \n+
    145 MPI_Get_address(&(data.digit), &displ);
    \n+
    146 displ -= base;
    \n+
    147 int length[1]={1};
    \n+
    148 MPI_Type_create_struct(1, length, &displ, &vectortype, &datatype);
    \n+
    149 MPI_Type_commit(&datatype);
    \n+
    150 }
    \n+
    151 return datatype;
    \n+
    152 }
    \n+
    153 };
    \n+
    154}
    \n+
    155
    \n+
    156namespace Dune
    \n+
    157{
    \n+
    158 template<int k>
    \n+
    159 MPI_Datatype MPITraits<bigunsignedint<k> >::datatype = MPI_DATATYPE_NULL;
    \n+
    160 template<int k>
    \n+
    161 MPI_Datatype MPITraits<bigunsignedint<k> >::vectortype = MPI_DATATYPE_NULL;
    \n+
    162
    \n+
    163 template<typename T1, typename T2>
    \n+
    164 struct MPITraits<std::pair<T1,T2 > >
    \n+
    165 {
    \n+
    166 public:
    \n+
    167 inline static MPI_Datatype getType();
    \n+
    168 private:
    \n+
    169 static MPI_Datatype type;
    \n+
    170 };
    \n+
    171 template<typename T1, typename T2>
    \n+
    172 MPI_Datatype MPITraits<std::pair<T1,T2> >::getType()
    \n+
    173 {
    \n+
    174 if(type==MPI_DATATYPE_NULL) {
    \n+
    175 int length[2] = {1, 1};
    \n+
    176 MPI_Aint disp[2];
    \n+
    177 MPI_Datatype types[2] = {MPITraits<T1>::getType(),
    \n+\n+
    179
    \n+
    180 using Pair = std::pair<T1, T2>;
    \n+
    181 static_assert(std::is_standard_layout<Pair>::value, "offsetof() is only defined for standard layout types");
    \n+
    182 disp[0] = offsetof(Pair, first);
    \n+
    183 disp[1] = offsetof(Pair, second);
    \n+
    184
    \n+
    185 MPI_Datatype tmp;
    \n+
    186 MPI_Type_create_struct(2, length, disp, types, &tmp);
    \n+
    187
    \n+
    188 MPI_Type_create_resized(tmp, 0, sizeof(Pair), &type);
    \n+
    189 MPI_Type_commit(&type);
    \n+
    190
    \n+
    191 MPI_Type_free(&tmp);
    \n+
    192 }
    \n+
    193 return type;
    \n+
    194 }
    \n+
    195
    \n+
    196 template<typename T1, typename T2>
    \n+
    197 MPI_Datatype MPITraits<std::pair<T1,T2> >::type=MPI_DATATYPE_NULL;
    \n+
    198
    \n+
    199#endif // !DOXYGEN
    \n+
    200
    \n+
    201} // namespace Dune
    \n+
    202
    \n+
    203#endif // HAVE_MPI
    \n+
    204
    \n+
    207#endif // DUNE_COMMON_PARALLEL_MPITRAITS_HH
    \n+
    STL namespace.
    \n
    Dune namespace.
    Definition alignedallocator.hh:13
    \n-
    Utility class for storing and resetting stream attributes.
    Definition ios_state.hh:34
    \n+
    A traits class describing the mapping of types onto MPI_Datatypes.
    Definition mpitraits.hh:41
    \n+
    static MPI_Datatype getType()
    Definition mpitraits.hh:48
    \n+
    static constexpr bool is_intrinsic
    Definition mpitraits.hh:56
    \n+
    static constexpr int n
    Definition bigunsignedint.hh:78
    \n+
    vector space out of a tensor product of fields.
    Definition fvector.hh:91
    \n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,60 +1,221 @@\n dune-common\u00a02.10\n Loading...\n Searching...\n No Matches\n * _\bd_\bu_\bn_\be\n * _\bc_\bo_\bm_\bm_\bo_\bn\n-ios_state.hh\n+ * _\bp_\ba_\br_\ba_\bl_\bl_\be_\bl\n+mpitraits.hh\n _\bG_\bo_\b _\bt_\bo_\b _\bt_\bh_\be_\b _\bd_\bo_\bc_\bu_\bm_\be_\bn_\bt_\ba_\bt_\bi_\bo_\bn_\b _\bo_\bf_\b _\bt_\bh_\bi_\bs_\b _\bf_\bi_\bl_\be_\b.\n 1// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-\n 2// vi: set et ts=4 sw=2 sts=2:\n 3// SPDX-FileCopyrightInfo: Copyright \u00c2\u00a9 DUNE Project contributors, see file\n LICENSE.md in module root\n 4// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception\n-5#ifndef DUNE_COMMON_IOS_STATE_HH\n-6#define DUNE_COMMON_IOS_STATE_HH\n+5#ifndef DUNE_COMMON_PARALLEL_MPITRAITS_HH\n+6#define DUNE_COMMON_PARALLEL_MPITRAITS_HH\n 7\n-8#include \n-9\n-10namespace _\bD_\bu_\bn_\be {\n-_\b3_\b3 class _\bi_\bo_\bs_\b__\bb_\ba_\bs_\be_\b__\ba_\bl_\bl_\b__\bs_\ba_\bv_\be_\br\n-34 {\n-35 public:\n-_\b3_\b7 typedef std::ios_base _\bs_\bt_\ba_\bt_\be_\b__\bt_\by_\bp_\be;\n-38\n-48 _\bi_\bo_\bs_\b__\bb_\ba_\bs_\be_\b__\ba_\bl_\bl_\b__\bs_\ba_\bv_\be_\br(_\bs_\bt_\ba_\bt_\be_\b__\bt_\by_\bp_\be& ios_);\n-49\n-53 _\b~_\bi_\bo_\bs_\b__\bb_\ba_\bs_\be_\b__\ba_\bl_\bl_\b__\bs_\ba_\bv_\be_\br();\n-54\n-61 void _\br_\be_\bs_\bt_\bo_\br_\be();\n+18#if HAVE_MPI\n+19\n+20#include \n+21#include \n+22#include \n+23#include \n+24#include \n+25\n+26#include \n+27\n+28namespace _\bD_\bu_\bn_\be\n+29{\n+39 template\n+_\b4_\b0 struct _\bM_\bP_\bI_\bT_\br_\ba_\bi_\bt_\bs\n+41 {\n+42 private:\n+43 _\bM_\bP_\bI_\bT_\br_\ba_\bi_\bt_\bs(){}\n+44 _\bM_\bP_\bI_\bT_\br_\ba_\bi_\bt_\bs(const _\bM_\bP_\bI_\bT_\br_\ba_\bi_\bt_\bs&){}\n+45 static MPI_Datatype datatype;\n+46 static MPI_Datatype vectortype;\n+47 public:\n+_\b4_\b8 static inline MPI_Datatype _\bg_\be_\bt_\bT_\by_\bp_\be()\n+49 {\n+50 if(datatype==MPI_DATATYPE_NULL) {\n+51 MPI_Type_contiguous(sizeof(T),MPI_BYTE,&datatype);\n+52 MPI_Type_commit(&datatype);\n+53 }\n+54 return datatype;\n+55 }\n+_\b5_\b6 static constexpr bool _\bi_\bs_\b__\bi_\bn_\bt_\br_\bi_\bn_\bs_\bi_\bc = false;\n+57 };\n+58 template\n+59 MPI_Datatype _\bM_\bP_\bI_\bT_\br_\ba_\bi_\bt_\bs_\b<_\bT_\b>_\b:_\b:_\bd_\ba_\bt_\ba_\bt_\by_\bp_\be = MPI_DATATYPE_NULL;\n+60\n+61#ifndef DOXYGEN\n 62\n-63 private:\n-65 _\bs_\bt_\ba_\bt_\be_\b__\bt_\by_\bp_\be& ios;\n-67 state_type::fmtflags oldflags;\n-69 std::streamsize oldprec;\n-71 std::streamsize oldwidth;\n-72 };\n-73\n-75}\n-76\n-77#endif // DUNE_COMMON_IOS_STATE_HH\n-_\bD_\bu_\bn_\be_\b:_\b:_\bi_\bo_\bs_\b__\bb_\ba_\bs_\be_\b__\ba_\bl_\bl_\b__\bs_\ba_\bv_\be_\br_\b:_\b:_\b~_\bi_\bo_\bs_\b__\bb_\ba_\bs_\be_\b__\ba_\bl_\bl_\b__\bs_\ba_\bv_\be_\br\n-~ios_base_all_saver()\n-Destructor that restores the flags stored by the constructor.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn ios_state.cc:20\n-_\bD_\bu_\bn_\be_\b:_\b:_\bi_\bo_\bs_\b__\bb_\ba_\bs_\be_\b__\ba_\bl_\bl_\b__\bs_\ba_\bv_\be_\br_\b:_\b:_\br_\be_\bs_\bt_\bo_\br_\be\n-void restore()\n-Restore flags now.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn ios_state.cc:25\n-_\bD_\bu_\bn_\be_\b:_\b:_\bi_\bo_\bs_\b__\bb_\ba_\bs_\be_\b__\ba_\bl_\bl_\b__\bs_\ba_\bv_\be_\br_\b:_\b:_\bs_\bt_\ba_\bt_\be_\b__\bt_\by_\bp_\be\n-std::ios_base state_type\n-Export type of object we save the state for.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn ios_state.hh:37\n+63 // A Macro for defining traits for the primitive data types\n+64#define ComposeMPITraits(p,m) \\\n+65 template<> \\\n+66 struct MPITraits

    { \\\n+67 static inline MPI_Datatype getType(){ \\\n+68 return m; \\\n+69 } \\\n+70 static constexpr bool is_intrinsic = true; \\\n+71 }\n+72\n+73 ComposeMPITraits(char, MPI_CHAR);\n+74 ComposeMPITraits(unsigned char,MPI_UNSIGNED_CHAR);\n+75 ComposeMPITraits(short,MPI_SHORT);\n+76 ComposeMPITraits(unsigned short,MPI_UNSIGNED_SHORT);\n+77 ComposeMPITraits(int,MPI_INT);\n+78 ComposeMPITraits(unsigned int,MPI_UNSIGNED);\n+79 ComposeMPITraits(long,MPI_LONG);\n+80 ComposeMPITraits(unsigned long,MPI_UNSIGNED_LONG);\n+81 ComposeMPITraits(float,MPI_FLOAT);\n+82 ComposeMPITraits(double,MPI_DOUBLE);\n+83 ComposeMPITraits(long double,MPI_LONG_DOUBLE);\n+84 ComposeMPITraits(std::complex, MPI_CXX_DOUBLE_COMPLEX);\n+85 ComposeMPITraits(std::complex, MPI_CXX_LONG_DOUBLE_COMPLEX);\n+86 ComposeMPITraits(std::complex, MPI_CXX_FLOAT_COMPLEX);\n+87\n+88\n+89#undef ComposeMPITraits\n+90\n+91 template class _\bF_\bi_\be_\bl_\bd_\bV_\be_\bc_\bt_\bo_\br;\n+92\n+93 template\n+94 struct _\bM_\bP_\bI_\bT_\br_\ba_\bi_\bt_\bs<_\bF_\bi_\be_\bl_\bd_\bV_\be_\bc_\bt_\bo_\br >\n+95 {\n+96 static MPI_Datatype datatype;\n+97 static MPI_Datatype vectortype;\n+98\n+99 static inline MPI_Datatype _\bg_\be_\bt_\bT_\by_\bp_\be()\n+100 {\n+101 if(datatype==MPI_DATATYPE_NULL) {\n+102 MPI_Type_contiguous(n, _\bM_\bP_\bI_\bT_\br_\ba_\bi_\bt_\bs_\b<_\bK_\b>_\b:_\b:_\bg_\be_\bt_\bT_\by_\bp_\be(), &vectortype);\n+103 MPI_Type_commit(&vectortype);\n+104 _\bF_\bi_\be_\bl_\bd_\bV_\be_\bc_\bt_\bo_\br_\b<_\bK_\b,_\bn_\b> fvector;\n+105 MPI_Aint base;\n+106 MPI_Aint displ;\n+107 MPI_Get_address(&fvector, &base);\n+108 MPI_Get_address(&(fvector[0]), &displ);\n+109 displ -= base;\n+110 int length[1]={1};\n+111\n+112 MPI_Type_create_struct(1, length, &displ, &vectortype, &datatype);\n+113 MPI_Type_commit(&datatype);\n+114 }\n+115 return datatype;\n+116 }\n+117\n+118 };\n+119\n+120 template\n+121 MPI_Datatype MPITraits >::datatype = MPI_DATATYPE_NULL;\n+122 template\n+123 MPI_Datatype MPITraits >::vectortype =\n+{MPI_DATATYPE_NULL};\n+124\n+125\n+126 template\n+127 class bigunsignedint;\n+128\n+129 template\n+130 struct MPITraits >\n+131 {\n+132 static MPI_Datatype datatype;\n+133 static MPI_Datatype vectortype;\n+134\n+135 static inline MPI_Datatype _\bg_\be_\bt_\bT_\by_\bp_\be()\n+136 {\n+137 if(datatype==MPI_DATATYPE_NULL) {\n+138 MPI_Type_contiguous(_\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt_\b<_\bk_\b>_\b:_\b:_\bn, _\bM_\bP_\bI_\bT_\br_\ba_\bi_\bt_\bs_\b<_\bs_\bt_\bd_\b:_\b:_\bu_\bi_\bn_\bt_\b1_\b6_\b__\bt_\b>_\b:_\b:_\bg_\be_\bt_\bT_\by_\bp_\be\n+(),\n+139 &vectortype);\n+140 //MPI_Type_commit(&vectortype);\n+141 bigunsignedint data;\n+142 MPI_Aint base;\n+143 MPI_Aint displ;\n+144 MPI_Get_address(&data, &base);\n+145 MPI_Get_address(&(data.digit), &displ);\n+146 displ -= base;\n+147 int length[1]={1};\n+148 MPI_Type_create_struct(1, length, &displ, &vectortype, &datatype);\n+149 MPI_Type_commit(&datatype);\n+150 }\n+151 return datatype;\n+152 }\n+153 };\n+154}\n+155\n+156namespace _\bD_\bu_\bn_\be\n+157{\n+158 template\n+159 MPI_Datatype MPITraits >::datatype = MPI_DATATYPE_NULL;\n+160 template\n+161 MPI_Datatype MPITraits >::vectortype = MPI_DATATYPE_NULL;\n+162\n+163 template\n+164 struct MPITraits<_\bs_\bt_\bd::pair >\n+165 {\n+166 public:\n+167 inline static MPI_Datatype _\bg_\be_\bt_\bT_\by_\bp_\be();\n+168 private:\n+169 static MPI_Datatype type;\n+170 };\n+171 template\n+172 MPI_Datatype MPITraits >::getType()\n+173 {\n+174 if(type==MPI_DATATYPE_NULL) {\n+175 int length[2] = {1, 1};\n+176 MPI_Aint disp[2];\n+177 MPI_Datatype types[2] = {_\bM_\bP_\bI_\bT_\br_\ba_\bi_\bt_\bs_\b<_\bT_\b1_\b>_\b:_\b:_\bg_\be_\bt_\bT_\by_\bp_\be(),\n+178 _\bM_\bP_\bI_\bT_\br_\ba_\bi_\bt_\bs_\b<_\bT_\b2_\b>_\b:_\b:_\bg_\be_\bt_\bT_\by_\bp_\be()};\n+179\n+180 using Pair = std::pair;\n+181 static_assert(std::is_standard_layout::value, \"offsetof() is only\n+defined for standard layout types\");\n+182 disp[0] = offsetof(Pair, first);\n+183 disp[1] = offsetof(Pair, second);\n+184\n+185 MPI_Datatype tmp;\n+186 MPI_Type_create_struct(2, length, disp, types, &tmp);\n+187\n+188 MPI_Type_create_resized(tmp, 0, sizeof(Pair), &type);\n+189 MPI_Type_commit(&type);\n+190\n+191 MPI_Type_free(&tmp);\n+192 }\n+193 return type;\n+194 }\n+195\n+196 template\n+197 MPI_Datatype MPITraits >::type=MPI_DATATYPE_NULL;\n+198\n+199#endif // !DOXYGEN\n+200\n+201} // namespace Dune\n+202\n+203#endif // HAVE_MPI\n+204\n+207#endif // DUNE_COMMON_PARALLEL_MPITRAITS_HH\n+_\bs_\bt_\bd\n+STL namespace.\n _\bD_\bu_\bn_\be\n Dune namespace.\n D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn alignedallocator.hh:13\n-_\bD_\bu_\bn_\be_\b:_\b:_\bi_\bo_\bs_\b__\bb_\ba_\bs_\be_\b__\ba_\bl_\bl_\b__\bs_\ba_\bv_\be_\br\n-Utility class for storing and resetting stream attributes.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn ios_state.hh:34\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\bP_\bI_\bT_\br_\ba_\bi_\bt_\bs\n+A traits class describing the mapping of types onto MPI_Datatypes.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mpitraits.hh:41\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\bP_\bI_\bT_\br_\ba_\bi_\bt_\bs_\b:_\b:_\bg_\be_\bt_\bT_\by_\bp_\be\n+static MPI_Datatype getType()\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mpitraits.hh:48\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\bP_\bI_\bT_\br_\ba_\bi_\bt_\bs_\b:_\b:_\bi_\bs_\b__\bi_\bn_\bt_\br_\bi_\bn_\bs_\bi_\bc\n+static constexpr bool is_intrinsic\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mpitraits.hh:56\n+_\bD_\bu_\bn_\be_\b:_\b:_\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt_\b:_\b:_\bn\n+static constexpr int n\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bigunsignedint.hh:78\n+_\bD_\bu_\bn_\be_\b:_\b:_\bF_\bi_\be_\bl_\bd_\bV_\be_\bc_\bt_\bo_\br\n+vector space out of a tensor product of fields.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn fvector.hh:91\n ===============================================================================\n Generated by\u00a0_\b[_\bd_\bo_\bx_\by_\bg_\be_\bn_\b] 1.9.8\n"}]}, {"source1": "./usr/share/doc/libdune-common-doc/doxygen/a00095.html", "source2": "./usr/share/doc/libdune-common-doc/doxygen/a00095.html", "unified_diff": "@@ -1,15 +1,15 @@\n \n \n \n \n \n \n \n-dune-common: classname.hh File Reference\n+dune-common: mpicollectivecommunication.hh File Reference\n \n \n \n \n \n \n \n@@ -65,54 +65,24 @@\n \n \n \n \n \n

    \n \n
    \n- \n-
    classname.hh File Reference
    \n+
    mpicollectivecommunication.hh File Reference
    \n
    \n
    \n-\n-

    A free function to provide the demangled class name of a given object or type as a string. \n-More...

    \n-
    #include <cstdlib>
    \n-#include <memory>
    \n-#include <string>
    \n-#include <typeinfo>
    \n-#include <type_traits>
    \n+\n

    Go to the source code of this file.

    \n-\n-\n-\n-\n-\n-

    \n-Namespaces

    namespace  Dune
     Dune namespace.
     
    \n-\n-\n-\n-\n-\n-\n-\n-\n-\n-

    \n-Functions

    template<class T >
    std::string Dune::className ()
     Provide the demangled class name of a type T as a string.
     
    template<class T >
    std::string Dune::className (T &&v)
     Provide the demangled class name of a given object as a string.
     
    \n-

    Detailed Description

    \n-

    A free function to provide the demangled class name of a given object or type as a string.

    \n-
    \n+
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,34 +1,12 @@\n dune-common\u00a02.10\n Loading...\n Searching...\n No Matches\n * _\bd_\bu_\bn_\be\n * _\bc_\bo_\bm_\bm_\bo_\bn\n-_\bN_\ba_\bm_\be_\bs_\bp_\ba_\bc_\be_\bs | _\bF_\bu_\bn_\bc_\bt_\bi_\bo_\bn_\bs\n-classname.hh File Reference\n-A free function to provide the demangled class name of a given object or type\n-as a string. _\bM_\bo_\br_\be_\b._\b._\b.\n-#include \n-#include \n-#include \n-#include \n-#include \n+ * _\bp_\ba_\br_\ba_\bl_\bl_\be_\bl\n+mpicollectivecommunication.hh File Reference\n+#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bp_\ba_\br_\ba_\bl_\bl_\be_\bl_\b/_\bm_\bp_\bi_\bc_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b._\bh_\bh>\n _\bG_\bo_\b _\bt_\bo_\b _\bt_\bh_\be_\b _\bs_\bo_\bu_\br_\bc_\be_\b _\bc_\bo_\bd_\be_\b _\bo_\bf_\b _\bt_\bh_\bi_\bs_\b _\bf_\bi_\bl_\be_\b.\n-N\bNa\bam\bme\bes\bsp\bpa\bac\bce\bes\bs\n-namespace \u00a0 _\bD_\bu_\bn_\be\n-\u00a0 _\bD_\bu_\bn_\be namespace.\n-\u00a0\n-F\bFu\bun\bnc\bct\bti\bio\bon\bns\bs\n-template\n-std::string\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bc_\bl_\ba_\bs_\bs_\bN_\ba_\bm_\be ()\n-\u00a0 Provide the demangled class name of a type T as a string.\n-\u00a0\n-template\n-std::string\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bc_\bl_\ba_\bs_\bs_\bN_\ba_\bm_\be (T &&v)\n-\u00a0 Provide the demangled class name of a given object as a string.\n-\u00a0\n-*\b**\b**\b**\b**\b* D\bDe\bet\bta\bai\bil\ble\bed\bd D\bDe\bes\bsc\bcr\bri\bip\bpt\bti\bio\bon\bn *\b**\b**\b**\b**\b*\n-A free function to provide the demangled class name of a given object or type\n-as a string.\n ===============================================================================\n Generated by\u00a0_\b[_\bd_\bo_\bx_\by_\bg_\be_\bn_\b] 1.9.8\n"}]}, {"source1": "./usr/share/doc/libdune-common-doc/doxygen/a00095_source.html", "source2": "./usr/share/doc/libdune-common-doc/doxygen/a00095_source.html", "unified_diff": "@@ -1,15 +1,15 @@\n \n \n \n \n \n \n \n-dune-common: classname.hh Source File\n+dune-common: mpicollectivecommunication.hh Source File\n \n \n \n \n \n \n \n@@ -70,99 +70,27 @@\n \n \n \n \n \n \n \n
    \n-
    classname.hh
    \n+
    mpicollectivecommunication.hh
    \n
    \n
    \n-Go to the documentation of this file.
    1// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
    \n-
    2// vi: set et ts=4 sw=2 sts=2:
    \n-
    3// SPDX-FileCopyrightInfo: Copyright \u00a9 DUNE Project contributors, see file LICENSE.md in module root
    \n-
    4// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception
    \n-
    5#ifndef DUNE_CLASSNAME_HH
    \n-
    6#define DUNE_CLASSNAME_HH
    \n-
    7
    \n-
    13#include <cstdlib>
    \n-
    14#include <memory>
    \n-
    15#include <string>
    \n-
    16#include <typeinfo>
    \n-
    17#include <type_traits>
    \n-
    18
    \n-
    19#if __has_include(<cxxabi.h>) && !DISABLE_CXA_DEMANGLE
    \n-
    20#define HAVE_CXA_DEMANGLE 1
    \n-
    21#include <cxxabi.h>
    \n-
    22#endif // #if HAVE_CXA_DEMANGLE
    \n-
    23
    \n-
    24namespace Dune {
    \n-
    25
    \n-
    26 namespace Impl {
    \n-
    27
    \n-
    28 inline std::string demangle(std::string name)
    \n-
    29 {
    \n-
    30#if HAVE_CXA_DEMANGLE
    \n-
    31 int status;
    \n-
    32 std::unique_ptr<char, void(*)(void*)>
    \n-
    33 demangled(abi::__cxa_demangle(name.c_str(), nullptr, nullptr, &status),
    \n-
    34 std::free);
    \n-
    35 if( demangled )
    \n-
    36 name = demangled.get();
    \n-
    37#endif // #if HAVE_CXA_DEMANGLE
    \n-
    38 return name;
    \n-
    39 }
    \n-
    40 }
    \n-
    41
    \n-
    43 /*
    \n-
    44 * \\ingroup CxxUtilities
    \n-
    45 */
    \n-
    46 template <class T>
    \n-
    \n-
    47 std::string className ()
    \n-
    48 {
    \n-
    49 typedef typename std::remove_reference<T>::type TR;
    \n-
    50 std::string className = Impl::demangle( typeid( TR ).name() );
    \n-
    51 if (std::is_const<TR>::value)
    \n-
    52 className += " const";
    \n-
    53 if (std::is_volatile<TR>::value)
    \n-
    54 className += " volatile";
    \n-
    55 if (std::is_lvalue_reference<T>::value)
    \n-
    56 className += "&";
    \n-
    57 else if (std::is_rvalue_reference<T>::value)
    \n-
    58 className += "&&";
    \n-
    59 return className;
    \n-
    60 }
    \n-
    \n-
    61
    \n-
    63 /*
    \n-
    64 * \\ingroup CxxUtilities
    \n-
    65 */
    \n-
    66 template <class T>
    \n-
    \n-
    67 std::string className ( T&& v)
    \n-
    68 {
    \n-
    69 typedef typename std::remove_reference<T>::type TR;
    \n-
    70 std::string className = Impl::demangle( typeid(v).name() );
    \n-
    71 if (std::is_const<TR>::value)
    \n-
    72 className += " const";
    \n-
    73 if (std::is_volatile<TR>::value)
    \n-
    74 className += " volatile";
    \n-
    75 return className;
    \n-
    76 }
    \n-
    \n-
    77} // namespace Dune
    \n-
    78
    \n-
    79#endif // DUNE_CLASSNAME_HH
    \n-
    Dune namespace.
    Definition alignedallocator.hh:13
    \n-
    std::string className()
    Provide the demangled class name of a type T as a string.
    Definition classname.hh:47
    \n+Go to the documentation of this file.
    1// SPDX-FileCopyrightInfo: Copyright \u00a9 DUNE Project contributors, see file LICENSE.md in module root
    \n+
    2// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception
    \n+
    3// Will be removed after the 2.7 release
    \n+
    4#warning "Deprecated header, use #include <dune/common/parallel/mpicommunication.hh> instead!"
    \n+\n+
    Implements an utility class that provides MPI's collective communication methods.
    \n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,90 +1,21 @@\n dune-common\u00a02.10\n Loading...\n Searching...\n No Matches\n * _\bd_\bu_\bn_\be\n * _\bc_\bo_\bm_\bm_\bo_\bn\n-classname.hh\n+ * _\bp_\ba_\br_\ba_\bl_\bl_\be_\bl\n+mpicollectivecommunication.hh\n _\bG_\bo_\b _\bt_\bo_\b _\bt_\bh_\be_\b _\bd_\bo_\bc_\bu_\bm_\be_\bn_\bt_\ba_\bt_\bi_\bo_\bn_\b _\bo_\bf_\b _\bt_\bh_\bi_\bs_\b _\bf_\bi_\bl_\be_\b.\n-1// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-\n-2// vi: set et ts=4 sw=2 sts=2:\n-3// SPDX-FileCopyrightInfo: Copyright \u00c2\u00a9 DUNE Project contributors, see file\n+1// SPDX-FileCopyrightInfo: Copyright \u00c2\u00a9 DUNE Project contributors, see file\n LICENSE.md in module root\n-4// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception\n-5#ifndef DUNE_CLASSNAME_HH\n-6#define DUNE_CLASSNAME_HH\n-7\n-13#include \n-14#include \n-15#include \n-16#include \n-17#include \n-18\n-19#if __has_include() && !DISABLE_CXA_DEMANGLE\n-20#define HAVE_CXA_DEMANGLE 1\n-21#include \n-22#endif // #if HAVE_CXA_DEMANGLE\n-23\n-24namespace _\bD_\bu_\bn_\be {\n-25\n-26 namespace Impl {\n-27\n-28 inline std::string demangle(std::string name)\n-29 {\n-30#if HAVE_CXA_DEMANGLE\n-31 int status;\n-32 std::unique_ptr\n-33 demangled(abi::__cxa_demangle(name.c_str(), nullptr, nullptr, &status),\n-34 std::free);\n-35 if( demangled )\n-36 name = demangled.get();\n-37#endif // #if HAVE_CXA_DEMANGLE\n-38 return name;\n-39 }\n-40 }\n-41\n-43 /*\n-44 * \\ingroup CxxUtilities\n-45 */\n-46 template \n-_\b4_\b7 std::string _\bc_\bl_\ba_\bs_\bs_\bN_\ba_\bm_\be ()\n-48 {\n-49 typedef typename std::remove_reference::type TR;\n-50 std::string _\bc_\bl_\ba_\bs_\bs_\bN_\ba_\bm_\be = Impl::demangle( typeid( TR ).name() );\n-51 if (std::is_const::value)\n-52 _\bc_\bl_\ba_\bs_\bs_\bN_\ba_\bm_\be += \" const\";\n-53 if (std::is_volatile::value)\n-54 _\bc_\bl_\ba_\bs_\bs_\bN_\ba_\bm_\be += \" volatile\";\n-55 if (std::is_lvalue_reference::value)\n-56 _\bc_\bl_\ba_\bs_\bs_\bN_\ba_\bm_\be += \"&\";\n-57 else if (std::is_rvalue_reference::value)\n-58 _\bc_\bl_\ba_\bs_\bs_\bN_\ba_\bm_\be += \"&&\";\n-59 return _\bc_\bl_\ba_\bs_\bs_\bN_\ba_\bm_\be;\n-60 }\n-61\n-63 /*\n-64 * \\ingroup CxxUtilities\n-65 */\n-66 template \n-_\b6_\b7 std::string _\bc_\bl_\ba_\bs_\bs_\bN_\ba_\bm_\be ( T&& v)\n-68 {\n-69 typedef typename std::remove_reference::type TR;\n-70 std::string _\bc_\bl_\ba_\bs_\bs_\bN_\ba_\bm_\be = Impl::demangle( typeid(v).name() );\n-71 if (std::is_const::value)\n-72 _\bc_\bl_\ba_\bs_\bs_\bN_\ba_\bm_\be += \" const\";\n-73 if (std::is_volatile::value)\n-74 _\bc_\bl_\ba_\bs_\bs_\bN_\ba_\bm_\be += \" volatile\";\n-75 return _\bc_\bl_\ba_\bs_\bs_\bN_\ba_\bm_\be;\n-76 }\n-77} // namespace Dune\n-78\n-79#endif // DUNE_CLASSNAME_HH\n-_\bD_\bu_\bn_\be\n-Dune namespace.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn alignedallocator.hh:13\n-_\bD_\bu_\bn_\be_\b:_\b:_\bc_\bl_\ba_\bs_\bs_\bN_\ba_\bm_\be\n-std::string className()\n-Provide the demangled class name of a type T as a string.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn classname.hh:47\n+2// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception\n+3// Will be removed after the 2.7 release\n+4#warning \"Deprecated header, use #include instead!\"\n+5#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bp_\ba_\br_\ba_\bl_\bl_\be_\bl_\b/_\bm_\bp_\bi_\bc_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b._\bh_\bh>\n+_\bm_\bp_\bi_\bc_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b._\bh_\bh\n+Implements an utility class that provides MPI's collective communication\n+methods.\n ===============================================================================\n Generated by\u00a0_\b[_\bd_\bo_\bx_\by_\bg_\be_\bn_\b] 1.9.8\n"}]}, {"source1": "./usr/share/doc/libdune-common-doc/doxygen/a00098.html", "source2": "./usr/share/doc/libdune-common-doc/doxygen/a00098.html", "unified_diff": "@@ -1,15 +1,15 @@\n \n \n \n \n \n \n \n-dune-common: path.cc File Reference\n+dune-common: communicator.hh File Reference\n \n \n \n \n \n \n \n@@ -65,64 +65,73 @@\n
    \n \n \n \n \n \n \n
    \n \n-
    path.cc File Reference
    \n+Classes |\n+Namespaces
    \n+ \n \n
    \n \n-

    Utilities for handling filesystem paths. \n+

    Provides utility classes for syncing distributed data via MPI communication. \n More...

    \n-
    #include <algorithm>
    \n-#include <iterator>
    \n-#include <string>
    \n-#include <dune/common/exceptions.hh>
    \n-#include <dune/common/stringutility.hh>
    \n-#include <dune/common/path.hh>
    \n-
    \n+
    #include <cassert>
    \n+#include <cstddef>
    \n+#include <iostream>
    \n+#include <map>
    \n+#include <type_traits>
    \n+#include <utility>
    \n+#include <mpi.h>
    \n+#include <dune/common/exceptions.hh>
    \n+#include <dune/common/parallel/interface.hh>
    \n+#include <dune/common/parallel/remoteindices.hh>
    \n+#include <dune/common/stdstreams.hh>
    \n+
    \n+

    Go to the source code of this file.

    \n+
    \n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+

    \n+Classes

    struct  Dune::SizeOne
     Flag for marking indexed data structures where data at each index is of the same size. More...
     
    struct  Dune::VariableSize
     Flag for marking indexed data structures where the data at each index may be a variable multiple of another type. More...
     
    struct  Dune::CommPolicy< V >
     Default policy used for communicating an indexed type. More...
     
    struct  Dune::CommPolicy< V >::CommPolicy< VariableBlockVector< FieldVector< K, n >, A > >
     
    class  Dune::CommPolicy< V >::CommunicationError
     Error thrown if there was a problem with the communication. More...
     
    struct  Dune::CommPolicy< V >::CopyGatherScatter< T >
     GatherScatter default implementation that just copies data. More...
     
    class  Dune::BufferedCommunicator
     A communicator that uses buffers to gather and scatter the data to be send or received. More...
     
    \n \n \n \n \n-

    \n Namespaces

    namespace  Dune
     Dune namespace.
     
    \n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n

    \n-Functions

    std::string Dune::concatPaths (const std::string &base, const std::string &p)
     concatenate two paths
     
    std::string Dune::processPath (const std::string &p)
     sanitize a path for further processing
     
    bool Dune::pathIndicatesDirectory (const std::string &p)
     check whether the given path indicates that it is a directory
     
    std::string Dune::prettyPath (const std::string &p, bool isDirectory)
     pretty print path
     
    std::string Dune::prettyPath (const std::string &p)
     pretty print path
     
    std::string Dune::relativePath (const std::string &newbase, const std::string &p)
     compute a relative path between two paths
     
    \n

    Detailed Description

    \n-

    Utilities for handling filesystem paths.

    \n-
    Author
    J\u00f6 Fahlke jorri.nosp@m.t@jo.nosp@m.rrit..nosp@m.de
    \n+

    Provides utility classes for syncing distributed data via MPI communication.

    \n+
    Author
    Markus Blatt
    \n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n \n", "details": [{"source1": "encoding", "source2": "encoding", "unified_diff": "@@ -1 +1 @@\n-utf-8\n+us-ascii\n"}, {"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,46 +1,59 @@\n dune-common\u00a02.10\n Loading...\n Searching...\n No Matches\n * _\bd_\bu_\bn_\be\n * _\bc_\bo_\bm_\bm_\bo_\bn\n-_\bN_\ba_\bm_\be_\bs_\bp_\ba_\bc_\be_\bs | _\bF_\bu_\bn_\bc_\bt_\bi_\bo_\bn_\bs\n-path.cc File Reference\n-_\bC_\bo_\bm_\bm_\bo_\bn \u00bb _\bU_\bt_\bi_\bl_\bi_\bt_\bi_\be_\bs \u00bb _\bF_\bi_\bl_\be_\bs_\by_\bs_\bt_\be_\bm_\b _\bP_\ba_\bt_\bh_\bs\n-Utilities for handling filesystem paths. _\bM_\bo_\br_\be_\b._\b._\b.\n-#include \n-#include \n-#include \n+ * _\bp_\ba_\br_\ba_\bl_\bl_\be_\bl\n+_\bC_\bl_\ba_\bs_\bs_\be_\bs | _\bN_\ba_\bm_\be_\bs_\bp_\ba_\bc_\be_\bs\n+communicator.hh File Reference\n+_\bC_\bo_\bm_\bm_\bo_\bn \u00bb _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\b _\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn \u00bb _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\b _\bC_\bo_\bm_\bp_\bu_\bt_\bi_\bn_\bg_\b _\bb_\ba_\bs_\be_\bd_\b _\bo_\bn_\b _\bI_\bn_\bd_\be_\bx_\bs_\be_\bt_\bs\n+Provides utility classes for syncing distributed data via MPI communication.\n+_\bM_\bo_\br_\be_\b._\b._\b.\n+#include \n+#include \n+#include \n+#include \n+#include \n+#include \n+#include \n #include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\be_\bx_\bc_\be_\bp_\bt_\bi_\bo_\bn_\bs_\b._\bh_\bh>\n-#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bs_\bt_\br_\bi_\bn_\bg_\bu_\bt_\bi_\bl_\bi_\bt_\by_\b._\bh_\bh>\n-#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bp_\ba_\bt_\bh_\b._\bh_\bh>\n+#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bp_\ba_\br_\ba_\bl_\bl_\be_\bl_\b/_\bi_\bn_\bt_\be_\br_\bf_\ba_\bc_\be_\b._\bh_\bh>\n+#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bp_\ba_\br_\ba_\bl_\bl_\be_\bl_\b/_\br_\be_\bm_\bo_\bt_\be_\bi_\bn_\bd_\bi_\bc_\be_\bs_\b._\bh_\bh>\n+#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bs_\bt_\bd_\bs_\bt_\br_\be_\ba_\bm_\bs_\b._\bh_\bh>\n+_\bG_\bo_\b _\bt_\bo_\b _\bt_\bh_\be_\b _\bs_\bo_\bu_\br_\bc_\be_\b _\bc_\bo_\bd_\be_\b _\bo_\bf_\b _\bt_\bh_\bi_\bs_\b _\bf_\bi_\bl_\be_\b.\n+C\bCl\bla\bas\bss\bse\bes\bs\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bS_\bi_\bz_\be_\bO_\bn_\be\n+\u00a0 Flag for marking indexed data structures where data at each index is\n+ of the same size. _\bM_\bo_\br_\be_\b._\b._\b.\n+\u00a0\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bV_\ba_\br_\bi_\ba_\bb_\bl_\be_\bS_\bi_\bz_\be\n+\u00a0 Flag for marking indexed data structures where the data at each index\n+ may be a variable multiple of another type. _\bM_\bo_\br_\be_\b._\b._\b.\n+\u00a0\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bm_\bm_\bP_\bo_\bl_\bi_\bc_\by_\b<_\b _\bV_\b _\b>\n+\u00a0 Default policy used for communicating an indexed type. _\bM_\bo_\br_\be_\b._\b._\b.\n+\u00a0\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bm_\bm_\bP_\bo_\bl_\bi_\bc_\by_\b<_\b _\bV_\b _\b>_\b:_\b:_\bC_\bo_\bm_\bm_\bP_\bo_\bl_\bi_\bc_\by_\b<_\b _\bV_\ba_\br_\bi_\ba_\bb_\bl_\be_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br_\b<_\b _\bF_\bi_\be_\bl_\bd_\bV_\be_\bc_\bt_\bo_\br_\b<\n+ _\bK_\b,_\b _\bn_\b _\b>_\b,_\b _\bA_\b _\b>_\b _\b>\n+\u00a0\n+ class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bm_\bm_\bP_\bo_\bl_\bi_\bc_\by_\b<_\b _\bV_\b _\b>_\b:_\b:_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\bE_\br_\br_\bo_\br\n+\u00a0 Error thrown if there was a problem with the communication. _\bM_\bo_\br_\be_\b._\b._\b.\n+\u00a0\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bm_\bm_\bP_\bo_\bl_\bi_\bc_\by_\b<_\b _\bV_\b _\b>_\b:_\b:_\bC_\bo_\bp_\by_\bG_\ba_\bt_\bh_\be_\br_\bS_\bc_\ba_\bt_\bt_\be_\br_\b<_\b _\bT_\b _\b>\n+\u00a0 GatherScatter default implementation that just copies data. _\bM_\bo_\br_\be_\b._\b._\b.\n+\u00a0\n+ class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bB_\bu_\bf_\bf_\be_\br_\be_\bd_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bo_\br\n+\u00a0 A communicator that uses buffers to gather and scatter the data to be\n+ send or received. _\bM_\bo_\br_\be_\b._\b._\b.\n+\u00a0\n N\bNa\bam\bme\bes\bsp\bpa\bac\bce\bes\bs\n namespace \u00a0 _\bD_\bu_\bn_\be\n \u00a0 _\bD_\bu_\bn_\be namespace.\n \u00a0\n-F\bFu\bun\bnc\bct\bti\bio\bon\bns\bs\n-std::string\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bc_\bo_\bn_\bc_\ba_\bt_\bP_\ba_\bt_\bh_\bs (const std::string &base, const std::string &p)\n-\u00a0 concatenate two paths\n-\u00a0\n-std::string\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bp_\br_\bo_\bc_\be_\bs_\bs_\bP_\ba_\bt_\bh (const std::string &p)\n-\u00a0 sanitize a path for further processing\n-\u00a0\n- bool\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bp_\ba_\bt_\bh_\bI_\bn_\bd_\bi_\bc_\ba_\bt_\be_\bs_\bD_\bi_\br_\be_\bc_\bt_\bo_\br_\by (const std::string &p)\n-\u00a0 check whether the given path indicates that it is a directory\n-\u00a0\n-std::string\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bp_\br_\be_\bt_\bt_\by_\bP_\ba_\bt_\bh (const std::string &p, bool isDirectory)\n-\u00a0 pretty print path\n-\u00a0\n-std::string\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bp_\br_\be_\bt_\bt_\by_\bP_\ba_\bt_\bh (const std::string &p)\n-\u00a0 pretty print path\n-\u00a0\n-std::string\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\br_\be_\bl_\ba_\bt_\bi_\bv_\be_\bP_\ba_\bt_\bh (const std::string &newbase, const std::string\n- &p)\n-\u00a0 compute a relative path between two paths\n-\u00a0\n *\b**\b**\b**\b**\b* D\bDe\bet\bta\bai\bil\ble\bed\bd D\bDe\bes\bsc\bcr\bri\bip\bpt\bti\bio\bon\bn *\b**\b**\b**\b**\b*\n-Utilities for handling filesystem paths.\n+Provides utility classes for syncing distributed data via MPI communication.\n Author\n- J\u00c3\u00b6 Fahlke _\bj_\bo_\br_\br_\bi_\b._\bn_\bo_\bs_\bp_\b@_\bm_\b._\bt_\b@_\bj_\bo_\b._\bn_\bo_\bs_\bp_\b@_\bm_\b._\br_\br_\bi_\bt_\b._\b._\bn_\bo_\bs_\bp_\b@_\bm_\b._\bd_\be\n+ Markus Blatt\n ===============================================================================\n Generated by\u00a0_\b[_\bd_\bo_\bx_\by_\bg_\be_\bn_\b] 1.9.8\n"}]}, {"source1": "./usr/share/doc/libdune-common-doc/doxygen/a00104.html", "source2": "./usr/share/doc/libdune-common-doc/doxygen/a00104.html", "unified_diff": "@@ -1,15 +1,15 @@\n \n \n \n \n \n \n \n-dune-common: genericiterator.hh File Reference\n+dune-common: debugstream.hh File Reference\n \n \n \n \n \n \n \n@@ -71,59 +71,63 @@\n \n
    \n \n
    \n \n-
    genericiterator.hh File Reference
    \n+Namespaces |\n+Typedefs
    \n+
    debugstream.hh File Reference
    \n \n
    \n \n-

    Implements a generic iterator class for writing stl conformant iterators. \n+

    Defines several output streams for messages of different importance. \n More...

    \n-
    #include <dune/common/iteratorfacades.hh>
    \n-#include <cassert>
    \n+
    #include <iostream>
    \n+#include <stack>
    \n+#include <dune/common/exceptions.hh>
    \n
    \n

    Go to the source code of this file.

    \n \n \n-\n-\n+\n+\n \n-\n+\n+\n \n-\n+\n+\n \n-\n+\n \n-\n-\n+\n+\n \n-\n-\n-\n-\n-\n-\n-\n-\n+\n+\n \n

    \n Classes

    struct  Dune::const_reference< R >
     Get the 'const' version of a reference to a mutable object. More...
    struct  Dune::greater_or_equal< current, threshold >
     Greater or equal template test. More...
     
    struct  Dune::const_reference< const R >
    struct  Dune::common_bits< current, mask >
     activate if current and mask have common bits switched on. More...
     
    struct  Dune::const_reference< R & >
    class  Dune::DebugStreamError
     standard exception for the debugstream More...
     
    struct  Dune::const_reference< const R & >
    class  Dune::StreamWrap
     
    struct  Dune::mutable_reference< R >
     get the 'mutable' version of a reference to a const object More...
    class  Dune::DebugStreamState
     Intermediate class to implement tie-operation of DebugStream. More...
     
    struct  Dune::mutable_reference< const R >
     
    struct  Dune::mutable_reference< R & >
     
    struct  Dune::mutable_reference< const R & >
     
    class  Dune::GenericIterator< C, T, R, D, IteratorFacade >
     Generic class for stl-conforming iterators for container classes with operator[]. More...
    class  Dune::DebugStream< thislevel, dlevel, alevel, activator >
     Generic class to implement debug output streams. More...
     
    \n \n \n \n \n+

    \n Namespaces

    namespace  Dune
     Dune namespace.
     
    \n+\n+\n+\n+\n

    \n+Typedefs

    typedef unsigned int Dune::DebugLevel
     Type for debug levels.
     
    \n

    Detailed Description

    \n-

    Implements a generic iterator class for writing stl conformant iterators.

    \n-

    Using this generic iterator writing iterators for containers that implement operator[] is only a matter of seconds.

    \n+

    Defines several output streams for messages of different importance.

    \n+

    This file implements the class DebugStream to support output in a variety of debug levels. Additionally, template parameters control if the output operation is really performed so that unused debug levels can be deactivated

    \n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,46 +1,47 @@\n dune-common\u00a02.10\n Loading...\n Searching...\n No Matches\n * _\bd_\bu_\bn_\be\n * _\bc_\bo_\bm_\bm_\bo_\bn\n-_\bC_\bl_\ba_\bs_\bs_\be_\bs | _\bN_\ba_\bm_\be_\bs_\bp_\ba_\bc_\be_\bs\n-genericiterator.hh File Reference\n-Implements a generic iterator class for writing stl conformant iterators.\n-_\bM_\bo_\br_\be_\b._\b._\b.\n-#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bi_\bt_\be_\br_\ba_\bt_\bo_\br_\bf_\ba_\bc_\ba_\bd_\be_\bs_\b._\bh_\bh>\n-#include \n+_\bC_\bl_\ba_\bs_\bs_\be_\bs | _\bN_\ba_\bm_\be_\bs_\bp_\ba_\bc_\be_\bs | _\bT_\by_\bp_\be_\bd_\be_\bf_\bs\n+debugstream.hh File Reference\n+_\bC_\bo_\bm_\bm_\bo_\bn \u00bb _\bD_\be_\bb_\bu_\bg_\b _\bo_\bu_\bt_\bp_\bu_\bt\n+Defines several output streams for messages of different importance. _\bM_\bo_\br_\be_\b._\b._\b.\n+#include \n+#include \n+#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\be_\bx_\bc_\be_\bp_\bt_\bi_\bo_\bn_\bs_\b._\bh_\bh>\n _\bG_\bo_\b _\bt_\bo_\b _\bt_\bh_\be_\b _\bs_\bo_\bu_\br_\bc_\be_\b _\bc_\bo_\bd_\be_\b _\bo_\bf_\b _\bt_\bh_\bi_\bs_\b _\bf_\bi_\bl_\be_\b.\n C\bCl\bla\bas\bss\bse\bes\bs\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bc_\bo_\bn_\bs_\bt_\b__\br_\be_\bf_\be_\br_\be_\bn_\bc_\be_\b<_\b _\bR_\b _\b>\n-\u00a0 Get the 'const' version of a reference to a mutable object. _\bM_\bo_\br_\be_\b._\b._\b.\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bg_\br_\be_\ba_\bt_\be_\br_\b__\bo_\br_\b__\be_\bq_\bu_\ba_\bl_\b<_\b _\bc_\bu_\br_\br_\be_\bn_\bt_\b,_\b _\bt_\bh_\br_\be_\bs_\bh_\bo_\bl_\bd_\b _\b>\n+\u00a0 Greater or equal template test. _\bM_\bo_\br_\be_\b._\b._\b.\n \u00a0\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bc_\bo_\bn_\bs_\bt_\b__\br_\be_\bf_\be_\br_\be_\bn_\bc_\be_\b<_\b _\bc_\bo_\bn_\bs_\bt_\b _\bR_\b _\b>\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bc_\bo_\bm_\bm_\bo_\bn_\b__\bb_\bi_\bt_\bs_\b<_\b _\bc_\bu_\br_\br_\be_\bn_\bt_\b,_\b _\bm_\ba_\bs_\bk_\b _\b>\n+\u00a0 activate if current and mask have common bits switched on. _\bM_\bo_\br_\be_\b._\b._\b.\n \u00a0\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bc_\bo_\bn_\bs_\bt_\b__\br_\be_\bf_\be_\br_\be_\bn_\bc_\be_\b<_\b _\bR_\b _\b&_\b _\b>\n+ class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bD_\be_\bb_\bu_\bg_\bS_\bt_\br_\be_\ba_\bm_\bE_\br_\br_\bo_\br\n+\u00a0 standard exception for the debugstream _\bM_\bo_\br_\be_\b._\b._\b.\n \u00a0\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bc_\bo_\bn_\bs_\bt_\b__\br_\be_\bf_\be_\br_\be_\bn_\bc_\be_\b<_\b _\bc_\bo_\bn_\bs_\bt_\b _\bR_\b _\b&_\b _\b>\n+ class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bS_\bt_\br_\be_\ba_\bm_\bW_\br_\ba_\bp\n \u00a0\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bm_\bu_\bt_\ba_\bb_\bl_\be_\b__\br_\be_\bf_\be_\br_\be_\bn_\bc_\be_\b<_\b _\bR_\b _\b>\n-\u00a0 get the 'mutable' version of a reference to a const object _\bM_\bo_\br_\be_\b._\b._\b.\n+ class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bD_\be_\bb_\bu_\bg_\bS_\bt_\br_\be_\ba_\bm_\bS_\bt_\ba_\bt_\be\n+\u00a0 Intermediate class to implement tie-operation of _\bD_\be_\bb_\bu_\bg_\bS_\bt_\br_\be_\ba_\bm. _\bM_\bo_\br_\be_\b._\b._\b.\n \u00a0\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bm_\bu_\bt_\ba_\bb_\bl_\be_\b__\br_\be_\bf_\be_\br_\be_\bn_\bc_\be_\b<_\b _\bc_\bo_\bn_\bs_\bt_\b _\bR_\b _\b>\n-\u00a0\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bm_\bu_\bt_\ba_\bb_\bl_\be_\b__\br_\be_\bf_\be_\br_\be_\bn_\bc_\be_\b<_\b _\bR_\b _\b&_\b _\b>\n-\u00a0\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bm_\bu_\bt_\ba_\bb_\bl_\be_\b__\br_\be_\bf_\be_\br_\be_\bn_\bc_\be_\b<_\b _\bc_\bo_\bn_\bs_\bt_\b _\bR_\b _\b&_\b _\b>\n-\u00a0\n- class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bG_\be_\bn_\be_\br_\bi_\bc_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b<_\b _\bC_\b,_\b _\bT_\b,_\b _\bR_\b,_\b _\bD_\b,_\b _\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bF_\ba_\bc_\ba_\bd_\be_\b _\b>\n-\u00a0 Generic class for stl-conforming iterators for container classes with\n- operator[]. _\bM_\bo_\br_\be_\b._\b._\b.\n+ class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bD_\be_\bb_\bu_\bg_\bS_\bt_\br_\be_\ba_\bm_\b<_\b _\bt_\bh_\bi_\bs_\bl_\be_\bv_\be_\bl_\b,_\b _\bd_\bl_\be_\bv_\be_\bl_\b,_\b _\ba_\bl_\be_\bv_\be_\bl_\b,_\b _\ba_\bc_\bt_\bi_\bv_\ba_\bt_\bo_\br_\b _\b>\n+\u00a0 Generic class to implement debug output streams. _\bM_\bo_\br_\be_\b._\b._\b.\n \u00a0\n N\bNa\bam\bme\bes\bsp\bpa\bac\bce\bes\bs\n namespace \u00a0 _\bD_\bu_\bn_\be\n \u00a0 _\bD_\bu_\bn_\be namespace.\n \u00a0\n+T\bTy\byp\bpe\bed\bde\bef\bfs\bs\n+typedef unsigned int\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bD_\be_\bb_\bu_\bg_\bL_\be_\bv_\be_\bl\n+\u00a0 Type for debug levels.\n+\u00a0\n *\b**\b**\b**\b**\b* D\bDe\bet\bta\bai\bil\ble\bed\bd D\bDe\bes\bsc\bcr\bri\bip\bpt\bti\bio\bon\bn *\b**\b**\b**\b**\b*\n-Implements a generic iterator class for writing stl conformant iterators.\n-Using this generic iterator writing iterators for containers that implement\n-operator[] is only a matter of seconds.\n+Defines several output streams for messages of different importance.\n+This file implements the class DebugStream to support output in a variety of\n+debug levels. Additionally, template parameters control if the output operation\n+is really performed so that unused debug levels can be deactivated\n ===============================================================================\n Generated by\u00a0_\b[_\bd_\bo_\bx_\by_\bg_\be_\bn_\b] 1.9.8\n"}]}, {"source1": "./usr/share/doc/libdune-common-doc/doxygen/a00104_source.html", "source2": "./usr/share/doc/libdune-common-doc/doxygen/a00104_source.html", "unified_diff": "@@ -1,15 +1,15 @@\n \n \n \n \n \n \n \n-dune-common: genericiterator.hh Source File\n+dune-common: debugstream.hh Source File\n \n \n \n \n \n \n \n@@ -74,240 +74,333 @@\n \n
    \n \n
    \n
    \n
    \n-
    genericiterator.hh
    \n+
    debugstream.hh
    \n
    \n
    \n Go to the documentation of this file.
    1// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
    \n
    2// vi: set et ts=4 sw=2 sts=2:
    \n
    3// SPDX-FileCopyrightInfo: Copyright \u00a9 DUNE Project contributors, see file LICENSE.md in module root
    \n
    4// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception
    \n-
    5#ifndef DUNE_GENERICITERATOR_HH
    \n-
    6#define DUNE_GENERICITERATOR_HH
    \n-
    7
    \n-\n-
    9#include <cassert>
    \n-
    10
    \n-
    11namespace Dune {
    \n-
    12
    \n-
    85 template<class R>
    \n-
    \n-\n-
    87 {
    \n-
    88 typedef const R type;
    \n-
    89 };
    \n-
    \n-
    90
    \n-
    91 template<class R>
    \n-
    \n-
    92 struct const_reference<const R>
    \n-
    93 {
    \n-
    94 typedef const R type;
    \n-
    95 };
    \n-
    \n-
    96
    \n-
    97 template<class R>
    \n-
    \n-
    98 struct const_reference<R&>
    \n-
    99 {
    \n-
    100 typedef const R& type;
    \n-
    101 };
    \n-
    \n-
    102
    \n-
    103 template<class R>
    \n-
    \n-
    104 struct const_reference<const R&>
    \n-
    105 {
    \n-
    106 typedef const R& type;
    \n-
    107 };
    \n-
    \n-
    108
    \n-
    114 template<class R>
    \n-
    \n-\n-
    116 {
    \n-
    117 typedef R type;
    \n-
    118 };
    \n-
    \n+
    5
    \n+
    6#ifndef DUNE_DEBUGSTREAM_HH
    \n+
    7#define DUNE_DEBUGSTREAM_HH
    \n+
    8
    \n+
    13#include <iostream>
    \n+
    14#include <stack>
    \n+
    15
    \n+\n+
    17
    \n+
    18namespace Dune {
    \n+
    19
    \n+
    118 typedef unsigned int DebugLevel;
    \n
    119
    \n-
    120 template<class R>
    \n-
    \n-
    121 struct mutable_reference<const R>
    \n-
    122 {
    \n-
    123 typedef R type;
    \n-
    124 };
    \n-
    \n-
    125
    \n-
    126 template<class R>
    \n-
    \n-\n-
    128 {
    \n-
    129 typedef R& type;
    \n-
    130 };
    \n-
    \n-
    131
    \n-
    132 template<class R>
    \n-
    \n-
    133 struct mutable_reference<const R&>
    \n-
    134 {
    \n-
    135 typedef R& type;
    \n-
    136 };
    \n-
    \n-
    137
    \n-
    149 template<class C, class T, class R=T&, class D = std::ptrdiff_t,
    \n-
    150 template<class,class,class,class> class IteratorFacade=RandomAccessIteratorFacade>
    \n-
    \n-\n-
    152 public IteratorFacade<GenericIterator<C,T,R,D,IteratorFacade>,T,R,D>
    \n-
    153 {
    \n-
    154 friend class GenericIterator<typename std::remove_const<C>::type, typename std::remove_const<T>::type, typename mutable_reference<R>::type, D, IteratorFacade>;
    \n-
    155 friend class GenericIterator<const typename std::remove_const<C>::type, const typename std::remove_const<T>::type, typename const_reference<R>::type, D, IteratorFacade>;
    \n+
    129 template <DebugLevel current, DebugLevel threshold>
    \n+
    \n+\n+
    131 constexpr static bool value = (current >= threshold);
    \n+
    132 };
    \n+
    \n+
    133
    \n+
    134
    \n+
    141 template <DebugLevel current, DebugLevel mask>
    \n+
    \n+
    142 struct common_bits {
    \n+
    143 constexpr static bool value = ((current & mask) != 0);
    \n+
    144 };
    \n+
    \n+
    145
    \n+
    146
    \n+
    148 class DebugStreamError : public IOError {};
    \n+
    149
    \n+
    \n+\n+
    151 public:
    \n+
    152 StreamWrap(std::ostream& _out) : out(_out) { }
    \n+
    153 std::ostream& out;
    \n+\n+
    155 };
    \n+
    \n
    156
    \n-
    157 typedef GenericIterator<typename std::remove_const<C>::type, typename std::remove_const<T>::type, typename mutable_reference<R>::type, D, IteratorFacade> MutableIterator;
    \n-
    158 typedef GenericIterator<const typename std::remove_const<C>::type, const typename std::remove_const<T>::type, typename const_reference<R>::type, D, IteratorFacade> ConstIterator;
    \n-
    159
    \n+
    \n+\n+
    159 // !!! should be protected somehow but that won't be easy
    \n
    160 public:
    \n-
    161
    \n-
    170 typedef C Container;
    \n-
    171
    \n-
    177 typedef T Value;
    \n-
    178
    \n-
    182 typedef D DifferenceType;
    \n-
    183
    \n-
    187 typedef R Reference;
    \n-
    188
    \n-
    189 // Constructors needed by the base iterators
    \n-
    \n-
    190 GenericIterator() : container_(0), position_(0)
    \n-
    191 {}
    \n-
    \n-
    192
    \n-
    \n-\n-
    201 : container_(&cont), position_(pos)
    \n-
    202 {}
    \n-
    \n+\n+
    163
    \n+\n+
    166
    \n+
    168 bool _tied;
    \n+
    169
    \n+
    171 unsigned int _tied_streams;
    \n+
    172 };
    \n+
    \n+
    173
    \n+
    188 template <DebugLevel thislevel = 1,
    \n+
    189 DebugLevel dlevel = 1,
    \n+
    190 DebugLevel alevel = 1,
    \n+
    191 template<DebugLevel, DebugLevel> class activator = greater_or_equal>
    \n+
    \n+\n+
    193 public:
    \n+
    \n+
    199 DebugStream(std::ostream& out = std::cerr) {
    \n+
    200 // start a new list of streams
    \n+
    201 current = new StreamWrap(out);
    \n+
    202 current->next = 0;
    \n
    203
    \n-
    \n-
    211 GenericIterator(const MutableIterator& other) : container_(other.container_), position_(other.position_)
    \n-
    212 {}
    \n+
    204 // check if we are above the default activation level
    \n+
    205 _active = activator<thislevel,alevel>::value;
    \n+
    206
    \n+
    207 // we're not tied to another DebugStream
    \n+
    208 _tied = false;
    \n+
    209
    \n+
    210 // no child streams yet
    \n+
    211 _tied_streams = 0;
    \n+
    212 }
    \n
    \n
    213
    \n-
    \n-
    223 GenericIterator(const ConstIterator& other) : container_(other.container_), position_(other.position_)
    \n-
    224 {}
    \n-
    \n+
    \n+\n+
    220 std::ostream& fallback = std::cerr)
    \n+
    221 {
    \n+
    222 // start a new list of streams
    \n+
    223 current = new StreamWrap(fallback);
    \n+
    224 current->next = 0;
    \n
    225
    \n-
    226 // Methods needed by the forward iterator
    \n-
    \n-
    227 bool equals(const MutableIterator & other) const
    \n-
    228 {
    \n-
    229 return position_ == other.position_ && container_ == other.container_;
    \n-
    230 }
    \n-
    \n-
    231
    \n-
    \n-
    232 bool equals(const ConstIterator & other) const
    \n-
    233 {
    \n-
    234 return position_ == other.position_ && container_ == other.container_;
    \n-
    235 }
    \n-
    \n-
    236
    \n-
    \n-\n-
    238 return container_->operator[](position_);
    \n-
    239 }
    \n-
    \n-
    240
    \n-
    \n-
    241 void increment(){
    \n-
    242 ++position_;
    \n-
    243 }
    \n-
    \n-
    244
    \n-
    245 // Additional function needed by BidirectionalIterator
    \n-
    \n-
    246 void decrement(){
    \n-
    247 --position_;
    \n-
    248 }
    \n-
    \n-
    249
    \n-
    250 // Additional function needed by RandomAccessIterator
    \n-
    \n-\n-
    252 return container_->operator[](position_+i);
    \n-
    253 }
    \n-
    \n-
    254
    \n-
    \n-\n-
    256 position_=position_+n;
    \n-
    257 }
    \n-
    \n-
    258
    \n-
    \n-\n-
    260 {
    \n-
    261 assert(other.container_==container_);
    \n-
    262 return other.position_ - position_;
    \n+
    226 // check if we are above the default activation level
    \n+
    227 _active = activator<thislevel,alevel>::value;
    \n+
    228 _tied_streams = 0;
    \n+
    229
    \n+
    230 // tie to the provided stream
    \n+
    231 _tied = true;
    \n+
    232 tiedstate = &master;
    \n+
    233 tiedstate->_tied_streams++;
    \n+
    234 }
    \n+
    \n+
    235
    \n+
    \n+\n+
    244 {
    \n+
    245 // untie
    \n+
    246 if (_tied)
    \n+
    247 tiedstate->_tied_streams--;
    \n+
    248 else {
    \n+
    249 // check if somebody still ties to us...
    \n+
    250 if (_tied_streams != 0)
    \n+
    251 {
    \n+
    252 std::cerr << "DebugStream destructor is called while other streams are still tied to it. Terminating!" << std::endl;
    \n+
    253 std::terminate();
    \n+
    254 }
    \n+
    255 }
    \n+
    256
    \n+
    257 // remove ostream-stack
    \n+
    258 while (current != 0) {
    \n+
    259 StreamWrap *s = current;
    \n+\n+
    261 delete s;
    \n+
    262 }
    \n
    263 }
    \n
    \n
    264
    \n-
    \n-\n-
    266 {
    \n-
    267 assert(other.container_==container_);
    \n-
    268 return other.position_ - position_;
    \n-
    269 }
    \n-
    \n-
    270
    \n-
    271 private:
    \n-
    272 Container *container_;
    \n-
    273 DifferenceType position_;
    \n-
    274 };
    \n-
    \n-
    275
    \n-
    278} // end namespace Dune
    \n-
    279
    \n-
    280#endif
    \n-
    This file implements iterator facade classes for writing stl conformant iterators.
    \n-
    STL namespace.
    \n+
    266 template <class T>
    \n+
    \n+
    267 DebugStream& operator<<(const T data) {
    \n+
    268 // remove the following code if stream wasn't compiled active
    \n+
    269 if (activator<thislevel, dlevel>::value) {
    \n+
    270 if (! _tied) {
    \n+
    271 if (_active)
    \n+
    272 current->out << data;
    \n+
    273 } else {
    \n+
    274 if (_active && tiedstate->_active)
    \n+
    275 tiedstate->current->out << data;
    \n+
    276 }
    \n+
    277 }
    \n+
    278
    \n+
    279 return *this;
    \n+
    280 }
    \n+
    \n+
    281
    \n+
    \n+
    289 DebugStream& operator<<(const int data) {
    \n+
    290 // remove the following code if stream wasn't compiled active
    \n+
    291 if (activator<thislevel, dlevel>::value) {
    \n+
    292 if (! _tied) {
    \n+
    293 if (_active)
    \n+
    294 current->out << data;
    \n+
    295 } else {
    \n+
    296 if (_active && tiedstate->_active)
    \n+
    297 tiedstate->current->out << data;
    \n+
    298 }
    \n+
    299 }
    \n+
    300
    \n+
    301 return *this;
    \n+
    302 }
    \n+
    \n+
    303
    \n+
    \n+
    305 DebugStream& operator<<(std::ostream& (*f)(std::ostream&)) {
    \n+
    306 if (activator<thislevel, dlevel>::value) {
    \n+
    307 if (! _tied) {
    \n+
    308 if (_active)
    \n+
    309 f(current->out);
    \n+
    310 } else {
    \n+
    311 if (_active && tiedstate->_active)
    \n+
    312 f(tiedstate->current->out);
    \n+
    313 }
    \n+
    314 }
    \n+
    315
    \n+
    316 return *this;
    \n+
    317 }
    \n+
    \n+
    318
    \n+
    \n+\n+
    321 if (activator<thislevel, dlevel>::value) {
    \n+
    322 if (! _tied) {
    \n+
    323 if (_active)
    \n+
    324 current->out.flush();
    \n+
    325 } else {
    \n+
    326 if (_active && tiedstate->_active)
    \n+
    327 tiedstate->current->out.flush();
    \n+
    328 }
    \n+
    329 }
    \n+
    330
    \n+
    331 return *this;
    \n+
    332 }
    \n+
    \n+
    333
    \n+
    \n+
    335 void push(bool b) {
    \n+
    336 // are we at all active?
    \n+
    337 if (activator<thislevel,alevel>::value) {
    \n+
    338 _actstack.push(_active);
    \n+
    339 _active = b;
    \n+
    340 } else {
    \n+
    341 // stay off
    \n+
    342 _actstack.push(false);
    \n+
    343 }
    \n+
    344 }
    \n+
    \n+
    345
    \n+
    \n+
    349 void pop() {
    \n+
    350 if (_actstack.empty())
    \n+
    351 DUNE_THROW(DebugStreamError, "No previous activation setting!");
    \n+
    352
    \n+
    353 _active = _actstack.top();
    \n+
    354 _actstack.pop();
    \n+
    355 }
    \n+
    \n+
    356
    \n+
    \n+
    363 bool active() const {
    \n+
    364 return activator<thislevel, dlevel>::value && _active;
    \n+
    365 }
    \n+
    \n+
    366
    \n+
    \n+
    371 void attach(std::ostream& stream) {
    \n+
    372 if (_tied)
    \n+
    373 DUNE_THROW(DebugStreamError, "Cannot attach to a tied stream!");
    \n+
    374
    \n+
    375 StreamWrap* newcurr = new StreamWrap(stream);
    \n+
    376 newcurr->next = current;
    \n+
    377 current = newcurr;
    \n+
    378 }
    \n+
    \n+
    379
    \n+
    \n+
    383 void detach() {
    \n+
    384 if (current->next == 0)
    \n+
    385 DUNE_THROW(DebugStreamError, "Cannot detach initial stream!");
    \n+
    386 if (_tied)
    \n+
    387 DUNE_THROW(DebugStreamError, "Cannot detach a tied stream!");
    \n+
    388
    \n+
    389 StreamWrap* old = current;
    \n+\n+
    391 delete old;
    \n+
    392 }
    \n+
    \n+
    393
    \n+
    \n+\n+
    398 if (to._tied)
    \n+
    399 DUNE_THROW(DebugStreamError, "Cannot tie to an already tied stream!");
    \n+
    400 if (_tied)
    \n+
    401 DUNE_THROW(DebugStreamError, "Stream already tied: untie first!");
    \n+
    402
    \n+
    403 _tied = true;
    \n+
    404 tiedstate = &to;
    \n+
    405
    \n+
    406 // tell master class
    \n+
    407 tiedstate->_tied_streams++;
    \n+
    408 }
    \n+
    \n+
    409
    \n+
    \n+
    413 void untie() {
    \n+
    414 if(! _tied)
    \n+
    415 DUNE_THROW(DebugStreamError, "Cannot untie, stream is not tied!");
    \n+
    416
    \n+
    417 tiedstate->_tied_streams--;
    \n+
    418 _tied = false;
    \n+
    419 tiedstate = 0;
    \n+
    420 }
    \n+
    \n+
    421
    \n+
    422 private:
    \n+
    424 DebugStreamState* tiedstate;
    \n+
    425
    \n+
    430 std::stack<bool> _actstack;
    \n+
    431 };
    \n+
    \n+
    432
    \n+
    434}
    \n+
    435
    \n+
    436
    \n+
    437#endif
    \n+
    A few common exception classes.
    \n+
    StreamWrap(std::ostream &_out)
    Definition debugstream.hh:152
    \n+
    DebugStream(std::ostream &out=std::cerr)
    Create a DebugStream and set initial output stream.
    Definition debugstream.hh:199
    \n+
    void untie()
    Untie stream.
    Definition debugstream.hh:413
    \n+
    DebugStream & flush()
    pass on flush to underlying output stream
    Definition debugstream.hh:320
    \n+
    void attach(std::ostream &stream)
    set output to a different stream.
    Definition debugstream.hh:371
    \n+
    void detach()
    detach current output stream and restore to previous stream
    Definition debugstream.hh:383
    \n+
    static constexpr bool value
    Definition debugstream.hh:143
    \n+
    std::ostream & out
    Definition debugstream.hh:153
    \n+
    void pop()
    restore previously set activation flag
    Definition debugstream.hh:349
    \n+
    bool active() const
    reports if this stream will produce output
    Definition debugstream.hh:363
    \n+
    bool _active
    flag to switch output during runtime
    Definition debugstream.hh:165
    \n+
    unsigned int _tied_streams
    how many streams are tied to this state
    Definition debugstream.hh:171
    \n+
    void tie(DebugStreamState &to)
    Tie a stream to this one.
    Definition debugstream.hh:397
    \n+
    void push(bool b)
    set activation flag and store old value
    Definition debugstream.hh:335
    \n+
    unsigned int DebugLevel
    Type for debug levels.
    Definition debugstream.hh:118
    \n+
    bool _tied
    are we tied to another DebugStream?
    Definition debugstream.hh:168
    \n+
    StreamWrap * current
    current output stream and link to possibly pushed old output streams
    Definition debugstream.hh:162
    \n+
    DebugStream & operator<<(const T data)
    Generic types are passed on to current output stream.
    Definition debugstream.hh:267
    \n+
    static constexpr bool value
    Definition debugstream.hh:131
    \n+
    ~DebugStream()
    Destroy stream.
    Definition debugstream.hh:243
    \n+
    DebugStream(DebugStreamState &master, std::ostream &fallback=std::cerr)
    Create a DebugStream and directly tie to another DebugStream.
    Definition debugstream.hh:219
    \n+
    DebugStream & operator<<(const int data)
    explicit specialization so that enums can be printed
    Definition debugstream.hh:289
    \n+
    DebugStream & operator<<(std::ostream &(*f)(std::ostream &))
    pass on manipulators to underlying output stream
    Definition debugstream.hh:305
    \n+
    StreamWrap * next
    Definition debugstream.hh:154
    \n+
    #define DUNE_THROW(E, m)
    Definition exceptions.hh:218
    \n
    Dune namespace.
    Definition alignedallocator.hh:13
    \n-
    Get the 'const' version of a reference to a mutable object.
    Definition genericiterator.hh:87
    \n-
    const R type
    Definition genericiterator.hh:88
    \n-
    const R type
    Definition genericiterator.hh:94
    \n-
    const R & type
    Definition genericiterator.hh:100
    \n-
    const R & type
    Definition genericiterator.hh:106
    \n-
    get the 'mutable' version of a reference to a const object
    Definition genericiterator.hh:116
    \n-
    R type
    Definition genericiterator.hh:117
    \n-
    R type
    Definition genericiterator.hh:123
    \n-
    R & type
    Definition genericiterator.hh:129
    \n-
    Generic class for stl-conforming iterators for container classes with operator[].
    Definition genericiterator.hh:153
    \n-
    GenericIterator(const MutableIterator &other)
    Copy constructor.
    Definition genericiterator.hh:211
    \n-
    bool equals(const MutableIterator &other) const
    Definition genericiterator.hh:227
    \n-
    Reference elementAt(DifferenceType i) const
    Definition genericiterator.hh:251
    \n-
    void increment()
    Definition genericiterator.hh:241
    \n-
    GenericIterator(const ConstIterator &other)
    Copy constructor.
    Definition genericiterator.hh:223
    \n-
    void advance(DifferenceType n)
    Definition genericiterator.hh:255
    \n-
    GenericIterator(Container &cont, DifferenceType pos)
    Constructor.
    Definition genericiterator.hh:200
    \n-
    D DifferenceType
    The type of the difference between two positions.
    Definition genericiterator.hh:182
    \n-
    R Reference
    The type of the reference to the values accessed.
    Definition genericiterator.hh:187
    \n-
    DifferenceType distanceTo(const MutableIterator &other) const
    Definition genericiterator.hh:259
    \n-
    C Container
    The type of container we are an iterator for.
    Definition genericiterator.hh:170
    \n-
    T Value
    The value type of the iterator.
    Definition genericiterator.hh:177
    \n-
    DifferenceType distanceTo(const ConstIterator &other) const
    Definition genericiterator.hh:265
    \n-
    void decrement()
    Definition genericiterator.hh:246
    \n-
    Reference dereference() const
    Definition genericiterator.hh:237
    \n-
    bool equals(const ConstIterator &other) const
    Definition genericiterator.hh:232
    \n-
    Base class for stl conformant forward iterators.
    Definition iteratorfacades.hh:435
    \n-
    CRTP-Mixing class for stl conformant iterators of given iterator category.
    Definition iteratorfacades.hh:1053
    \n+
    Greater or equal template test.
    Definition debugstream.hh:130
    \n+
    activate if current and mask have common bits switched on.
    Definition debugstream.hh:142
    \n+
    standard exception for the debugstream
    Definition debugstream.hh:148
    \n+
    Definition debugstream.hh:150
    \n+
    Intermediate class to implement tie-operation of DebugStream.
    Definition debugstream.hh:158
    \n+
    Generic class to implement debug output streams.
    Definition debugstream.hh:192
    \n+
    Default exception class for I/O errors.
    Definition exceptions.hh:231
    \n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,270 +1,375 @@\n dune-common\u00a02.10\n Loading...\n Searching...\n No Matches\n * _\bd_\bu_\bn_\be\n * _\bc_\bo_\bm_\bm_\bo_\bn\n-genericiterator.hh\n+debugstream.hh\n _\bG_\bo_\b _\bt_\bo_\b _\bt_\bh_\be_\b _\bd_\bo_\bc_\bu_\bm_\be_\bn_\bt_\ba_\bt_\bi_\bo_\bn_\b _\bo_\bf_\b _\bt_\bh_\bi_\bs_\b _\bf_\bi_\bl_\be_\b.\n 1// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-\n 2// vi: set et ts=4 sw=2 sts=2:\n 3// SPDX-FileCopyrightInfo: Copyright \u00c2\u00a9 DUNE Project contributors, see file\n LICENSE.md in module root\n 4// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception\n-5#ifndef DUNE_GENERICITERATOR_HH\n-6#define DUNE_GENERICITERATOR_HH\n-7\n-8#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bi_\bt_\be_\br_\ba_\bt_\bo_\br_\bf_\ba_\bc_\ba_\bd_\be_\bs_\b._\bh_\bh>\n-9#include \n-10\n-11namespace _\bD_\bu_\bn_\be {\n-12\n-85 template\n-_\b8_\b6 struct _\bc_\bo_\bn_\bs_\bt_\b__\br_\be_\bf_\be_\br_\be_\bn_\bc_\be\n-87 {\n-_\b8_\b8 typedef const R _\bt_\by_\bp_\be;\n-89 };\n-90\n-91 template\n-_\b9_\b2 struct _\bc_\bo_\bn_\bs_\bt_\b__\br_\be_\bf_\be_\br_\be_\bn_\bc_\be\n-93 {\n-_\b9_\b4 typedef const R _\bt_\by_\bp_\be;\n-95 };\n-96\n-97 template\n-_\b9_\b8 struct _\bc_\bo_\bn_\bs_\bt_\b__\br_\be_\bf_\be_\br_\be_\bn_\bc_\be\n-99 {\n-_\b1_\b0_\b0 typedef const R& _\bt_\by_\bp_\be;\n-101 };\n-102\n-103 template\n-_\b1_\b0_\b4 struct _\bc_\bo_\bn_\bs_\bt_\b__\br_\be_\bf_\be_\br_\be_\bn_\bc_\be\n-105 {\n-_\b1_\b0_\b6 typedef const R& _\bt_\by_\bp_\be;\n-107 };\n-108\n-114 template\n-_\b1_\b1_\b5 struct _\bm_\bu_\bt_\ba_\bb_\bl_\be_\b__\br_\be_\bf_\be_\br_\be_\bn_\bc_\be\n-116 {\n-_\b1_\b1_\b7 typedef R _\bt_\by_\bp_\be;\n-118 };\n+5\n+6#ifndef DUNE_DEBUGSTREAM_HH\n+7#define DUNE_DEBUGSTREAM_HH\n+8\n+13#include \n+14#include \n+15\n+16#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\be_\bx_\bc_\be_\bp_\bt_\bi_\bo_\bn_\bs_\b._\bh_\bh>\n+17\n+18namespace _\bD_\bu_\bn_\be {\n+19\n+_\b1_\b1_\b8 typedef unsigned int _\bD_\be_\bb_\bu_\bg_\bL_\be_\bv_\be_\bl;\n 119\n-120 template\n-_\b1_\b2_\b1 struct _\bm_\bu_\bt_\ba_\bb_\bl_\be_\b__\br_\be_\bf_\be_\br_\be_\bn_\bc_\be\n-122 {\n-_\b1_\b2_\b3 typedef R _\bt_\by_\bp_\be;\n-124 };\n-125\n-126 template\n-_\b1_\b2_\b7 struct _\bm_\bu_\bt_\ba_\bb_\bl_\be_\b__\br_\be_\bf_\be_\br_\be_\bn_\bc_\be\n-128 {\n-_\b1_\b2_\b9 typedef R& _\bt_\by_\bp_\be;\n-130 };\n-131\n-132 template\n-_\b1_\b3_\b3 struct _\bm_\bu_\bt_\ba_\bb_\bl_\be_\b__\br_\be_\bf_\be_\br_\be_\bn_\bc_\be\n-134 {\n-_\b1_\b3_\b5 typedef R& type;\n-136 };\n-137\n-149 template class\n-_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bF_\ba_\bc_\ba_\bd_\be=_\bR_\ba_\bn_\bd_\bo_\bm_\bA_\bc_\bc_\be_\bs_\bs_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bF_\ba_\bc_\ba_\bd_\be>\n-_\b1_\b5_\b1 class _\bG_\be_\bn_\be_\br_\bi_\bc_\bI_\bt_\be_\br_\ba_\bt_\bo_\br :\n-152 public _\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bF_\ba_\bc_\ba_\bd_\be,T,R,D>\n-153 {\n-154 friend class _\bG_\be_\bn_\be_\br_\bi_\bc_\bI_\bt_\be_\br_\ba_\bt_\bo_\br::type, typename\n-std::remove_const::type, typename _\bm_\bu_\bt_\ba_\bb_\bl_\be_\b__\br_\be_\bf_\be_\br_\be_\bn_\bc_\be::type, D,\n-_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bF_\ba_\bc_\ba_\bd_\be>;\n-155 friend class _\bG_\be_\bn_\be_\br_\bi_\bc_\bI_\bt_\be_\br_\ba_\bt_\bo_\br::type,\n-const typename std::remove_const::type, typename const_reference::type,\n-D, IteratorFacade>;\n+129 template \n+_\b1_\b3_\b0 struct _\bg_\br_\be_\ba_\bt_\be_\br_\b__\bo_\br_\b__\be_\bq_\bu_\ba_\bl {\n+_\b1_\b3_\b1 constexpr static bool _\bv_\ba_\bl_\bu_\be = (current >= threshold);\n+132 };\n+133\n+134\n+141 template \n+_\b1_\b4_\b2 struct _\bc_\bo_\bm_\bm_\bo_\bn_\b__\bb_\bi_\bt_\bs {\n+_\b1_\b4_\b3 constexpr static bool _\bv_\ba_\bl_\bu_\be = ((current & mask) != 0);\n+144 };\n+145\n+146\n+_\b1_\b4_\b8 class _\bD_\be_\bb_\bu_\bg_\bS_\bt_\br_\be_\ba_\bm_\bE_\br_\br_\bo_\br : public _\bI_\bO_\bE_\br_\br_\bo_\br {};\n+149\n+_\b1_\b5_\b0 class _\bS_\bt_\br_\be_\ba_\bm_\bW_\br_\ba_\bp {\n+151 public:\n+_\b1_\b5_\b2 _\bS_\bt_\br_\be_\ba_\bm_\bW_\br_\ba_\bp(std::ostream& _out) : _\bo_\bu_\bt(_out) { }\n+_\b1_\b5_\b3 std::ostream& _\bo_\bu_\bt;\n+_\b1_\b5_\b4 _\bS_\bt_\br_\be_\ba_\bm_\bW_\br_\ba_\bp *_\bn_\be_\bx_\bt;\n+155 };\n 156\n-157 typedef _\bG_\be_\bn_\be_\br_\bi_\bc_\bI_\bt_\be_\br_\ba_\bt_\bo_\br::type, typename std::\n-remove_const::type, typename mutable_reference::type, D, IteratorFacade>\n-_\bM_\bu_\bt_\ba_\bb_\bl_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br;\n-158 typedef _\bG_\be_\bn_\be_\br_\bi_\bc_\bI_\bt_\be_\br_\ba_\bt_\bo_\br::type, const\n-typename std::remove_const::type, typename const_reference::type, D,\n-IteratorFacade> _\bC_\bo_\bn_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br;\n-159\n+_\b1_\b5_\b8 class _\bD_\be_\bb_\bu_\bg_\bS_\bt_\br_\be_\ba_\bm_\bS_\bt_\ba_\bt_\be {\n+159 // !!! should be protected somehow but that won't be easy\n 160 public:\n-161\n-_\b1_\b7_\b0 typedef C _\bC_\bo_\bn_\bt_\ba_\bi_\bn_\be_\br;\n-171\n-_\b1_\b7_\b7 typedef T _\bV_\ba_\bl_\bu_\be;\n-178\n-_\b1_\b8_\b2 typedef D _\bD_\bi_\bf_\bf_\be_\br_\be_\bn_\bc_\be_\bT_\by_\bp_\be;\n-183\n-_\b1_\b8_\b7 typedef R _\bR_\be_\bf_\be_\br_\be_\bn_\bc_\be;\n-188\n-189 // Constructors needed by the base iterators\n-_\b1_\b9_\b0 _\bG_\be_\bn_\be_\br_\bi_\bc_\bI_\bt_\be_\br_\ba_\bt_\bo_\br() : container_(0), position_(0)\n-191 {}\n-192\n-_\b2_\b0_\b0 _\bG_\be_\bn_\be_\br_\bi_\bc_\bI_\bt_\be_\br_\ba_\bt_\bo_\br(_\bC_\bo_\bn_\bt_\ba_\bi_\bn_\be_\br& cont, _\bD_\bi_\bf_\bf_\be_\br_\be_\bn_\bc_\be_\bT_\by_\bp_\be pos)\n-201 : container_(&cont), position_(pos)\n-202 {}\n+_\b1_\b6_\b2 _\bS_\bt_\br_\be_\ba_\bm_\bW_\br_\ba_\bp* _\bc_\bu_\br_\br_\be_\bn_\bt;\n+163\n+_\b1_\b6_\b5 bool _\b__\ba_\bc_\bt_\bi_\bv_\be;\n+166\n+_\b1_\b6_\b8 bool _\b__\bt_\bi_\be_\bd;\n+169\n+_\b1_\b7_\b1 unsigned int _\b__\bt_\bi_\be_\bd_\b__\bs_\bt_\br_\be_\ba_\bm_\bs;\n+172 };\n+173\n+188 template <_\bD_\be_\bb_\bu_\bg_\bL_\be_\bv_\be_\bl thislevel = 1,\n+189 _\bD_\be_\bb_\bu_\bg_\bL_\be_\bv_\be_\bl dlevel = 1,\n+190 _\bD_\be_\bb_\bu_\bg_\bL_\be_\bv_\be_\bl alevel = 1,\n+191 template class activator = _\bg_\br_\be_\ba_\bt_\be_\br_\b__\bo_\br_\b__\be_\bq_\bu_\ba_\bl>\n+_\b1_\b9_\b2 class _\bD_\be_\bb_\bu_\bg_\bS_\bt_\br_\be_\ba_\bm : public _\bD_\be_\bb_\bu_\bg_\bS_\bt_\br_\be_\ba_\bm_\bS_\bt_\ba_\bt_\be {\n+193 public:\n+_\b1_\b9_\b9 _\bD_\be_\bb_\bu_\bg_\bS_\bt_\br_\be_\ba_\bm(std::ostream& out = std::cerr) {\n+200 // start a new list of streams\n+201 _\bc_\bu_\br_\br_\be_\bn_\bt = new _\bS_\bt_\br_\be_\ba_\bm_\bW_\br_\ba_\bp(out);\n+202 _\bc_\bu_\br_\br_\be_\bn_\bt->_\bn_\be_\bx_\bt = 0;\n 203\n-_\b2_\b1_\b1 _\bG_\be_\bn_\be_\br_\bi_\bc_\bI_\bt_\be_\br_\ba_\bt_\bo_\br(const _\bM_\bu_\bt_\ba_\bb_\bl_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br& other) : container_\n-(other.container_), position_(other.position_)\n-212 {}\n+204 // check if we are above the default activation level\n+205 _\b__\ba_\bc_\bt_\bi_\bv_\be = activator::value;\n+206\n+207 // we're not tied to another DebugStream\n+208 _\b__\bt_\bi_\be_\bd = false;\n+209\n+210 // no child streams yet\n+211 _\b__\bt_\bi_\be_\bd_\b__\bs_\bt_\br_\be_\ba_\bm_\bs = 0;\n+212 }\n 213\n-_\b2_\b2_\b3 _\bG_\be_\bn_\be_\br_\bi_\bc_\bI_\bt_\be_\br_\ba_\bt_\bo_\br(const _\bC_\bo_\bn_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br& other) : container_(other.container_),\n-position_(other.position_)\n-224 {}\n+_\b2_\b1_\b9 _\bD_\be_\bb_\bu_\bg_\bS_\bt_\br_\be_\ba_\bm (_\bD_\be_\bb_\bu_\bg_\bS_\bt_\br_\be_\ba_\bm_\bS_\bt_\ba_\bt_\be& master,\n+220 std::ostream& fallback = std::cerr)\n+221 {\n+222 // start a new list of streams\n+223 _\bc_\bu_\br_\br_\be_\bn_\bt = new _\bS_\bt_\br_\be_\ba_\bm_\bW_\br_\ba_\bp(fallback);\n+224 _\bc_\bu_\br_\br_\be_\bn_\bt->_\bn_\be_\bx_\bt = 0;\n 225\n-226 // Methods needed by the forward iterator\n-_\b2_\b2_\b7 bool _\be_\bq_\bu_\ba_\bl_\bs(const _\bM_\bu_\bt_\ba_\bb_\bl_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br & other) const\n-228 {\n-229 return position_ == other.position_ && container_ == other.container_;\n-230 }\n-231\n-_\b2_\b3_\b2 bool _\be_\bq_\bu_\ba_\bl_\bs(const _\bC_\bo_\bn_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br & other) const\n-233 {\n-234 return position_ == other.position_ && container_ == other.container_;\n-235 }\n-236\n-_\b2_\b3_\b7 _\bR_\be_\bf_\be_\br_\be_\bn_\bc_\be _\bd_\be_\br_\be_\bf_\be_\br_\be_\bn_\bc_\be() const {\n-238 return container_->operator[](position_);\n-239 }\n-240\n-_\b2_\b4_\b1 void _\bi_\bn_\bc_\br_\be_\bm_\be_\bn_\bt(){\n-242 ++position_;\n-243 }\n-244\n-245 // Additional function needed by BidirectionalIterator\n-_\b2_\b4_\b6 void _\bd_\be_\bc_\br_\be_\bm_\be_\bn_\bt(){\n-247 --position_;\n-248 }\n-249\n-250 // Additional function needed by RandomAccessIterator\n-_\b2_\b5_\b1 _\bR_\be_\bf_\be_\br_\be_\bn_\bc_\be _\be_\bl_\be_\bm_\be_\bn_\bt_\bA_\bt(_\bD_\bi_\bf_\bf_\be_\br_\be_\bn_\bc_\be_\bT_\by_\bp_\be i) const {\n-252 return container_->operator[](position_+i);\n-253 }\n-254\n-_\b2_\b5_\b5 void _\ba_\bd_\bv_\ba_\bn_\bc_\be(_\bD_\bi_\bf_\bf_\be_\br_\be_\bn_\bc_\be_\bT_\by_\bp_\be n){\n-256 position_=position_+n;\n-257 }\n-258\n-_\b2_\b5_\b9 _\bD_\bi_\bf_\bf_\be_\br_\be_\bn_\bc_\be_\bT_\by_\bp_\be _\bd_\bi_\bs_\bt_\ba_\bn_\bc_\be_\bT_\bo(const _\bM_\bu_\bt_\ba_\bb_\bl_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br& other) const\n-260 {\n-261 assert(other.container_==container_);\n-262 return other.position_ - position_;\n+226 // check if we are above the default activation level\n+227 _\b__\ba_\bc_\bt_\bi_\bv_\be = activator::value;\n+228 _\b__\bt_\bi_\be_\bd_\b__\bs_\bt_\br_\be_\ba_\bm_\bs = 0;\n+229\n+230 // tie to the provided stream\n+231 _\b__\bt_\bi_\be_\bd = true;\n+232 tiedstate = &master;\n+233 tiedstate->_\b__\bt_\bi_\be_\bd_\b__\bs_\bt_\br_\be_\ba_\bm_\bs++;\n+234 }\n+235\n+_\b2_\b4_\b3 _\b~_\bD_\be_\bb_\bu_\bg_\bS_\bt_\br_\be_\ba_\bm()\n+244 {\n+245 // untie\n+246 if (_\b__\bt_\bi_\be_\bd)\n+247 tiedstate->_\b__\bt_\bi_\be_\bd_\b__\bs_\bt_\br_\be_\ba_\bm_\bs--;\n+248 else {\n+249 // check if somebody still ties to us...\n+250 if (_\b__\bt_\bi_\be_\bd_\b__\bs_\bt_\br_\be_\ba_\bm_\bs != 0)\n+251 {\n+252 std::cerr << \"DebugStream destructor is called while other streams are\n+still tied to it. Terminating!\" << std::endl;\n+253 std::terminate();\n+254 }\n+255 }\n+256\n+257 // remove ostream-stack\n+258 while (_\bc_\bu_\br_\br_\be_\bn_\bt != 0) {\n+259 _\bS_\bt_\br_\be_\ba_\bm_\bW_\br_\ba_\bp *s = _\bc_\bu_\br_\br_\be_\bn_\bt;\n+260 _\bc_\bu_\br_\br_\be_\bn_\bt = _\bc_\bu_\br_\br_\be_\bn_\bt->_\bn_\be_\bx_\bt;\n+261 delete s;\n+262 }\n 263 }\n 264\n-_\b2_\b6_\b5 _\bD_\bi_\bf_\bf_\be_\br_\be_\bn_\bc_\be_\bT_\by_\bp_\be _\bd_\bi_\bs_\bt_\ba_\bn_\bc_\be_\bT_\bo(const _\bC_\bo_\bn_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br& other) const\n-266 {\n-267 assert(other.container_==container_);\n-268 return other.position_ - position_;\n-269 }\n-270\n-271 private:\n-272 _\bC_\bo_\bn_\bt_\ba_\bi_\bn_\be_\br *container_;\n-273 _\bD_\bi_\bf_\bf_\be_\br_\be_\bn_\bc_\be_\bT_\by_\bp_\be position_;\n-274 };\n-275\n-278} // end namespace Dune\n-279\n-280#endif\n-_\bi_\bt_\be_\br_\ba_\bt_\bo_\br_\bf_\ba_\bc_\ba_\bd_\be_\bs_\b._\bh_\bh\n-This file implements iterator facade classes for writing stl conformant\n-iterators.\n-_\bs_\bt_\bd\n-STL namespace.\n+266 template \n+_\b2_\b6_\b7 _\bD_\be_\bb_\bu_\bg_\bS_\bt_\br_\be_\ba_\bm& _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b<_\b<(const T data) {\n+268 // remove the following code if stream wasn't compiled active\n+269 if (activator::value) {\n+270 if (! _\b__\bt_\bi_\be_\bd) {\n+271 if (_\b__\ba_\bc_\bt_\bi_\bv_\be)\n+272 _\bc_\bu_\br_\br_\be_\bn_\bt->_\bo_\bu_\bt << data;\n+273 } else {\n+274 if (_\b__\ba_\bc_\bt_\bi_\bv_\be && tiedstate->_\b__\ba_\bc_\bt_\bi_\bv_\be)\n+275 tiedstate->_\bc_\bu_\br_\br_\be_\bn_\bt->_\bo_\bu_\bt << data;\n+276 }\n+277 }\n+278\n+279 return *this;\n+280 }\n+281\n+_\b2_\b8_\b9 _\bD_\be_\bb_\bu_\bg_\bS_\bt_\br_\be_\ba_\bm& _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b<_\b<(const int data) {\n+290 // remove the following code if stream wasn't compiled active\n+291 if (activator::value) {\n+292 if (! _\b__\bt_\bi_\be_\bd) {\n+293 if (_\b__\ba_\bc_\bt_\bi_\bv_\be)\n+294 _\bc_\bu_\br_\br_\be_\bn_\bt->_\bo_\bu_\bt << data;\n+295 } else {\n+296 if (_\b__\ba_\bc_\bt_\bi_\bv_\be && tiedstate->_\b__\ba_\bc_\bt_\bi_\bv_\be)\n+297 tiedstate->_\bc_\bu_\br_\br_\be_\bn_\bt->_\bo_\bu_\bt << data;\n+298 }\n+299 }\n+300\n+301 return *this;\n+302 }\n+303\n+_\b3_\b0_\b5 _\bD_\be_\bb_\bu_\bg_\bS_\bt_\br_\be_\ba_\bm& _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b<_\b<(std::ostream& (*f)(std::ostream&)) {\n+306 if (activator::value) {\n+307 if (! _\b__\bt_\bi_\be_\bd) {\n+308 if (_\b__\ba_\bc_\bt_\bi_\bv_\be)\n+309 f(_\bc_\bu_\br_\br_\be_\bn_\bt->_\bo_\bu_\bt);\n+310 } else {\n+311 if (_\b__\ba_\bc_\bt_\bi_\bv_\be && tiedstate->_\b__\ba_\bc_\bt_\bi_\bv_\be)\n+312 f(tiedstate->_\bc_\bu_\br_\br_\be_\bn_\bt->_\bo_\bu_\bt);\n+313 }\n+314 }\n+315\n+316 return *this;\n+317 }\n+318\n+_\b3_\b2_\b0 _\bD_\be_\bb_\bu_\bg_\bS_\bt_\br_\be_\ba_\bm& _\bf_\bl_\bu_\bs_\bh() {\n+321 if (activator::value) {\n+322 if (! _\b__\bt_\bi_\be_\bd) {\n+323 if (_\b__\ba_\bc_\bt_\bi_\bv_\be)\n+324 _\bc_\bu_\br_\br_\be_\bn_\bt->_\bo_\bu_\bt.flush();\n+325 } else {\n+326 if (_\b__\ba_\bc_\bt_\bi_\bv_\be && tiedstate->_\b__\ba_\bc_\bt_\bi_\bv_\be)\n+327 tiedstate->_\bc_\bu_\br_\br_\be_\bn_\bt->_\bo_\bu_\bt.flush();\n+328 }\n+329 }\n+330\n+331 return *this;\n+332 }\n+333\n+_\b3_\b3_\b5 void _\bp_\bu_\bs_\bh(bool b) {\n+336 // are we at all active?\n+337 if (activator::value) {\n+338 _actstack.push(_\b__\ba_\bc_\bt_\bi_\bv_\be);\n+339 _\b__\ba_\bc_\bt_\bi_\bv_\be = b;\n+340 } else {\n+341 // stay off\n+342 _actstack.push(false);\n+343 }\n+344 }\n+345\n+_\b3_\b4_\b9 void _\bp_\bo_\bp() {\n+350 if (_actstack.empty())\n+351 _\bD_\bU_\bN_\bE_\b__\bT_\bH_\bR_\bO_\bW(_\bD_\be_\bb_\bu_\bg_\bS_\bt_\br_\be_\ba_\bm_\bE_\br_\br_\bo_\br, \"No previous activation setting!\");\n+352\n+353 _\b__\ba_\bc_\bt_\bi_\bv_\be = _actstack.top();\n+354 _actstack.pop();\n+355 }\n+356\n+_\b3_\b6_\b3 bool _\ba_\bc_\bt_\bi_\bv_\be() const {\n+364 return activator::value && _\b__\ba_\bc_\bt_\bi_\bv_\be;\n+365 }\n+366\n+_\b3_\b7_\b1 void _\ba_\bt_\bt_\ba_\bc_\bh(std::ostream& stream) {\n+372 if (_\b__\bt_\bi_\be_\bd)\n+373 _\bD_\bU_\bN_\bE_\b__\bT_\bH_\bR_\bO_\bW(_\bD_\be_\bb_\bu_\bg_\bS_\bt_\br_\be_\ba_\bm_\bE_\br_\br_\bo_\br, \"Cannot attach to a tied stream!\");\n+374\n+375 _\bS_\bt_\br_\be_\ba_\bm_\bW_\br_\ba_\bp* newcurr = new _\bS_\bt_\br_\be_\ba_\bm_\bW_\br_\ba_\bp(stream);\n+376 newcurr->_\bn_\be_\bx_\bt = _\bc_\bu_\br_\br_\be_\bn_\bt;\n+377 _\bc_\bu_\br_\br_\be_\bn_\bt = newcurr;\n+378 }\n+379\n+_\b3_\b8_\b3 void _\bd_\be_\bt_\ba_\bc_\bh() {\n+384 if (_\bc_\bu_\br_\br_\be_\bn_\bt->_\bn_\be_\bx_\bt == 0)\n+385 _\bD_\bU_\bN_\bE_\b__\bT_\bH_\bR_\bO_\bW(_\bD_\be_\bb_\bu_\bg_\bS_\bt_\br_\be_\ba_\bm_\bE_\br_\br_\bo_\br, \"Cannot detach initial stream!\");\n+386 if (_\b__\bt_\bi_\be_\bd)\n+387 _\bD_\bU_\bN_\bE_\b__\bT_\bH_\bR_\bO_\bW(_\bD_\be_\bb_\bu_\bg_\bS_\bt_\br_\be_\ba_\bm_\bE_\br_\br_\bo_\br, \"Cannot detach a tied stream!\");\n+388\n+389 _\bS_\bt_\br_\be_\ba_\bm_\bW_\br_\ba_\bp* old = _\bc_\bu_\br_\br_\be_\bn_\bt;\n+390 _\bc_\bu_\br_\br_\be_\bn_\bt = _\bc_\bu_\br_\br_\be_\bn_\bt->_\bn_\be_\bx_\bt;\n+391 delete old;\n+392 }\n+393\n+_\b3_\b9_\b7 void _\bt_\bi_\be(_\bD_\be_\bb_\bu_\bg_\bS_\bt_\br_\be_\ba_\bm_\bS_\bt_\ba_\bt_\be& to) {\n+398 if (to._\b__\bt_\bi_\be_\bd)\n+399 _\bD_\bU_\bN_\bE_\b__\bT_\bH_\bR_\bO_\bW(_\bD_\be_\bb_\bu_\bg_\bS_\bt_\br_\be_\ba_\bm_\bE_\br_\br_\bo_\br, \"Cannot tie to an already tied stream!\");\n+400 if (_\b__\bt_\bi_\be_\bd)\n+401 _\bD_\bU_\bN_\bE_\b__\bT_\bH_\bR_\bO_\bW(_\bD_\be_\bb_\bu_\bg_\bS_\bt_\br_\be_\ba_\bm_\bE_\br_\br_\bo_\br, \"Stream already tied: untie first!\");\n+402\n+403 _\b__\bt_\bi_\be_\bd = true;\n+404 tiedstate = &to;\n+405\n+406 // tell master class\n+407 tiedstate->_\b__\bt_\bi_\be_\bd_\b__\bs_\bt_\br_\be_\ba_\bm_\bs++;\n+408 }\n+409\n+_\b4_\b1_\b3 void _\bu_\bn_\bt_\bi_\be() {\n+414 if(! _\b__\bt_\bi_\be_\bd)\n+415 _\bD_\bU_\bN_\bE_\b__\bT_\bH_\bR_\bO_\bW(_\bD_\be_\bb_\bu_\bg_\bS_\bt_\br_\be_\ba_\bm_\bE_\br_\br_\bo_\br, \"Cannot untie, stream is not tied!\");\n+416\n+417 tiedstate->_\b__\bt_\bi_\be_\bd_\b__\bs_\bt_\br_\be_\ba_\bm_\bs--;\n+418 _\b__\bt_\bi_\be_\bd = false;\n+419 tiedstate = 0;\n+420 }\n+421\n+422 private:\n+424 _\bD_\be_\bb_\bu_\bg_\bS_\bt_\br_\be_\ba_\bm_\bS_\bt_\ba_\bt_\be* tiedstate;\n+425\n+430 std::stack _actstack;\n+431 };\n+432\n+434}\n+435\n+436\n+437#endif\n+_\be_\bx_\bc_\be_\bp_\bt_\bi_\bo_\bn_\bs_\b._\bh_\bh\n+A few common exception classes.\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bt_\br_\be_\ba_\bm_\bW_\br_\ba_\bp_\b:_\b:_\bS_\bt_\br_\be_\ba_\bm_\bW_\br_\ba_\bp\n+StreamWrap(std::ostream &_out)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn debugstream.hh:152\n+_\bD_\bu_\bn_\be_\b:_\b:_\bD_\be_\bb_\bu_\bg_\bS_\bt_\br_\be_\ba_\bm_\b:_\b:_\bD_\be_\bb_\bu_\bg_\bS_\bt_\br_\be_\ba_\bm\n+DebugStream(std::ostream &out=std::cerr)\n+Create a DebugStream and set initial output stream.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn debugstream.hh:199\n+_\bD_\bu_\bn_\be_\b:_\b:_\bD_\be_\bb_\bu_\bg_\bS_\bt_\br_\be_\ba_\bm_\b:_\b:_\bu_\bn_\bt_\bi_\be\n+void untie()\n+Untie stream.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn debugstream.hh:413\n+_\bD_\bu_\bn_\be_\b:_\b:_\bD_\be_\bb_\bu_\bg_\bS_\bt_\br_\be_\ba_\bm_\b:_\b:_\bf_\bl_\bu_\bs_\bh\n+DebugStream & flush()\n+pass on flush to underlying output stream\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn debugstream.hh:320\n+_\bD_\bu_\bn_\be_\b:_\b:_\bD_\be_\bb_\bu_\bg_\bS_\bt_\br_\be_\ba_\bm_\b:_\b:_\ba_\bt_\bt_\ba_\bc_\bh\n+void attach(std::ostream &stream)\n+set output to a different stream.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn debugstream.hh:371\n+_\bD_\bu_\bn_\be_\b:_\b:_\bD_\be_\bb_\bu_\bg_\bS_\bt_\br_\be_\ba_\bm_\b:_\b:_\bd_\be_\bt_\ba_\bc_\bh\n+void detach()\n+detach current output stream and restore to previous stream\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn debugstream.hh:383\n+_\bD_\bu_\bn_\be_\b:_\b:_\bc_\bo_\bm_\bm_\bo_\bn_\b__\bb_\bi_\bt_\bs_\b:_\b:_\bv_\ba_\bl_\bu_\be\n+static constexpr bool value\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn debugstream.hh:143\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bt_\br_\be_\ba_\bm_\bW_\br_\ba_\bp_\b:_\b:_\bo_\bu_\bt\n+std::ostream & out\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn debugstream.hh:153\n+_\bD_\bu_\bn_\be_\b:_\b:_\bD_\be_\bb_\bu_\bg_\bS_\bt_\br_\be_\ba_\bm_\b:_\b:_\bp_\bo_\bp\n+void pop()\n+restore previously set activation flag\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn debugstream.hh:349\n+_\bD_\bu_\bn_\be_\b:_\b:_\bD_\be_\bb_\bu_\bg_\bS_\bt_\br_\be_\ba_\bm_\b:_\b:_\ba_\bc_\bt_\bi_\bv_\be\n+bool active() const\n+reports if this stream will produce output\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn debugstream.hh:363\n+_\bD_\bu_\bn_\be_\b:_\b:_\bD_\be_\bb_\bu_\bg_\bS_\bt_\br_\be_\ba_\bm_\bS_\bt_\ba_\bt_\be_\b:_\b:_\b__\ba_\bc_\bt_\bi_\bv_\be\n+bool _active\n+flag to switch output during runtime\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn debugstream.hh:165\n+_\bD_\bu_\bn_\be_\b:_\b:_\bD_\be_\bb_\bu_\bg_\bS_\bt_\br_\be_\ba_\bm_\bS_\bt_\ba_\bt_\be_\b:_\b:_\b__\bt_\bi_\be_\bd_\b__\bs_\bt_\br_\be_\ba_\bm_\bs\n+unsigned int _tied_streams\n+how many streams are tied to this state\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn debugstream.hh:171\n+_\bD_\bu_\bn_\be_\b:_\b:_\bD_\be_\bb_\bu_\bg_\bS_\bt_\br_\be_\ba_\bm_\b:_\b:_\bt_\bi_\be\n+void tie(DebugStreamState &to)\n+Tie a stream to this one.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn debugstream.hh:397\n+_\bD_\bu_\bn_\be_\b:_\b:_\bD_\be_\bb_\bu_\bg_\bS_\bt_\br_\be_\ba_\bm_\b:_\b:_\bp_\bu_\bs_\bh\n+void push(bool b)\n+set activation flag and store old value\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn debugstream.hh:335\n+_\bD_\bu_\bn_\be_\b:_\b:_\bD_\be_\bb_\bu_\bg_\bL_\be_\bv_\be_\bl\n+unsigned int DebugLevel\n+Type for debug levels.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn debugstream.hh:118\n+_\bD_\bu_\bn_\be_\b:_\b:_\bD_\be_\bb_\bu_\bg_\bS_\bt_\br_\be_\ba_\bm_\bS_\bt_\ba_\bt_\be_\b:_\b:_\b__\bt_\bi_\be_\bd\n+bool _tied\n+are we tied to another DebugStream?\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn debugstream.hh:168\n+_\bD_\bu_\bn_\be_\b:_\b:_\bD_\be_\bb_\bu_\bg_\bS_\bt_\br_\be_\ba_\bm_\bS_\bt_\ba_\bt_\be_\b:_\b:_\bc_\bu_\br_\br_\be_\bn_\bt\n+StreamWrap * current\n+current output stream and link to possibly pushed old output streams\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn debugstream.hh:162\n+_\bD_\bu_\bn_\be_\b:_\b:_\bD_\be_\bb_\bu_\bg_\bS_\bt_\br_\be_\ba_\bm_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b<_\b<\n+DebugStream & operator<<(const T data)\n+Generic types are passed on to current output stream.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn debugstream.hh:267\n+_\bD_\bu_\bn_\be_\b:_\b:_\bg_\br_\be_\ba_\bt_\be_\br_\b__\bo_\br_\b__\be_\bq_\bu_\ba_\bl_\b:_\b:_\bv_\ba_\bl_\bu_\be\n+static constexpr bool value\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn debugstream.hh:131\n+_\bD_\bu_\bn_\be_\b:_\b:_\bD_\be_\bb_\bu_\bg_\bS_\bt_\br_\be_\ba_\bm_\b:_\b:_\b~_\bD_\be_\bb_\bu_\bg_\bS_\bt_\br_\be_\ba_\bm\n+~DebugStream()\n+Destroy stream.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn debugstream.hh:243\n+_\bD_\bu_\bn_\be_\b:_\b:_\bD_\be_\bb_\bu_\bg_\bS_\bt_\br_\be_\ba_\bm_\b:_\b:_\bD_\be_\bb_\bu_\bg_\bS_\bt_\br_\be_\ba_\bm\n+DebugStream(DebugStreamState &master, std::ostream &fallback=std::cerr)\n+Create a DebugStream and directly tie to another DebugStream.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn debugstream.hh:219\n+_\bD_\bu_\bn_\be_\b:_\b:_\bD_\be_\bb_\bu_\bg_\bS_\bt_\br_\be_\ba_\bm_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b<_\b<\n+DebugStream & operator<<(const int data)\n+explicit specialization so that enums can be printed\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn debugstream.hh:289\n+_\bD_\bu_\bn_\be_\b:_\b:_\bD_\be_\bb_\bu_\bg_\bS_\bt_\br_\be_\ba_\bm_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b<_\b<\n+DebugStream & operator<<(std::ostream &(*f)(std::ostream &))\n+pass on manipulators to underlying output stream\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn debugstream.hh:305\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bt_\br_\be_\ba_\bm_\bW_\br_\ba_\bp_\b:_\b:_\bn_\be_\bx_\bt\n+StreamWrap * next\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn debugstream.hh:154\n+_\bD_\bU_\bN_\bE_\b__\bT_\bH_\bR_\bO_\bW\n+#define DUNE_THROW(E, m)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn exceptions.hh:218\n _\bD_\bu_\bn_\be\n Dune namespace.\n D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn alignedallocator.hh:13\n-_\bD_\bu_\bn_\be_\b:_\b:_\bc_\bo_\bn_\bs_\bt_\b__\br_\be_\bf_\be_\br_\be_\bn_\bc_\be\n-Get the 'const' version of a reference to a mutable object.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn genericiterator.hh:87\n-_\bD_\bu_\bn_\be_\b:_\b:_\bc_\bo_\bn_\bs_\bt_\b__\br_\be_\bf_\be_\br_\be_\bn_\bc_\be_\b:_\b:_\bt_\by_\bp_\be\n-const R type\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn genericiterator.hh:88\n-_\bD_\bu_\bn_\be_\b:_\b:_\bc_\bo_\bn_\bs_\bt_\b__\br_\be_\bf_\be_\br_\be_\bn_\bc_\be_\b<_\b _\bc_\bo_\bn_\bs_\bt_\b _\bR_\b _\b>_\b:_\b:_\bt_\by_\bp_\be\n-const R type\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn genericiterator.hh:94\n-_\bD_\bu_\bn_\be_\b:_\b:_\bc_\bo_\bn_\bs_\bt_\b__\br_\be_\bf_\be_\br_\be_\bn_\bc_\be_\b<_\b _\bR_\b _\b&_\b _\b>_\b:_\b:_\bt_\by_\bp_\be\n-const R & type\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn genericiterator.hh:100\n-_\bD_\bu_\bn_\be_\b:_\b:_\bc_\bo_\bn_\bs_\bt_\b__\br_\be_\bf_\be_\br_\be_\bn_\bc_\be_\b<_\b _\bc_\bo_\bn_\bs_\bt_\b _\bR_\b _\b&_\b _\b>_\b:_\b:_\bt_\by_\bp_\be\n-const R & type\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn genericiterator.hh:106\n-_\bD_\bu_\bn_\be_\b:_\b:_\bm_\bu_\bt_\ba_\bb_\bl_\be_\b__\br_\be_\bf_\be_\br_\be_\bn_\bc_\be\n-get the 'mutable' version of a reference to a const object\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn genericiterator.hh:116\n-_\bD_\bu_\bn_\be_\b:_\b:_\bm_\bu_\bt_\ba_\bb_\bl_\be_\b__\br_\be_\bf_\be_\br_\be_\bn_\bc_\be_\b:_\b:_\bt_\by_\bp_\be\n-R type\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn genericiterator.hh:117\n-_\bD_\bu_\bn_\be_\b:_\b:_\bm_\bu_\bt_\ba_\bb_\bl_\be_\b__\br_\be_\bf_\be_\br_\be_\bn_\bc_\be_\b<_\b _\bc_\bo_\bn_\bs_\bt_\b _\bR_\b _\b>_\b:_\b:_\bt_\by_\bp_\be\n-R type\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn genericiterator.hh:123\n-_\bD_\bu_\bn_\be_\b:_\b:_\bm_\bu_\bt_\ba_\bb_\bl_\be_\b__\br_\be_\bf_\be_\br_\be_\bn_\bc_\be_\b<_\b _\bR_\b _\b&_\b _\b>_\b:_\b:_\bt_\by_\bp_\be\n-R & type\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn genericiterator.hh:129\n-_\bD_\bu_\bn_\be_\b:_\b:_\bG_\be_\bn_\be_\br_\bi_\bc_\bI_\bt_\be_\br_\ba_\bt_\bo_\br\n-Generic class for stl-conforming iterators for container classes with operator\n-[].\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn genericiterator.hh:153\n-_\bD_\bu_\bn_\be_\b:_\b:_\bG_\be_\bn_\be_\br_\bi_\bc_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\bG_\be_\bn_\be_\br_\bi_\bc_\bI_\bt_\be_\br_\ba_\bt_\bo_\br\n-GenericIterator(const MutableIterator &other)\n-Copy constructor.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn genericiterator.hh:211\n-_\bD_\bu_\bn_\be_\b:_\b:_\bG_\be_\bn_\be_\br_\bi_\bc_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\be_\bq_\bu_\ba_\bl_\bs\n-bool equals(const MutableIterator &other) const\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn genericiterator.hh:227\n-_\bD_\bu_\bn_\be_\b:_\b:_\bG_\be_\bn_\be_\br_\bi_\bc_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\be_\bl_\be_\bm_\be_\bn_\bt_\bA_\bt\n-Reference elementAt(DifferenceType i) const\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn genericiterator.hh:251\n-_\bD_\bu_\bn_\be_\b:_\b:_\bG_\be_\bn_\be_\br_\bi_\bc_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\bi_\bn_\bc_\br_\be_\bm_\be_\bn_\bt\n-void increment()\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn genericiterator.hh:241\n-_\bD_\bu_\bn_\be_\b:_\b:_\bG_\be_\bn_\be_\br_\bi_\bc_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\bG_\be_\bn_\be_\br_\bi_\bc_\bI_\bt_\be_\br_\ba_\bt_\bo_\br\n-GenericIterator(const ConstIterator &other)\n-Copy constructor.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn genericiterator.hh:223\n-_\bD_\bu_\bn_\be_\b:_\b:_\bG_\be_\bn_\be_\br_\bi_\bc_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\ba_\bd_\bv_\ba_\bn_\bc_\be\n-void advance(DifferenceType n)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn genericiterator.hh:255\n-_\bD_\bu_\bn_\be_\b:_\b:_\bG_\be_\bn_\be_\br_\bi_\bc_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\bG_\be_\bn_\be_\br_\bi_\bc_\bI_\bt_\be_\br_\ba_\bt_\bo_\br\n-GenericIterator(Container &cont, DifferenceType pos)\n-Constructor.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn genericiterator.hh:200\n-_\bD_\bu_\bn_\be_\b:_\b:_\bG_\be_\bn_\be_\br_\bi_\bc_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\bD_\bi_\bf_\bf_\be_\br_\be_\bn_\bc_\be_\bT_\by_\bp_\be\n-D DifferenceType\n-The type of the difference between two positions.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn genericiterator.hh:182\n-_\bD_\bu_\bn_\be_\b:_\b:_\bG_\be_\bn_\be_\br_\bi_\bc_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\bR_\be_\bf_\be_\br_\be_\bn_\bc_\be\n-R Reference\n-The type of the reference to the values accessed.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn genericiterator.hh:187\n-_\bD_\bu_\bn_\be_\b:_\b:_\bG_\be_\bn_\be_\br_\bi_\bc_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\bd_\bi_\bs_\bt_\ba_\bn_\bc_\be_\bT_\bo\n-DifferenceType distanceTo(const MutableIterator &other) const\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn genericiterator.hh:259\n-_\bD_\bu_\bn_\be_\b:_\b:_\bG_\be_\bn_\be_\br_\bi_\bc_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\bC_\bo_\bn_\bt_\ba_\bi_\bn_\be_\br\n-C Container\n-The type of container we are an iterator for.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn genericiterator.hh:170\n-_\bD_\bu_\bn_\be_\b:_\b:_\bG_\be_\bn_\be_\br_\bi_\bc_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\bV_\ba_\bl_\bu_\be\n-T Value\n-The value type of the iterator.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn genericiterator.hh:177\n-_\bD_\bu_\bn_\be_\b:_\b:_\bG_\be_\bn_\be_\br_\bi_\bc_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\bd_\bi_\bs_\bt_\ba_\bn_\bc_\be_\bT_\bo\n-DifferenceType distanceTo(const ConstIterator &other) const\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn genericiterator.hh:265\n-_\bD_\bu_\bn_\be_\b:_\b:_\bG_\be_\bn_\be_\br_\bi_\bc_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\bd_\be_\bc_\br_\be_\bm_\be_\bn_\bt\n-void decrement()\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn genericiterator.hh:246\n-_\bD_\bu_\bn_\be_\b:_\b:_\bG_\be_\bn_\be_\br_\bi_\bc_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\bd_\be_\br_\be_\bf_\be_\br_\be_\bn_\bc_\be\n-Reference dereference() const\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn genericiterator.hh:237\n-_\bD_\bu_\bn_\be_\b:_\b:_\bG_\be_\bn_\be_\br_\bi_\bc_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\be_\bq_\bu_\ba_\bl_\bs\n-bool equals(const ConstIterator &other) const\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn genericiterator.hh:232\n-_\bD_\bu_\bn_\be_\b:_\b:_\bR_\ba_\bn_\bd_\bo_\bm_\bA_\bc_\bc_\be_\bs_\bs_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bF_\ba_\bc_\ba_\bd_\be\n-Base class for stl conformant forward iterators.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn iteratorfacades.hh:435\n-_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bF_\ba_\bc_\ba_\bd_\be\n-CRTP-Mixing class for stl conformant iterators of given iterator category.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn iteratorfacades.hh:1053\n+_\bD_\bu_\bn_\be_\b:_\b:_\bg_\br_\be_\ba_\bt_\be_\br_\b__\bo_\br_\b__\be_\bq_\bu_\ba_\bl\n+Greater or equal template test.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn debugstream.hh:130\n+_\bD_\bu_\bn_\be_\b:_\b:_\bc_\bo_\bm_\bm_\bo_\bn_\b__\bb_\bi_\bt_\bs\n+activate if current and mask have common bits switched on.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn debugstream.hh:142\n+_\bD_\bu_\bn_\be_\b:_\b:_\bD_\be_\bb_\bu_\bg_\bS_\bt_\br_\be_\ba_\bm_\bE_\br_\br_\bo_\br\n+standard exception for the debugstream\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn debugstream.hh:148\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bt_\br_\be_\ba_\bm_\bW_\br_\ba_\bp\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn debugstream.hh:150\n+_\bD_\bu_\bn_\be_\b:_\b:_\bD_\be_\bb_\bu_\bg_\bS_\bt_\br_\be_\ba_\bm_\bS_\bt_\ba_\bt_\be\n+Intermediate class to implement tie-operation of DebugStream.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn debugstream.hh:158\n+_\bD_\bu_\bn_\be_\b:_\b:_\bD_\be_\bb_\bu_\bg_\bS_\bt_\br_\be_\ba_\bm\n+Generic class to implement debug output streams.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn debugstream.hh:192\n+_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bO_\bE_\br_\br_\bo_\br\n+Default exception class for I/O errors.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn exceptions.hh:231\n ===============================================================================\n Generated by\u00a0_\b[_\bd_\bo_\bx_\by_\bg_\be_\bn_\b] 1.9.8\n"}]}, {"source1": "./usr/share/doc/libdune-common-doc/doxygen/a00107.html", "source2": "./usr/share/doc/libdune-common-doc/doxygen/a00107.html", "unified_diff": "@@ -1,15 +1,15 @@\n \n \n \n \n \n \n \n-dune-common: iteratorrange.hh File Reference\n+dune-common: copyableoptional.hh File Reference\n \n \n \n \n \n \n \n@@ -72,24 +72,30 @@\n
  • dune
  • common
  • \n
    \n
    \n
    \n \n-
    iteratorrange.hh File Reference
    \n+
    copyableoptional.hh File Reference
    \n
    \n
    \n-\n+
    #include <cassert>
    \n+#include <iostream>
    \n+#include <memory>
    \n+#include <optional>
    \n+#include <type_traits>
    \n+#include <dune/common/typeutilities.hh>
    \n+
    \n

    Go to the source code of this file.

    \n \n \n-\n-\n+\n+\n \n

    \n Classes

    class  Dune::IteratorRange< Iterator >
     Simple range between a begin and an end iterator. More...
    class  Dune::CopyableOptional< Type >
     A copyable type wrapper that provides copy/move assignment operations for types that are only copy/move constructible. More...
     
    \n \n \n \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,19 +1,26 @@\n dune-common\u00a02.10\n Loading...\n Searching...\n No Matches\n * _\bd_\bu_\bn_\be\n * _\bc_\bo_\bm_\bm_\bo_\bn\n _\bC_\bl_\ba_\bs_\bs_\be_\bs | _\bN_\ba_\bm_\be_\bs_\bp_\ba_\bc_\be_\bs\n-iteratorrange.hh File Reference\n+copyableoptional.hh File Reference\n+#include \n+#include \n+#include \n+#include \n+#include \n+#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bt_\by_\bp_\be_\bu_\bt_\bi_\bl_\bi_\bt_\bi_\be_\bs_\b._\bh_\bh>\n _\bG_\bo_\b _\bt_\bo_\b _\bt_\bh_\be_\b _\bs_\bo_\bu_\br_\bc_\be_\b _\bc_\bo_\bd_\be_\b _\bo_\bf_\b _\bt_\bh_\bi_\bs_\b _\bf_\bi_\bl_\be_\b.\n C\bCl\bla\bas\bss\bse\bes\bs\n-class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bR_\ba_\bn_\bg_\be_\b<_\b _\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b _\b>\n-\u00a0 Simple range between a begin and an end iterator. _\bM_\bo_\br_\be_\b._\b._\b.\n+class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bp_\by_\ba_\bb_\bl_\be_\bO_\bp_\bt_\bi_\bo_\bn_\ba_\bl_\b<_\b _\bT_\by_\bp_\be_\b _\b>\n+\u00a0 A copyable type wrapper that provides copy/move assignment operations\n+ for types that are only copy/move constructible. _\bM_\bo_\br_\be_\b._\b._\b.\n \u00a0\n N\bNa\bam\bme\bes\bsp\bpa\bac\bce\bes\bs\n namespace \u00a0 _\bD_\bu_\bn_\be\n \u00a0 _\bD_\bu_\bn_\be namespace.\n \u00a0\n ===============================================================================\n Generated by\u00a0_\b[_\bd_\bo_\bx_\by_\bg_\be_\bn_\b] 1.9.8\n"}]}, {"source1": "./usr/share/doc/libdune-common-doc/doxygen/a00107_source.html", "source2": "./usr/share/doc/libdune-common-doc/doxygen/a00107_source.html", "unified_diff": "@@ -1,15 +1,15 @@\n \n \n \n \n \n \n \n-dune-common: iteratorrange.hh Source File\n+dune-common: copyableoptional.hh Source File\n \n \n \n \n \n \n \n@@ -74,84 +74,169 @@\n \n
    \n \n
    \n \n
    \n-
    iteratorrange.hh
    \n+
    copyableoptional.hh
    \n
    \n
    \n Go to the documentation of this file.
    1// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
    \n
    2// vi: set et ts=4 sw=2 sts=2:
    \n
    3// SPDX-FileCopyrightInfo: Copyright \u00a9 DUNE Project contributors, see file LICENSE.md in module root
    \n
    4// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception
    \n-
    5#ifndef DUNE_COMMON_ITERATORRANGE_HH
    \n-
    6#define DUNE_COMMON_ITERATORRANGE_HH
    \n+
    5#ifndef DUNE_COMMON_COPYABLE_OPTIONAL_HH
    \n+
    6#define DUNE_COMMON_COPYABLE_OPTIONAL_HH
    \n
    7
    \n-
    8namespace Dune {
    \n-
    9
    \n-
    11
    \n-
    20 template<typename Iterator>
    \n-
    \n-\n-
    22 {
    \n-
    23
    \n-
    24 public:
    \n-
    25
    \n-
    27 typedef Iterator iterator;
    \n-
    28
    \n-
    30
    \n-
    33 typedef Iterator const_iterator;
    \n-
    34
    \n-
    \n-
    36 IteratorRange(const Iterator& begin, const Iterator& end)
    \n-
    37 : _begin(begin)
    \n-
    38 , _end(end)
    \n-
    39 {}
    \n-
    \n+
    8#include <cassert>
    \n+
    9#include <iostream>
    \n+
    10#include <memory>
    \n+
    11#include <optional>
    \n+
    12#include <type_traits>
    \n+
    13
    \n+\n+
    15
    \n+
    16namespace Dune {
    \n+
    17
    \n+
    32template <class Type>
    \n+
    \n+\n+
    34 : public std::optional<Type>
    \n+
    35{
    \n+
    36 static_assert(std::is_copy_constructible_v<Type>);
    \n+
    37 static_assert(std::is_object_v<Type>);
    \n+
    38
    \n+
    39 using Base = std::optional<Type>;
    \n
    40
    \n-
    \n-\n-
    43 {}
    \n-
    \n-
    44
    \n-
    \n-\n-
    47 {
    \n-
    48 return _begin;
    \n-
    49 }
    \n-
    \n-
    50
    \n-
    \n-
    52 iterator end() const
    \n-
    53 {
    \n-
    54 return _end;
    \n-
    55 }
    \n-
    \n-
    56
    \n-
    57 private:
    \n-
    58
    \n-
    59 Iterator _begin;
    \n-
    60 Iterator _end;
    \n-
    61
    \n-
    62 };
    \n-
    \n-
    63
    \n-
    64}
    \n-
    65
    \n-
    66#endif // DUNE_COMMON_ITERATORRANGE_HH
    \n+
    41public:
    \n+
    42
    \n+
    47 template <class T = Type,
    \n+
    48 std::enable_if_t<std::is_default_constructible_v<T>, int> = 0>
    \n+
    \n+
    49 constexpr CopyableOptional ()
    \n+
    50 noexcept(std::is_nothrow_default_constructible_v<T>)
    \n+
    51 : Base{std::in_place}
    \n+
    52 {}
    \n+
    \n+
    53
    \n+
    58 template <class T = Type,
    \n+
    59 disableCopyMove<CopyableOptional,T> = 0,
    \n+
    60 std::enable_if_t<std::is_constructible_v<Type,T&&>, int> = 0,
    \n+
    61 std::enable_if_t<std::is_convertible_v<T&&,Type>, int> = 0>
    \n+
    \n+
    62 constexpr CopyableOptional (T&& value)
    \n+
    63 noexcept(std::is_nothrow_constructible_v<Type,T&&>)
    \n+
    64 : Base{std::in_place, std::forward<T>(value)}
    \n+
    65 {}
    \n+
    \n+
    66
    \n+
    71 template <class T = Type,
    \n+\n+
    73 std::enable_if_t<std::is_constructible_v<Type,T&&>, int> = 0,
    \n+
    74 std::enable_if_t<not std::is_convertible_v<T&&,Type>, int> = 0>
    \n+
    \n+
    75 explicit constexpr CopyableOptional (T&& value)
    \n+
    76 noexcept(std::is_nothrow_constructible_v<Type,T&&>)
    \n+
    77 : Base{std::in_place, std::forward<T>(value)}
    \n+
    78 {}
    \n+
    \n+
    79
    \n+
    81 template <class... Args,
    \n+\n+
    83 std::enable_if_t<(sizeof...(Args) > 1), int> = 0,
    \n+
    84 std::enable_if_t<std::is_constructible_v<Type,Args&&...>, int> = 0>
    \n+
    \n+
    85 constexpr CopyableOptional (Args&&... args)
    \n+
    86 noexcept(std::is_nothrow_constructible_v<Type,Args&&...>)
    \n+
    87 : Base{std::in_place, std::forward<Args>(args)...}
    \n+
    88 {}
    \n+
    \n+
    89
    \n+
    91 constexpr CopyableOptional (const CopyableOptional&) = default;
    \n+
    92
    \n+
    94 constexpr CopyableOptional (CopyableOptional&&) = default;
    \n+
    95
    \n+
    97 ~CopyableOptional () = default;
    \n+
    98
    \n+
    \n+\n+
    101 noexcept(std::is_nothrow_copy_assignable_v<Type> ||
    \n+
    102 (!std::is_copy_assignable_v<Type> && std::is_nothrow_copy_constructible_v<Type>))
    \n+
    103 {
    \n+
    104 if constexpr(std::is_copy_assignable_v<Type>)
    \n+
    105 Base::operator=(that);
    \n+
    106 else {
    \n+
    107 // no self-assignment
    \n+
    108 if (this != std::addressof(that)) {
    \n+
    109 if (that)
    \n+
    110 Base::emplace(*that);
    \n+
    111 else
    \n+
    112 Base::reset();
    \n+
    113 }
    \n+
    114 }
    \n+
    115 return *this;
    \n+
    116 }
    \n+
    \n+
    117
    \n+
    119 template <class T = Type,
    \n+
    120 std::enable_if_t<std::is_move_constructible_v<T>, int> = 0>
    \n+
    \n+\n+
    122 noexcept(std::is_nothrow_move_assignable_v<Type> ||
    \n+
    123 (!std::is_move_assignable_v<Type> && std::is_nothrow_move_constructible_v<Type>))
    \n+
    124 {
    \n+
    125 if constexpr(std::is_move_assignable_v<Type>)
    \n+
    126 Base::operator=(std::move(that));
    \n+
    127 else {
    \n+
    128 // no self-assignment
    \n+
    129 if (this != std::addressof(that)) {
    \n+
    130 if (that)
    \n+
    131 Base::emplace(std::move(*that));
    \n+
    132 else
    \n+
    133 Base::reset();
    \n+
    134 }
    \n+
    135 }
    \n+
    136 return *this;
    \n+
    137 }
    \n+
    \n+
    138
    \n+
    140 template <class T = Type,
    \n+
    141 std::enable_if_t<not std::is_same_v<std::decay_t<T>, CopyableOptional>, int> = 0,
    \n+
    142 std::enable_if_t<(std::is_assignable_v<Type&,T> || std::is_constructible_v<Type,T>), int> = 0>
    \n+
    \n+
    143 constexpr CopyableOptional& operator= (T&& value)
    \n+
    144 noexcept(std::is_nothrow_assignable_v<Type&,T> ||
    \n+
    145 (!std::is_assignable_v<Type&,T> && std::is_nothrow_constructible_v<Type,T>))
    \n+
    146 {
    \n+
    147 if constexpr(std::is_assignable_v<Type&,T>)
    \n+
    148 Base::operator=(std::forward<T>(value));
    \n+
    149 else
    \n+
    150 Base::emplace(std::forward<T>(value));
    \n+
    151 return *this;
    \n+
    152 }
    \n+
    \n+
    153};
    \n+
    \n+
    154
    \n+
    155} // end namespace Dune
    \n+
    156
    \n+
    157#endif // DUNE_COMMON_COPYABLE_OPTIONAL_HH
    \n+
    Utilities for type computations, constraining overloads, ...
    \n+
    std::enable_if_t< not Impl::disableCopyMoveHelper< This, T... >::value, int > disableCopyMove
    Helper to disable constructor as copy and move constructor.
    Definition typeutilities.hh:45
    \n+
    STL namespace.
    \n
    Dune namespace.
    Definition alignedallocator.hh:13
    \n-
    Simple range between a begin and an end iterator.
    Definition iteratorrange.hh:22
    \n-
    iterator begin() const
    Returns an iterator pointing to the begin of the range.
    Definition iteratorrange.hh:46
    \n-
    Iterator const_iterator
    The iterator belonging to this range.
    Definition iteratorrange.hh:33
    \n-
    iterator end() const
    Returns an iterator pointing past the end of the range.
    Definition iteratorrange.hh:52
    \n-
    IteratorRange()
    Default constructor, relies on iterators being default-constructible.
    Definition iteratorrange.hh:42
    \n-
    Iterator iterator
    The iterator belonging to this range.
    Definition iteratorrange.hh:27
    \n-
    IteratorRange(const Iterator &begin, const Iterator &end)
    Constructs an iterator range on [begin,end).
    Definition iteratorrange.hh:36
    \n+
    A copyable type wrapper that provides copy/move assignment operations for types that are only copy/mo...
    Definition copyableoptional.hh:35
    \n+
    constexpr CopyableOptional(CopyableOptional &&)=default
    Move construct the contained value.
    \n+
    constexpr CopyableOptional(T &&value) noexcept(std::is_nothrow_constructible_v< Type, T && >)
    Construct the internal data from perfect forwarding of the passed arguments. Participates in overload...
    Definition copyableoptional.hh:62
    \n+
    constexpr CopyableOptional & operator=(const CopyableOptional &that) noexcept(std::is_nothrow_copy_assignable_v< Type >||(!std::is_copy_assignable_v< Type > &&std::is_nothrow_copy_constructible_v< Type >))
    Copy assignment in terms of copy constructor.
    Definition copyableoptional.hh:100
    \n+
    constexpr CopyableOptional() noexcept(std::is_nothrow_default_constructible_v< T >)
    Implementation of a default constructor, if the Type is itself default constructible....
    Definition copyableoptional.hh:49
    \n+
    constexpr CopyableOptional(const CopyableOptional &)=default
    Copy construct the contained value.
    \n+
    constexpr CopyableOptional(Args &&... args) noexcept(std::is_nothrow_constructible_v< Type, Args &&... >)
    Construct the internal data from perfect forwarding of the passed arguments.
    Definition copyableoptional.hh:85
    \n+
    ~CopyableOptional()=default
    Default destructor.
    \n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,90 +1,188 @@\n dune-common\u00a02.10\n Loading...\n Searching...\n No Matches\n * _\bd_\bu_\bn_\be\n * _\bc_\bo_\bm_\bm_\bo_\bn\n-iteratorrange.hh\n+copyableoptional.hh\n _\bG_\bo_\b _\bt_\bo_\b _\bt_\bh_\be_\b _\bd_\bo_\bc_\bu_\bm_\be_\bn_\bt_\ba_\bt_\bi_\bo_\bn_\b _\bo_\bf_\b _\bt_\bh_\bi_\bs_\b _\bf_\bi_\bl_\be_\b.\n 1// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-\n 2// vi: set et ts=4 sw=2 sts=2:\n 3// SPDX-FileCopyrightInfo: Copyright \u00c2\u00a9 DUNE Project contributors, see file\n LICENSE.md in module root\n 4// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception\n-5#ifndef DUNE_COMMON_ITERATORRANGE_HH\n-6#define DUNE_COMMON_ITERATORRANGE_HH\n+5#ifndef DUNE_COMMON_COPYABLE_OPTIONAL_HH\n+6#define DUNE_COMMON_COPYABLE_OPTIONAL_HH\n 7\n-8namespace _\bD_\bu_\bn_\be {\n-9\n-11\n-20 template\n-_\b2_\b1 class _\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bR_\ba_\bn_\bg_\be\n-22 {\n-23\n-24 public:\n-25\n-_\b2_\b7 typedef Iterator _\bi_\bt_\be_\br_\ba_\bt_\bo_\br;\n-28\n-30\n-_\b3_\b3 typedef Iterator _\bc_\bo_\bn_\bs_\bt_\b__\bi_\bt_\be_\br_\ba_\bt_\bo_\br;\n-34\n-_\b3_\b6 _\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bR_\ba_\bn_\bg_\be(const Iterator& _\bb_\be_\bg_\bi_\bn, const Iterator& _\be_\bn_\bd)\n-37 : _begin(_\bb_\be_\bg_\bi_\bn)\n-38 , _end(_\be_\bn_\bd)\n-39 {}\n+8#include \n+9#include \n+10#include \n+11#include \n+12#include \n+13\n+14#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bt_\by_\bp_\be_\bu_\bt_\bi_\bl_\bi_\bt_\bi_\be_\bs_\b._\bh_\bh>\n+15\n+16namespace _\bD_\bu_\bn_\be {\n+17\n+32template \n+_\b3_\b3class _\bC_\bo_\bp_\by_\ba_\bb_\bl_\be_\bO_\bp_\bt_\bi_\bo_\bn_\ba_\bl\n+34 : public std::optional\n+35{\n+36 static_assert(std::is_copy_constructible_v);\n+37 static_assert(std::is_object_v);\n+38\n+39 using Base = std::optional;\n 40\n-_\b4_\b2 _\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bR_\ba_\bn_\bg_\be()\n-43 {}\n-44\n-_\b4_\b6 _\bi_\bt_\be_\br_\ba_\bt_\bo_\br _\bb_\be_\bg_\bi_\bn() const\n-47 {\n-48 return _begin;\n-49 }\n-50\n-_\b5_\b2 _\bi_\bt_\be_\br_\ba_\bt_\bo_\br _\be_\bn_\bd() const\n-53 {\n-54 return _end;\n-55 }\n-56\n-57 private:\n-58\n-59 Iterator _begin;\n-60 Iterator _end;\n-61\n-62 };\n-63\n-64}\n-65\n-66#endif // DUNE_COMMON_ITERATORRANGE_HH\n+41public:\n+42\n+47 template , int> = 0>\n+_\b4_\b9 constexpr _\bC_\bo_\bp_\by_\ba_\bb_\bl_\be_\bO_\bp_\bt_\bi_\bo_\bn_\ba_\bl ()\n+50 noexcept(_\bs_\bt_\bd::is_nothrow_default_constructible_v)\n+51 : Base{std::in_place}\n+52 {}\n+53\n+58 template = 0,\n+60 std::enable_if_t, int> = 0,\n+61 std::enable_if_t, int> = 0>\n+_\b6_\b2 constexpr _\bC_\bo_\bp_\by_\ba_\bb_\bl_\be_\bO_\bp_\bt_\bi_\bo_\bn_\ba_\bl (T&& value)\n+63 noexcept(std::is_nothrow_constructible_v)\n+64 : Base{_\bs_\bt_\bd::in_place, _\bs_\bt_\bd::forward(value)}\n+65 {}\n+66\n+71 template = 0,\n+73 std::enable_if_t, int> = 0,\n+74 std::enable_if_t, int> = 0>\n+_\b7_\b5 explicit constexpr _\bC_\bo_\bp_\by_\ba_\bb_\bl_\be_\bO_\bp_\bt_\bi_\bo_\bn_\ba_\bl (T&& value)\n+76 noexcept(std::is_nothrow_constructible_v)\n+77 : Base{_\bs_\bt_\bd::in_place, _\bs_\bt_\bd::forward(value)}\n+78 {}\n+79\n+81 template = 0,\n+83 std::enable_if_t<(sizeof...(Args) > 1), int> = 0,\n+84 std::enable_if_t, int> = 0>\n+_\b8_\b5 constexpr _\bC_\bo_\bp_\by_\ba_\bb_\bl_\be_\bO_\bp_\bt_\bi_\bo_\bn_\ba_\bl (Args&&... args)\n+86 noexcept(std::is_nothrow_constructible_v)\n+87 : Base{_\bs_\bt_\bd::in_place, _\bs_\bt_\bd::forward(args)...}\n+88 {}\n+89\n+_\b9_\b1 constexpr _\bC_\bo_\bp_\by_\ba_\bb_\bl_\be_\bO_\bp_\bt_\bi_\bo_\bn_\ba_\bl (const _\bC_\bo_\bp_\by_\ba_\bb_\bl_\be_\bO_\bp_\bt_\bi_\bo_\bn_\ba_\bl&) = default;\n+92\n+_\b9_\b4 constexpr _\bC_\bo_\bp_\by_\ba_\bb_\bl_\be_\bO_\bp_\bt_\bi_\bo_\bn_\ba_\bl (_\bC_\bo_\bp_\by_\ba_\bb_\bl_\be_\bO_\bp_\bt_\bi_\bo_\bn_\ba_\bl&&) = default;\n+95\n+_\b9_\b7 _\b~_\bC_\bo_\bp_\by_\ba_\bb_\bl_\be_\bO_\bp_\bt_\bi_\bo_\bn_\ba_\bl () = default;\n+98\n+_\b1_\b0_\b0 constexpr _\bC_\bo_\bp_\by_\ba_\bb_\bl_\be_\bO_\bp_\bt_\bi_\bo_\bn_\ba_\bl& _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b=_\b (const _\bC_\bo_\bp_\by_\ba_\bb_\bl_\be_\bO_\bp_\bt_\bi_\bo_\bn_\ba_\bl& that)\n+101 noexcept(std::is_nothrow_copy_assignable_v ||\n+102 (!std::is_copy_assignable_v && std::\n+is_nothrow_copy_constructible_v))\n+103 {\n+104 if constexpr(std::is_copy_assignable_v)\n+105 Base::operator=(that);\n+106 else {\n+107 // no self-assignment\n+108 if (this != std::addressof(that)) {\n+109 if (that)\n+110 Base::emplace(*that);\n+111 else\n+112 Base::reset();\n+113 }\n+114 }\n+115 return *this;\n+116 }\n+117\n+119 template , int> = 0>\n+_\b1_\b2_\b1 constexpr _\bC_\bo_\bp_\by_\ba_\bb_\bl_\be_\bO_\bp_\bt_\bi_\bo_\bn_\ba_\bl& _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b=_\b (_\bC_\bo_\bp_\by_\ba_\bb_\bl_\be_\bO_\bp_\bt_\bi_\bo_\bn_\ba_\bl&& that)\n+122 noexcept(std::is_nothrow_move_assignable_v ||\n+123 (!std::is_move_assignable_v && std::\n+is_nothrow_move_constructible_v))\n+124 {\n+125 if constexpr(std::is_move_assignable_v)\n+126 Base::operator=(std::move(that));\n+127 else {\n+128 // no self-assignment\n+129 if (this != std::addressof(that)) {\n+130 if (that)\n+131 Base::emplace(std::move(*that));\n+132 else\n+133 Base::reset();\n+134 }\n+135 }\n+136 return *this;\n+137 }\n+138\n+140 template , _\bC_\bo_\bp_\by_\ba_\bb_\bl_\be_\bO_\bp_\bt_\bi_\bo_\bn_\ba_\bl>,\n+int> = 0,\n+142 std::enable_if_t<(std::is_assignable_v || std::\n+is_constructible_v), int> = 0>\n+_\b1_\b4_\b3 constexpr _\bC_\bo_\bp_\by_\ba_\bb_\bl_\be_\bO_\bp_\bt_\bi_\bo_\bn_\ba_\bl& operator= (T&& value)\n+144 noexcept(std::is_nothrow_assignable_v ||\n+145 (!std::is_assignable_v && std::\n+is_nothrow_constructible_v))\n+146 {\n+147 if constexpr(std::is_assignable_v)\n+148 Base::operator=(std::forward(value));\n+149 else\n+150 Base::emplace(std::forward(value));\n+151 return *this;\n+152 }\n+153};\n+154\n+155} // end namespace Dune\n+156\n+157#endif // DUNE_COMMON_COPYABLE_OPTIONAL_HH\n+_\bt_\by_\bp_\be_\bu_\bt_\bi_\bl_\bi_\bt_\bi_\be_\bs_\b._\bh_\bh\n+Utilities for type computations, constraining overloads, ...\n+_\bD_\bu_\bn_\be_\b:_\b:_\bd_\bi_\bs_\ba_\bb_\bl_\be_\bC_\bo_\bp_\by_\bM_\bo_\bv_\be\n+std::enable_if_t< not Impl::disableCopyMoveHelper< This, T... >::value, int >\n+disableCopyMove\n+Helper to disable constructor as copy and move constructor.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn typeutilities.hh:45\n+_\bs_\bt_\bd\n+STL namespace.\n _\bD_\bu_\bn_\be\n Dune namespace.\n D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn alignedallocator.hh:13\n-_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bR_\ba_\bn_\bg_\be\n-Simple range between a begin and an end iterator.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn iteratorrange.hh:22\n-_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bR_\ba_\bn_\bg_\be_\b:_\b:_\bb_\be_\bg_\bi_\bn\n-iterator begin() const\n-Returns an iterator pointing to the begin of the range.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn iteratorrange.hh:46\n-_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bR_\ba_\bn_\bg_\be_\b:_\b:_\bc_\bo_\bn_\bs_\bt_\b__\bi_\bt_\be_\br_\ba_\bt_\bo_\br\n-Iterator const_iterator\n-The iterator belonging to this range.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn iteratorrange.hh:33\n-_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bR_\ba_\bn_\bg_\be_\b:_\b:_\be_\bn_\bd\n-iterator end() const\n-Returns an iterator pointing past the end of the range.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn iteratorrange.hh:52\n-_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bR_\ba_\bn_\bg_\be_\b:_\b:_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bR_\ba_\bn_\bg_\be\n-IteratorRange()\n-Default constructor, relies on iterators being default-constructible.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn iteratorrange.hh:42\n-_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bR_\ba_\bn_\bg_\be_\b:_\b:_\bi_\bt_\be_\br_\ba_\bt_\bo_\br\n-Iterator iterator\n-The iterator belonging to this range.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn iteratorrange.hh:27\n-_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bR_\ba_\bn_\bg_\be_\b:_\b:_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bR_\ba_\bn_\bg_\be\n-IteratorRange(const Iterator &begin, const Iterator &end)\n-Constructs an iterator range on [begin,end).\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn iteratorrange.hh:36\n+_\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bp_\by_\ba_\bb_\bl_\be_\bO_\bp_\bt_\bi_\bo_\bn_\ba_\bl\n+A copyable type wrapper that provides copy/move assignment operations for types\n+that are only copy/mo...\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn copyableoptional.hh:35\n+_\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bp_\by_\ba_\bb_\bl_\be_\bO_\bp_\bt_\bi_\bo_\bn_\ba_\bl_\b:_\b:_\bC_\bo_\bp_\by_\ba_\bb_\bl_\be_\bO_\bp_\bt_\bi_\bo_\bn_\ba_\bl\n+constexpr CopyableOptional(CopyableOptional &&)=default\n+Move construct the contained value.\n+_\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bp_\by_\ba_\bb_\bl_\be_\bO_\bp_\bt_\bi_\bo_\bn_\ba_\bl_\b:_\b:_\bC_\bo_\bp_\by_\ba_\bb_\bl_\be_\bO_\bp_\bt_\bi_\bo_\bn_\ba_\bl\n+constexpr CopyableOptional(T &&value) noexcept(std::is_nothrow_constructible_v<\n+Type, T && >)\n+Construct the internal data from perfect forwarding of the passed arguments.\n+Participates in overload...\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn copyableoptional.hh:62\n+_\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bp_\by_\ba_\bb_\bl_\be_\bO_\bp_\bt_\bi_\bo_\bn_\ba_\bl_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b=\n+constexpr CopyableOptional & operator=(const CopyableOptional &that) noexcept\n+(std::is_nothrow_copy_assignable_v< Type >||(!std::is_copy_assignable_v< Type >\n+&&std::is_nothrow_copy_constructible_v< Type >))\n+Copy assignment in terms of copy constructor.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn copyableoptional.hh:100\n+_\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bp_\by_\ba_\bb_\bl_\be_\bO_\bp_\bt_\bi_\bo_\bn_\ba_\bl_\b:_\b:_\bC_\bo_\bp_\by_\ba_\bb_\bl_\be_\bO_\bp_\bt_\bi_\bo_\bn_\ba_\bl\n+constexpr CopyableOptional() noexcept(std::is_nothrow_default_constructible_v<\n+T >)\n+Implementation of a default constructor, if the Type is itself default\n+constructible....\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn copyableoptional.hh:49\n+_\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bp_\by_\ba_\bb_\bl_\be_\bO_\bp_\bt_\bi_\bo_\bn_\ba_\bl_\b:_\b:_\bC_\bo_\bp_\by_\ba_\bb_\bl_\be_\bO_\bp_\bt_\bi_\bo_\bn_\ba_\bl\n+constexpr CopyableOptional(const CopyableOptional &)=default\n+Copy construct the contained value.\n+_\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bp_\by_\ba_\bb_\bl_\be_\bO_\bp_\bt_\bi_\bo_\bn_\ba_\bl_\b:_\b:_\bC_\bo_\bp_\by_\ba_\bb_\bl_\be_\bO_\bp_\bt_\bi_\bo_\bn_\ba_\bl\n+constexpr CopyableOptional(Args &&... args) noexcept(std::\n+is_nothrow_constructible_v< Type, Args &&... >)\n+Construct the internal data from perfect forwarding of the passed arguments.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn copyableoptional.hh:85\n+_\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bp_\by_\ba_\bb_\bl_\be_\bO_\bp_\bt_\bi_\bo_\bn_\ba_\bl_\b:_\b:_\b~_\bC_\bo_\bp_\by_\ba_\bb_\bl_\be_\bO_\bp_\bt_\bi_\bo_\bn_\ba_\bl\n+~CopyableOptional()=default\n+Default destructor.\n ===============================================================================\n Generated by\u00a0_\b[_\bd_\bo_\bx_\by_\bg_\be_\bn_\b] 1.9.8\n"}]}, {"source1": "./usr/share/doc/libdune-common-doc/doxygen/a00110.html", "source2": "./usr/share/doc/libdune-common-doc/doxygen/a00110.html", "unified_diff": "@@ -1,15 +1,15 @@\n \n \n \n \n \n \n \n-dune-common: float_cmp.hh File Reference\n+dune-common: streamoperators.hh File Reference\n \n \n \n \n \n \n \n@@ -70,101 +70,52 @@\n
    \n \n
    \n \n
    \n \n-
    float_cmp.hh File Reference
    \n+
    streamoperators.hh File Reference
    \n
    \n
    \n \n-

    Various ways to compare floating-point numbers. \n+

    Implementation of stream operators for std::array and std::tuple. \n More...

    \n-
    #include "float_cmp.cc"
    \n+
    #include <array>
    \n+#include <tuple>
    \n+#include <utility>
    \n+#include <dune/common/hybridutilities.hh>
    \n
    \n

    Go to the source code of this file.

    \n

    \n Namespaces

    namespace  Dune
     Dune namespace.
     
    \n-\n-\n-\n-\n-\n-\n-\n-

    \n-Classes

    struct  Dune::FloatCmp::DefaultEpsilon< T, style >
     mapping from a value type and a compare style to a default epsilon More...
     
    class  Dune::FloatCmpOps< T, cstyle_, rstyle_ >
     Class encapsulating a default epsilon. More...
     
    \n \n \n \n \n-\n-\n-

    \n Namespaces

    namespace  Dune
     Dune namespace.
     
    namespace  Dune::FloatCmp
     
    \n-\n-\n-\n-\n-\n

    \n-Enumerations

    enum  Dune::FloatCmp::CmpStyle { Dune::FloatCmp::relativeWeak\n-, Dune::FloatCmp::relativeStrong\n-, Dune::FloatCmp::absolute\n-, Dune::FloatCmp::defaultCmpStyle = relativeWeak\n- }
     
    enum  Dune::FloatCmp::RoundingStyle {
    \n-  Dune::FloatCmp::towardZero\n-, Dune::FloatCmp::towardInf\n-, Dune::FloatCmp::downward\n-, Dune::FloatCmp::upward\n-,
    \n-  Dune::FloatCmp::defaultRoundingStyle = towardZero\n-
    \n- }
     
    \n \n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n

    \n Functions

    template<class T , CmpStyle style>
    bool Dune::FloatCmp::eq (const T &first, const T &second, typename EpsilonType< T >::Type epsilon=DefaultEpsilon< T, style >::value())
     test for equality using epsilon
     
    template<class T , CmpStyle style>
    bool Dune::FloatCmp::ne (const T &first, const T &second, typename EpsilonType< T >::Type epsilon=DefaultEpsilon< T, style >::value())
     test for inequality using epsilon
     
    template<class T , CmpStyle style>
    bool Dune::FloatCmp::gt (const T &first, const T &second, typename EpsilonType< T >::Type epsilon=DefaultEpsilon< T, style >::value())
     test if first greater than second
     
    template<class T , CmpStyle style>
    bool Dune::FloatCmp::lt (const T &first, const T &second, typename EpsilonType< T >::Type epsilon=DefaultEpsilon< T, style >::value())
     test if first lesser than second
     
    template<class T , CmpStyle style>
    bool Dune::FloatCmp::ge (const T &first, const T &second, typename EpsilonType< T >::Type epsilon=DefaultEpsilon< T, style >::value())
     test if first greater or equal second
     
    template<class T , CmpStyle style>
    bool Dune::FloatCmp::le (const T &first, const T &second, typename EpsilonType< T >::Type epsilon=DefaultEpsilon< T, style >::value())
     test if first lesser or equal second
     
    template<class I , class T , CmpStyle cstyle, RoundingStyle rstyle>
    Dune::FloatCmp::round (const T &val, typename EpsilonType< T >::Type epsilon=DefaultEpsilon< T, cstyle >::value())
     round using epsilon
     
    template<class I , class T , CmpStyle cstyle, RoundingStyle rstyle>
    Dune::FloatCmp::trunc (const T &val, typename EpsilonType< T >::Type epsilon=DefaultEpsilon< T, cstyle >::value())
     truncate using epsilon
     
    template<typename Stream , typename... Ts>
    Stream & Dune::operator<< (Stream &stream, const std::tuple< Ts... > &t)
     Print a std::tuple.
     
    template<typename Stream , typename... Ts>
    Stream & Dune::operator>> (Stream &stream, std::tuple< Ts... > &t)
     Read a std::tuple.
     
    template<typename Stream , typename T , std::size_t N>
    Stream & Dune::operator<< (Stream &stream, const std::array< T, N > &a)
     Print a std::array.
     
    \n

    Detailed Description

    \n-

    Various ways to compare floating-point numbers.

    \n+

    Implementation of stream operators for std::array and std::tuple.

    \n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,81 +1,35 @@\n dune-common\u00a02.10\n Loading...\n Searching...\n No Matches\n * _\bd_\bu_\bn_\be\n * _\bc_\bo_\bm_\bm_\bo_\bn\n-_\bC_\bl_\ba_\bs_\bs_\be_\bs | _\bN_\ba_\bm_\be_\bs_\bp_\ba_\bc_\be_\bs | _\bE_\bn_\bu_\bm_\be_\br_\ba_\bt_\bi_\bo_\bn_\bs | _\bF_\bu_\bn_\bc_\bt_\bi_\bo_\bn_\bs\n-float_cmp.hh File Reference\n-Various ways to compare floating-point numbers. _\bM_\bo_\br_\be_\b._\b._\b.\n-#include \"_\bf_\bl_\bo_\ba_\bt_\b__\bc_\bm_\bp_\b._\bc_\bc\"\n+_\bN_\ba_\bm_\be_\bs_\bp_\ba_\bc_\be_\bs | _\bF_\bu_\bn_\bc_\bt_\bi_\bo_\bn_\bs\n+streamoperators.hh File Reference\n+Implementation of stream operators for std::array and std::tuple. _\bM_\bo_\br_\be_\b._\b._\b.\n+#include \n+#include \n+#include \n+#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bh_\by_\bb_\br_\bi_\bd_\bu_\bt_\bi_\bl_\bi_\bt_\bi_\be_\bs_\b._\bh_\bh>\n _\bG_\bo_\b _\bt_\bo_\b _\bt_\bh_\be_\b _\bs_\bo_\bu_\br_\bc_\be_\b _\bc_\bo_\bd_\be_\b _\bo_\bf_\b _\bt_\bh_\bi_\bs_\b _\bf_\bi_\bl_\be_\b.\n-C\bCl\bla\bas\bss\bse\bes\bs\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bF_\bl_\bo_\ba_\bt_\bC_\bm_\bp_\b:_\b:_\bD_\be_\bf_\ba_\bu_\bl_\bt_\bE_\bp_\bs_\bi_\bl_\bo_\bn_\b<_\b _\bT_\b,_\b _\bs_\bt_\by_\bl_\be_\b _\b>\n-\u00a0 mapping from a value type and a compare style to a default epsilon\n- _\bM_\bo_\br_\be_\b._\b._\b.\n-\u00a0\n- class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bF_\bl_\bo_\ba_\bt_\bC_\bm_\bp_\bO_\bp_\bs_\b<_\b _\bT_\b,_\b _\bc_\bs_\bt_\by_\bl_\be_\b__\b,_\b _\br_\bs_\bt_\by_\bl_\be_\b__\b _\b>\n-\u00a0 Class encapsulating a default epsilon. _\bM_\bo_\br_\be_\b._\b._\b.\n-\u00a0\n N\bNa\bam\bme\bes\bsp\bpa\bac\bce\bes\bs\n namespace \u00a0 _\bD_\bu_\bn_\be\n \u00a0 _\bD_\bu_\bn_\be namespace.\n \u00a0\n-namespace \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bF_\bl_\bo_\ba_\bt_\bC_\bm_\bp\n-\u00a0\n-E\bEn\bnu\bum\bme\ber\bra\bat\bti\bio\bon\bns\bs\n-enum \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bF_\bl_\bo_\ba_\bt_\bC_\bm_\bp_\b:_\b:_\bC_\bm_\bp_\bS_\bt_\by_\bl_\be { _\bD_\bu_\bn_\be_\b:_\b:_\bF_\bl_\bo_\ba_\bt_\bC_\bm_\bp_\b:_\b:_\br_\be_\bl_\ba_\bt_\bi_\bv_\be_\bW_\be_\ba_\bk , _\bD_\bu_\bn_\be_\b:_\b:\n- _\bF_\bl_\bo_\ba_\bt_\bC_\bm_\bp_\b:_\b:_\br_\be_\bl_\ba_\bt_\bi_\bv_\be_\bS_\bt_\br_\bo_\bn_\bg , _\bD_\bu_\bn_\be_\b:_\b:_\bF_\bl_\bo_\ba_\bt_\bC_\bm_\bp_\b:_\b:_\ba_\bb_\bs_\bo_\bl_\bu_\bt_\be , _\bD_\bu_\bn_\be_\b:_\b:_\bF_\bl_\bo_\ba_\bt_\bC_\bm_\bp_\b:_\b:\n- _\bd_\be_\bf_\ba_\bu_\bl_\bt_\bC_\bm_\bp_\bS_\bt_\by_\bl_\be = relativeWeak }\n-\u00a0\n-enum \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bF_\bl_\bo_\ba_\bt_\bC_\bm_\bp_\b:_\b:_\bR_\bo_\bu_\bn_\bd_\bi_\bn_\bg_\bS_\bt_\by_\bl_\be {\n- \u00a0\u00a0_\bD_\bu_\bn_\be_\b:_\b:_\bF_\bl_\bo_\ba_\bt_\bC_\bm_\bp_\b:_\b:_\bt_\bo_\bw_\ba_\br_\bd_\bZ_\be_\br_\bo , _\bD_\bu_\bn_\be_\b:_\b:_\bF_\bl_\bo_\ba_\bt_\bC_\bm_\bp_\b:_\b:_\bt_\bo_\bw_\ba_\br_\bd_\bI_\bn_\bf , _\bD_\bu_\bn_\be_\b:_\b:\n- _\bF_\bl_\bo_\ba_\bt_\bC_\bm_\bp_\b:_\b:_\bd_\bo_\bw_\bn_\bw_\ba_\br_\bd , _\bD_\bu_\bn_\be_\b:_\b:_\bF_\bl_\bo_\ba_\bt_\bC_\bm_\bp_\b:_\b:_\bu_\bp_\bw_\ba_\br_\bd ,\n- \u00a0\u00a0_\bD_\bu_\bn_\be_\b:_\b:_\bF_\bl_\bo_\ba_\bt_\bC_\bm_\bp_\b:_\b:_\bd_\be_\bf_\ba_\bu_\bl_\bt_\bR_\bo_\bu_\bn_\bd_\bi_\bn_\bg_\bS_\bt_\by_\bl_\be = towardZero\n- }\n-\u00a0\n F\bFu\bun\bnc\bct\bti\bio\bon\bns\bs\n-template\n-bool\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bF_\bl_\bo_\ba_\bt_\bC_\bm_\bp_\b:_\b:_\be_\bq (const T &first, const T &second, typename\n- _\bE_\bp_\bs_\bi_\bl_\bo_\bn_\bT_\by_\bp_\be< T >::Type epsilon=_\bD_\be_\bf_\ba_\bu_\bl_\bt_\bE_\bp_\bs_\bi_\bl_\bo_\bn< T, style >::value())\n-\u00a0 test for equality using epsilon\n-\u00a0\n-template\n-bool\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bF_\bl_\bo_\ba_\bt_\bC_\bm_\bp_\b:_\b:_\bn_\be (const T &first, const T &second, typename\n- _\bE_\bp_\bs_\bi_\bl_\bo_\bn_\bT_\by_\bp_\be< T >::Type epsilon=_\bD_\be_\bf_\ba_\bu_\bl_\bt_\bE_\bp_\bs_\bi_\bl_\bo_\bn< T, style >::value())\n-\u00a0 test for inequality using epsilon\n-\u00a0\n-template\n-bool\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bF_\bl_\bo_\ba_\bt_\bC_\bm_\bp_\b:_\b:_\bg_\bt (const T &first, const T &second, typename\n- _\bE_\bp_\bs_\bi_\bl_\bo_\bn_\bT_\by_\bp_\be< T >::Type epsilon=_\bD_\be_\bf_\ba_\bu_\bl_\bt_\bE_\bp_\bs_\bi_\bl_\bo_\bn< T, style >::value())\n-\u00a0 test if first greater than second\n-\u00a0\n-template\n-bool\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bF_\bl_\bo_\ba_\bt_\bC_\bm_\bp_\b:_\b:_\bl_\bt (const T &first, const T &second, typename\n- _\bE_\bp_\bs_\bi_\bl_\bo_\bn_\bT_\by_\bp_\be< T >::Type epsilon=_\bD_\be_\bf_\ba_\bu_\bl_\bt_\bE_\bp_\bs_\bi_\bl_\bo_\bn< T, style >::value())\n-\u00a0 test if first lesser than second\n-\u00a0\n-template\n-bool\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bF_\bl_\bo_\ba_\bt_\bC_\bm_\bp_\b:_\b:_\bg_\be (const T &first, const T &second, typename\n- _\bE_\bp_\bs_\bi_\bl_\bo_\bn_\bT_\by_\bp_\be< T >::Type epsilon=_\bD_\be_\bf_\ba_\bu_\bl_\bt_\bE_\bp_\bs_\bi_\bl_\bo_\bn< T, style >::value())\n-\u00a0 test if first greater or equal second\n-\u00a0\n-template\n-bool\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bF_\bl_\bo_\ba_\bt_\bC_\bm_\bp_\b:_\b:_\bl_\be (const T &first, const T &second, typename\n- _\bE_\bp_\bs_\bi_\bl_\bo_\bn_\bT_\by_\bp_\be< T >::Type epsilon=_\bD_\be_\bf_\ba_\bu_\bl_\bt_\bE_\bp_\bs_\bi_\bl_\bo_\bn< T, style >::value())\n-\u00a0 test if first lesser or equal second\n-\u00a0\n-template\n- I\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bF_\bl_\bo_\ba_\bt_\bC_\bm_\bp_\b:_\b:_\br_\bo_\bu_\bn_\bd (const T &val, typename _\bE_\bp_\bs_\bi_\bl_\bo_\bn_\bT_\by_\bp_\be< T >::Type\n- epsilon=_\bD_\be_\bf_\ba_\bu_\bl_\bt_\bE_\bp_\bs_\bi_\bl_\bo_\bn< T, cstyle >::value())\n-\u00a0 round using epsilon\n-\u00a0\n-template\n- I\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bF_\bl_\bo_\ba_\bt_\bC_\bm_\bp_\b:_\b:_\bt_\br_\bu_\bn_\bc (const T &val, typename _\bE_\bp_\bs_\bi_\bl_\bo_\bn_\bT_\by_\bp_\be< T >::Type\n- epsilon=_\bD_\be_\bf_\ba_\bu_\bl_\bt_\bE_\bp_\bs_\bi_\bl_\bo_\bn< T, cstyle >::value())\n-\u00a0 truncate using epsilon\n+template\n+Stream &\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b<_\b< (Stream &stream, const std::tuple< Ts... > &t)\n+\u00a0 Print a std::tuple.\n+\u00a0\n+template\n+Stream &\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b>_\b> (Stream &stream, std::tuple< Ts... > &t)\n+\u00a0 Read a std::tuple.\n+\u00a0\n+template\n+Stream &\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b<_\b< (Stream &stream, const std::array< T, N > &a)\n+\u00a0 Print a std::array.\n \u00a0\n *\b**\b**\b**\b**\b* D\bDe\bet\bta\bai\bil\ble\bed\bd D\bDe\bes\bsc\bcr\bri\bip\bpt\bti\bio\bon\bn *\b**\b**\b**\b**\b*\n-Various ways to compare floating-point numbers.\n+Implementation of stream operators for std::array and std::tuple.\n ===============================================================================\n Generated by\u00a0_\b[_\bd_\bo_\bx_\by_\bg_\be_\bn_\b] 1.9.8\n"}]}, {"source1": "./usr/share/doc/libdune-common-doc/doxygen/a00110_source.html", "source2": "./usr/share/doc/libdune-common-doc/doxygen/a00110_source.html", "unified_diff": "@@ -1,15 +1,15 @@\n \n \n \n \n \n \n \n-dune-common: float_cmp.hh Source File\n+dune-common: streamoperators.hh Source File\n \n \n \n \n \n \n \n@@ -74,197 +74,83 @@\n \n
    \n \n
    \n
    \n
    \n-
    float_cmp.hh
    \n+
    streamoperators.hh
    \n
    \n
    \n Go to the documentation of this file.
    1// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
    \n
    2// vi: set et ts=4 sw=2 sts=2:
    \n
    3// SPDX-FileCopyrightInfo: Copyright \u00a9 DUNE Project contributors, see file LICENSE.md in module root
    \n
    4// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception
    \n-
    5#ifndef DUNE_COMMON_FLOAT_CMP_HH
    \n-
    6#define DUNE_COMMON_FLOAT_CMP_HH
    \n-
    7
    \n-
    97namespace Dune {
    \n-
    100 namespace FloatCmp {
    \n-
    101 // basic constants
    \n-\n-\n-
    128
    \n-
    129 template<class T> struct EpsilonType;
    \n-
    130
    \n-
    132
    \n-
    137 template<class T, CmpStyle style = defaultCmpStyle>
    \n-
    \n-\n-
    140 static typename EpsilonType<T>::Type value();
    \n-
    141 };
    \n-
    \n-
    142
    \n-
    143 // operations in functional style
    \n-
    144
    \n-
    147
    \n-
    149
    \n-
    156 template <class T, CmpStyle style /*= defaultCmpStyle*/>
    \n-
    157 bool eq(const T &first,
    \n-
    158 const T &second,
    \n-\n-
    161
    \n-
    169 template <class T, CmpStyle style /*= defaultCmpStyle*/>
    \n-
    170 bool ne(const T &first,
    \n-
    171 const T &second,
    \n-\n-
    174
    \n-
    185 template <class T, CmpStyle style /*= defaultCmpStyle*/>
    \n-
    186 bool gt(const T &first,
    \n-
    187 const T &second,
    \n-\n-
    190
    \n-
    201 template <class T, CmpStyle style /*= defaultCmpStyle*/>
    \n-
    202 bool lt(const T &first,
    \n-
    203 const T &second,
    \n-\n-
    206
    \n-
    217 template <class T, CmpStyle style /*= defaultCmpStyle*/>
    \n-
    218 bool ge(const T &first,
    \n-
    219 const T &second,
    \n-\n-
    222
    \n-
    233 template <class T, CmpStyle style /*= defaultCmpStyle*/>
    \n-
    234 bool le(const T &first,
    \n-
    235 const T &second,
    \n-\n-
    237
    \n-
    238 // rounding operations
    \n-
    240
    \n-
    253 template<class I, class T, CmpStyle cstyle /*= defaultCmpStyle*/, RoundingStyle rstyle /*= defaultRoundingStyle*/>
    \n-
    254 I round(const T &val, typename EpsilonType<T>::Type epsilon = DefaultEpsilon<T, cstyle>::value());
    \n-
    255 // truncation
    \n-
    257
    \n-
    270 template<class I, class T, CmpStyle cstyle /*= defaultCmpStyle*/, RoundingStyle rstyle /*= defaultRoundingStyle*/>
    \n-
    271 I trunc(const T &val, typename EpsilonType<T>::Type epsilon = DefaultEpsilon<T, cstyle>::value());
    \n-
    272
    \n-
    274 // group FloatCmp
    \n-
    275 } //namespace FloatCmp
    \n-
    276
    \n-
    277
    \n-
    278 // oo interface
    \n-
    280
    \n-
    286 template<class T, FloatCmp::CmpStyle cstyle_ = FloatCmp::defaultCmpStyle,
    \n-\n-
    \n-\n-\n-\n-
    291
    \n-
    292 public:
    \n-
    293 // record template parameters
    \n-
    295 static const CmpStyle cstyle = cstyle_;
    \n-
    297 static const RoundingStyle rstyle = rstyle_;
    \n-
    299 typedef T ValueType;
    \n-
    301
    \n-\n-
    305
    \n-
    306 private:
    \n-
    307 EpsilonType epsilon_;
    \n-
    308
    \n-\n-
    310
    \n-
    311 public:
    \n-
    313
    \n-\n-
    317
    \n-
    319 EpsilonType epsilon() const;
    \n-
    321 void epsilon(EpsilonType epsilon__);
    \n-
    322
    \n-
    324 bool eq(const ValueType &first, const ValueType &second) const;
    \n-
    326
    \n-
    329 bool ne(const ValueType &first, const ValueType &second) const;
    \n-
    331
    \n-
    335 bool gt(const ValueType &first, const ValueType &second) const;
    \n-
    337
    \n-
    341 bool lt(const ValueType &first, const ValueType &second) const;
    \n-
    343
    \n-
    347 bool ge(const ValueType &first, const ValueType &second) const;
    \n-
    349
    \n-
    353 bool le(const ValueType &first, const ValueType &second) const;
    \n-
    354
    \n-
    356
    \n-
    365 template<class I>
    \n-
    366 I round(const ValueType &val) const;
    \n-
    367
    \n-
    369
    \n-
    378 template<class I>
    \n-
    379 I trunc(const ValueType &val) const;
    \n-
    380
    \n-
    381 };
    \n-
    \n-
    382
    \n-
    383} //namespace Dune
    \n-
    384
    \n-
    385#include "float_cmp.cc"
    \n-
    386
    \n-
    387#endif //DUNE_COMMON_FLOAT_CMP_HH
    \n-\n-
    bool ne(const T &first, const T &second, typename EpsilonType< T >::Type epsilon)
    test for inequality using epsilon
    Definition float_cmp.cc:151
    \n-
    CmpStyle
    Definition float_cmp.hh:104
    \n-
    bool eq(const T &first, const T &second, typename EpsilonType< T >::Type epsilon)
    test for equality using epsilon
    Definition float_cmp.cc:144
    \n-
    I round(const T &val, typename EpsilonType< T >::Type epsilon)
    round using epsilon
    Definition float_cmp.cc:311
    \n-
    I trunc(const T &val, typename EpsilonType< T >::Type epsilon)
    truncate using epsilon
    Definition float_cmp.cc:407
    \n-
    RoundingStyle
    Definition float_cmp.hh:116
    \n-
    bool lt(const T &first, const T &second, typename EpsilonType< T >::Type epsilon)
    test if first lesser than second
    Definition float_cmp.cc:165
    \n-
    bool gt(const T &first, const T &second, typename EpsilonType< T >::Type epsilon)
    test if first greater than second
    Definition float_cmp.cc:158
    \n-
    bool ge(const T &first, const T &second, typename EpsilonType< T >::Type epsilon)
    test if first greater or equal second
    Definition float_cmp.cc:172
    \n-
    bool le(const T &first, const T &second, typename EpsilonType< T >::Type epsilon)
    test if first lesser or equal second
    Definition float_cmp.cc:179
    \n-
    @ defaultCmpStyle
    the global default compare style (relative_weak)
    Definition float_cmp.hh:112
    \n-
    @ relativeStrong
    |a-b|/|a| <= epsilon && |a-b|/|b| <= epsilon
    Definition float_cmp.hh:108
    \n-
    @ relativeWeak
    |a-b|/|a| <= epsilon || |a-b|/|b| <= epsilon
    Definition float_cmp.hh:106
    \n-
    @ absolute
    |a-b| <= epsilon
    Definition float_cmp.hh:110
    \n-
    @ towardZero
    always round toward 0
    Definition float_cmp.hh:118
    \n-
    @ towardInf
    always round away from 0
    Definition float_cmp.hh:120
    \n-
    @ upward
    round toward
    Definition float_cmp.hh:124
    \n-
    @ downward
    round toward
    Definition float_cmp.hh:122
    \n-
    @ defaultRoundingStyle
    the global default rounding style (toward_zero)
    Definition float_cmp.hh:126
    \n+
    5
    \n+
    6#ifndef DUNE_STREAMOPERATORS_HH
    \n+
    7#define DUNE_STREAMOPERATORS_HH
    \n+
    8
    \n+
    13#include <array>
    \n+
    14#include <tuple>
    \n+
    15#include <utility>
    \n+
    16
    \n+\n+
    18
    \n+
    19namespace Dune
    \n+
    20{
    \n+
    27 template<typename Stream, typename... Ts>
    \n+
    \n+
    28 inline Stream& operator<<(Stream& stream, const std::tuple<Ts...>& t)
    \n+
    29 {
    \n+
    30 stream<<"[";
    \n+
    31 if(sizeof...(Ts)>0)
    \n+
    32 {
    \n+
    33 Hybrid::forEach(std::make_index_sequence<sizeof...(Ts)-1>{},
    \n+
    34 [&](auto i){stream<<std::get<i>(t)<<",";});
    \n+
    35 stream<<std::get<sizeof...(Ts)-1>(t);
    \n+
    36 }
    \n+
    37 stream<<"]";
    \n+
    38 return stream;
    \n+
    39 }
    \n+
    \n+
    40
    \n+
    42 template<typename Stream, typename... Ts>
    \n+
    \n+
    43 inline Stream& operator>>(Stream& stream, std::tuple<Ts...>& t)
    \n+
    44 {
    \n+
    45 Hybrid::forEach(std::make_index_sequence<sizeof...(Ts)>{},
    \n+
    46 [&](auto i){stream>>std::get<i>(t);});
    \n+
    47 return stream;
    \n+
    48 }
    \n+
    \n+
    49
    \n+
    51 template<typename Stream, typename T, std::size_t N>
    \n+
    \n+
    52 inline Stream& operator<<(Stream& stream, const std::array<T,N>& a)
    \n+
    53 {
    \n+
    54 stream<<"[";
    \n+
    55 if(N>0)
    \n+
    56 {
    \n+
    57 for(std::size_t i=0; i<N-1; ++i)
    \n+
    58 stream<<a[i]<<",";
    \n+
    59 stream<<a[N-1];
    \n+
    60 }
    \n+
    61 stream<<"]";
    \n+
    62 return stream;
    \n+
    63 }
    \n+
    \n+
    64
    \n+
    67} // end namespace Dune
    \n+
    68
    \n+
    69#endif
    \n+\n+
    Stream & operator>>(Stream &stream, std::tuple< Ts... > &t)
    Read a std::tuple.
    Definition streamoperators.hh:43
    \n+
    constexpr void forEach(Range &&range, F &&f)
    Range based for loop.
    Definition hybridutilities.hh:256
    \n+
    std::ostream & operator<<(std::ostream &s, const bigunsignedint< k > &x)
    Definition bigunsignedint.hh:278
    \n
    Dune namespace.
    Definition alignedallocator.hh:13
    \n-
    T Type
    The epsilon type corresponding to value type T.
    Definition float_cmp.cc:25
    \n-
    mapping from a value type and a compare style to a default epsilon
    Definition float_cmp.hh:138
    \n-
    static EpsilonType< T >::Type value()
    Returns the default epsilon for the given value type and compare style.
    \n-
    Class encapsulating a default epsilon.
    Definition float_cmp.hh:288
    \n-
    bool le(const ValueType &first, const ValueType &second) const
    test if first lesser or equal second
    Definition float_cmp.cc:486
    \n-
    bool eq(const ValueType &first, const ValueType &second) const
    test for equality using epsilon
    Definition float_cmp.cc:451
    \n-
    static const CmpStyle cstyle
    How comparisons are done.
    Definition float_cmp.hh:295
    \n-
    bool lt(const ValueType &first, const ValueType &second) const
    test if first lesser than second
    Definition float_cmp.cc:472
    \n-
    bool ge(const ValueType &first, const ValueType &second) const
    test if first greater or equal second
    Definition float_cmp.cc:479
    \n-
    static const RoundingStyle rstyle
    How rounding is done.
    Definition float_cmp.hh:297
    \n-
    FloatCmp::EpsilonType< T >::Type EpsilonType
    Type of the epsilon.
    Definition float_cmp.hh:304
    \n-
    bool ne(const ValueType &first, const ValueType &second) const
    test for inequality using epsilon
    Definition float_cmp.cc:458
    \n-
    T ValueType
    Type of the values to compare.
    Definition float_cmp.hh:299
    \n-
    EpsilonType epsilon() const
    return the current epsilon
    Definition float_cmp.cc:436
    \n-
    I round(const ValueType &val) const
    round using epsilon
    Definition float_cmp.cc:495
    \n-
    I trunc(const ValueType &val) const
    truncate using epsilon
    Definition float_cmp.cc:503
    \n-
    bool gt(const ValueType &first, const ValueType &second) const
    test if first greater than second
    Definition float_cmp.cc:465
    \n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,298 +1,81 @@\n dune-common\u00a02.10\n Loading...\n Searching...\n No Matches\n * _\bd_\bu_\bn_\be\n * _\bc_\bo_\bm_\bm_\bo_\bn\n-float_cmp.hh\n+streamoperators.hh\n _\bG_\bo_\b _\bt_\bo_\b _\bt_\bh_\be_\b _\bd_\bo_\bc_\bu_\bm_\be_\bn_\bt_\ba_\bt_\bi_\bo_\bn_\b _\bo_\bf_\b _\bt_\bh_\bi_\bs_\b _\bf_\bi_\bl_\be_\b.\n 1// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-\n 2// vi: set et ts=4 sw=2 sts=2:\n 3// SPDX-FileCopyrightInfo: Copyright \u00c2\u00a9 DUNE Project contributors, see file\n LICENSE.md in module root\n 4// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception\n-5#ifndef DUNE_COMMON_FLOAT_CMP_HH\n-6#define DUNE_COMMON_FLOAT_CMP_HH\n-7\n-97namespace _\bD_\bu_\bn_\be {\n-100 namespace FloatCmp {\n-101 // basic constants\n-_\b1_\b0_\b4 enum _\bC_\bm_\bp_\bS_\bt_\by_\bl_\be {\n-_\b1_\b0_\b6 _\br_\be_\bl_\ba_\bt_\bi_\bv_\be_\bW_\be_\ba_\bk,\n-_\b1_\b0_\b8 _\br_\be_\bl_\ba_\bt_\bi_\bv_\be_\bS_\bt_\br_\bo_\bn_\bg,\n-_\b1_\b1_\b0 _\ba_\bb_\bs_\bo_\bl_\bu_\bt_\be,\n-112 _\bd_\be_\bf_\ba_\bu_\bl_\bt_\bC_\bm_\bp_\bS_\bt_\by_\bl_\be = _\br_\be_\bl_\ba_\bt_\bi_\bv_\be_\bW_\be_\ba_\bk\n-_\b1_\b1_\b3 };\n-_\b1_\b1_\b6 enum _\bR_\bo_\bu_\bn_\bd_\bi_\bn_\bg_\bS_\bt_\by_\bl_\be {\n-_\b1_\b1_\b8 _\bt_\bo_\bw_\ba_\br_\bd_\bZ_\be_\br_\bo,\n-_\b1_\b2_\b0 _\bt_\bo_\bw_\ba_\br_\bd_\bI_\bn_\bf,\n-_\b1_\b2_\b2 _\bd_\bo_\bw_\bn_\bw_\ba_\br_\bd,\n-_\b1_\b2_\b4 _\bu_\bp_\bw_\ba_\br_\bd,\n-126 _\bd_\be_\bf_\ba_\bu_\bl_\bt_\bR_\bo_\bu_\bn_\bd_\bi_\bn_\bg_\bS_\bt_\by_\bl_\be = _\bt_\bo_\bw_\ba_\br_\bd_\bZ_\be_\br_\bo\n-_\b1_\b2_\b7 };\n-128\n-129 template struct EpsilonType;\n-130\n-132\n-137 template\n-_\b1_\b3_\b8 struct _\bD_\be_\bf_\ba_\bu_\bl_\bt_\bE_\bp_\bs_\bi_\bl_\bo_\bn {\n-_\b1_\b4_\b0 static typename _\bE_\bp_\bs_\bi_\bl_\bo_\bn_\bT_\by_\bp_\be_\b<_\bT_\b>_\b:_\b:_\bT_\by_\bp_\be _\bv_\ba_\bl_\bu_\be();\n-141 };\n-142\n-143 // operations in functional style\n-144\n-147\n-149\n-156 template \n-157 bool _\be_\bq(const T &first,\n-158 const T &second,\n-159 typename _\bE_\bp_\bs_\bi_\bl_\bo_\bn_\bT_\by_\bp_\be_\b<_\bT_\b>_\b:_\b:_\bT_\by_\bp_\be epsilon = _\bD_\be_\bf_\ba_\bu_\bl_\bt_\bE_\bp_\bs_\bi_\bl_\bo_\bn_\b<_\bT_\b,_\b _\bs_\bt_\by_\bl_\be_\b>_\b:_\b:_\bv_\ba_\bl_\bu_\be());\n-161\n-169 template \n-170 bool _\bn_\be(const T &first,\n-171 const T &second,\n-172 typename _\bE_\bp_\bs_\bi_\bl_\bo_\bn_\bT_\by_\bp_\be_\b<_\bT_\b>_\b:_\b:_\bT_\by_\bp_\be epsilon = _\bD_\be_\bf_\ba_\bu_\bl_\bt_\bE_\bp_\bs_\bi_\bl_\bo_\bn_\b<_\bT_\b,_\b _\bs_\bt_\by_\bl_\be_\b>_\b:_\b:_\bv_\ba_\bl_\bu_\be());\n-174\n-185 template \n-186 bool _\bg_\bt(const T &first,\n-187 const T &second,\n-188 typename _\bE_\bp_\bs_\bi_\bl_\bo_\bn_\bT_\by_\bp_\be_\b<_\bT_\b>_\b:_\b:_\bT_\by_\bp_\be epsilon = _\bD_\be_\bf_\ba_\bu_\bl_\bt_\bE_\bp_\bs_\bi_\bl_\bo_\bn_\b<_\bT_\b,_\b _\bs_\bt_\by_\bl_\be_\b>_\b:_\b:_\bv_\ba_\bl_\bu_\be());\n-190\n-201 template \n-202 bool _\bl_\bt(const T &first,\n-203 const T &second,\n-204 typename _\bE_\bp_\bs_\bi_\bl_\bo_\bn_\bT_\by_\bp_\be_\b<_\bT_\b>_\b:_\b:_\bT_\by_\bp_\be epsilon = _\bD_\be_\bf_\ba_\bu_\bl_\bt_\bE_\bp_\bs_\bi_\bl_\bo_\bn_\b<_\bT_\b,_\b _\bs_\bt_\by_\bl_\be_\b>_\b:_\b:_\bv_\ba_\bl_\bu_\be());\n-206\n-217 template \n-218 bool _\bg_\be(const T &first,\n-219 const T &second,\n-220 typename _\bE_\bp_\bs_\bi_\bl_\bo_\bn_\bT_\by_\bp_\be_\b<_\bT_\b>_\b:_\b:_\bT_\by_\bp_\be epsilon = _\bD_\be_\bf_\ba_\bu_\bl_\bt_\bE_\bp_\bs_\bi_\bl_\bo_\bn_\b<_\bT_\b,_\b _\bs_\bt_\by_\bl_\be_\b>_\b:_\b:_\bv_\ba_\bl_\bu_\be());\n-222\n-233 template \n-234 bool _\bl_\be(const T &first,\n-235 const T &second,\n-236 typename _\bE_\bp_\bs_\bi_\bl_\bo_\bn_\bT_\by_\bp_\be_\b<_\bT_\b>_\b:_\b:_\bT_\by_\bp_\be epsilon = _\bD_\be_\bf_\ba_\bu_\bl_\bt_\bE_\bp_\bs_\bi_\bl_\bo_\bn_\b<_\bT_\b,_\b _\bs_\bt_\by_\bl_\be_\b>_\b:_\b:_\bv_\ba_\bl_\bu_\be());\n-237\n-238 // rounding operations\n-240\n-253 template\n-254 I _\br_\bo_\bu_\bn_\bd(const T &val, typename _\bE_\bp_\bs_\bi_\bl_\bo_\bn_\bT_\by_\bp_\be_\b<_\bT_\b>_\b:_\b:_\bT_\by_\bp_\be epsilon =\n-_\bD_\be_\bf_\ba_\bu_\bl_\bt_\bE_\bp_\bs_\bi_\bl_\bo_\bn_\b<_\bT_\b,_\b _\bc_\bs_\bt_\by_\bl_\be_\b>_\b:_\b:_\bv_\ba_\bl_\bu_\be());\n-255 // truncation\n-257\n-270 template\n-271 I _\bt_\br_\bu_\bn_\bc(const T &val, typename _\bE_\bp_\bs_\bi_\bl_\bo_\bn_\bT_\by_\bp_\be_\b<_\bT_\b>_\b:_\b:_\bT_\by_\bp_\be epsilon =\n-_\bD_\be_\bf_\ba_\bu_\bl_\bt_\bE_\bp_\bs_\bi_\bl_\bo_\bn_\b<_\bT_\b,_\b _\bc_\bs_\bt_\by_\bl_\be_\b>_\b:_\b:_\bv_\ba_\bl_\bu_\be());\n-272\n-274 // group FloatCmp\n-275 } //namespace FloatCmp\n-276\n-277\n-278 // oo interface\n-280\n-286 template\n-_\b2_\b8_\b8 class _\bF_\bl_\bo_\ba_\bt_\bC_\bm_\bp_\bO_\bp_\bs {\n-289 typedef _\bF_\bl_\bo_\ba_\bt_\bC_\bm_\bp_\b:_\b:_\bC_\bm_\bp_\bS_\bt_\by_\bl_\be _\bC_\bm_\bp_\bS_\bt_\by_\bl_\be;\n-290 typedef _\bF_\bl_\bo_\ba_\bt_\bC_\bm_\bp_\b:_\b:_\bR_\bo_\bu_\bn_\bd_\bi_\bn_\bg_\bS_\bt_\by_\bl_\be _\bR_\bo_\bu_\bn_\bd_\bi_\bn_\bg_\bS_\bt_\by_\bl_\be;\n-291\n-292 public:\n-293 // record template parameters\n-_\b2_\b9_\b5 static const _\bC_\bm_\bp_\bS_\bt_\by_\bl_\be _\bc_\bs_\bt_\by_\bl_\be = cstyle_;\n-_\b2_\b9_\b7 static const _\bR_\bo_\bu_\bn_\bd_\bi_\bn_\bg_\bS_\bt_\by_\bl_\be _\br_\bs_\bt_\by_\bl_\be = rstyle_;\n-_\b2_\b9_\b9 typedef T _\bV_\ba_\bl_\bu_\be_\bT_\by_\bp_\be;\n-301\n-_\b3_\b0_\b4 typedef typename _\bF_\bl_\bo_\ba_\bt_\bC_\bm_\bp_\b:_\b:_\bE_\bp_\bs_\bi_\bl_\bo_\bn_\bT_\by_\bp_\be_\b<_\bT_\b>_\b:_\b:_\bT_\by_\bp_\be _\bE_\bp_\bs_\bi_\bl_\bo_\bn_\bT_\by_\bp_\be;\n-305\n-306 private:\n-307 _\bE_\bp_\bs_\bi_\bl_\bo_\bn_\bT_\by_\bp_\be epsilon_;\n-308\n-309 typedef _\bF_\bl_\bo_\ba_\bt_\bC_\bm_\bp_\b:_\b:_\bD_\be_\bf_\ba_\bu_\bl_\bt_\bE_\bp_\bs_\bi_\bl_\bo_\bn_\b<_\bE_\bp_\bs_\bi_\bl_\bo_\bn_\bT_\by_\bp_\be_\b,_\b _\bc_\bs_\bt_\by_\bl_\be_\b> _\bD_\be_\bf_\ba_\bu_\bl_\bt_\bE_\bp_\bs_\bi_\bl_\bo_\bn;\n-310\n-311 public:\n-313\n-316 _\bF_\bl_\bo_\ba_\bt_\bC_\bm_\bp_\bO_\bp_\bs(_\bE_\bp_\bs_\bi_\bl_\bo_\bn_\bT_\by_\bp_\be _\be_\bp_\bs_\bi_\bl_\bo_\bn = _\bD_\be_\bf_\ba_\bu_\bl_\bt_\bE_\bp_\bs_\bi_\bl_\bo_\bn_\b:_\b:_\bv_\ba_\bl_\bu_\be());\n-317\n-319 _\bE_\bp_\bs_\bi_\bl_\bo_\bn_\bT_\by_\bp_\be _\be_\bp_\bs_\bi_\bl_\bo_\bn() const;\n-321 void _\be_\bp_\bs_\bi_\bl_\bo_\bn(_\bE_\bp_\bs_\bi_\bl_\bo_\bn_\bT_\by_\bp_\be epsilon__);\n-322\n-324 bool _\be_\bq(const _\bV_\ba_\bl_\bu_\be_\bT_\by_\bp_\be &first, const _\bV_\ba_\bl_\bu_\be_\bT_\by_\bp_\be &second) const;\n-326\n-329 bool _\bn_\be(const _\bV_\ba_\bl_\bu_\be_\bT_\by_\bp_\be &first, const _\bV_\ba_\bl_\bu_\be_\bT_\by_\bp_\be &second) const;\n-331\n-335 bool _\bg_\bt(const _\bV_\ba_\bl_\bu_\be_\bT_\by_\bp_\be &first, const _\bV_\ba_\bl_\bu_\be_\bT_\by_\bp_\be &second) const;\n-337\n-341 bool _\bl_\bt(const _\bV_\ba_\bl_\bu_\be_\bT_\by_\bp_\be &first, const _\bV_\ba_\bl_\bu_\be_\bT_\by_\bp_\be &second) const;\n-343\n-347 bool _\bg_\be(const _\bV_\ba_\bl_\bu_\be_\bT_\by_\bp_\be &first, const _\bV_\ba_\bl_\bu_\be_\bT_\by_\bp_\be &second) const;\n-349\n-353 bool _\bl_\be(const _\bV_\ba_\bl_\bu_\be_\bT_\by_\bp_\be &first, const _\bV_\ba_\bl_\bu_\be_\bT_\by_\bp_\be &second) const;\n-354\n-356\n-365 template\n-366 I _\br_\bo_\bu_\bn_\bd(const _\bV_\ba_\bl_\bu_\be_\bT_\by_\bp_\be &val) const;\n-367\n-369\n-378 template\n-379 I _\bt_\br_\bu_\bn_\bc(const _\bV_\ba_\bl_\bu_\be_\bT_\by_\bp_\be &val) const;\n-380\n-381 };\n-382\n-383} //namespace Dune\n-384\n-385#include \"_\bf_\bl_\bo_\ba_\bt_\b__\bc_\bm_\bp_\b._\bc_\bc\"\n-386\n-387#endif //DUNE_COMMON_FLOAT_CMP_HH\n-_\bf_\bl_\bo_\ba_\bt_\b__\bc_\bm_\bp_\b._\bc_\bc\n-_\bD_\bu_\bn_\be_\b:_\b:_\bF_\bl_\bo_\ba_\bt_\bC_\bm_\bp_\b:_\b:_\bn_\be\n-bool ne(const T &first, const T &second, typename EpsilonType< T >::Type\n-epsilon)\n-test for inequality using epsilon\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn float_cmp.cc:151\n-_\bD_\bu_\bn_\be_\b:_\b:_\bF_\bl_\bo_\ba_\bt_\bC_\bm_\bp_\b:_\b:_\bC_\bm_\bp_\bS_\bt_\by_\bl_\be\n-CmpStyle\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn float_cmp.hh:104\n-_\bD_\bu_\bn_\be_\b:_\b:_\bF_\bl_\bo_\ba_\bt_\bC_\bm_\bp_\b:_\b:_\be_\bq\n-bool eq(const T &first, const T &second, typename EpsilonType< T >::Type\n-epsilon)\n-test for equality using epsilon\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn float_cmp.cc:144\n-_\bD_\bu_\bn_\be_\b:_\b:_\bF_\bl_\bo_\ba_\bt_\bC_\bm_\bp_\b:_\b:_\br_\bo_\bu_\bn_\bd\n-I round(const T &val, typename EpsilonType< T >::Type epsilon)\n-round using epsilon\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn float_cmp.cc:311\n-_\bD_\bu_\bn_\be_\b:_\b:_\bF_\bl_\bo_\ba_\bt_\bC_\bm_\bp_\b:_\b:_\bt_\br_\bu_\bn_\bc\n-I trunc(const T &val, typename EpsilonType< T >::Type epsilon)\n-truncate using epsilon\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn float_cmp.cc:407\n-_\bD_\bu_\bn_\be_\b:_\b:_\bF_\bl_\bo_\ba_\bt_\bC_\bm_\bp_\b:_\b:_\bR_\bo_\bu_\bn_\bd_\bi_\bn_\bg_\bS_\bt_\by_\bl_\be\n-RoundingStyle\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn float_cmp.hh:116\n-_\bD_\bu_\bn_\be_\b:_\b:_\bF_\bl_\bo_\ba_\bt_\bC_\bm_\bp_\b:_\b:_\bl_\bt\n-bool lt(const T &first, const T &second, typename EpsilonType< T >::Type\n-epsilon)\n-test if first lesser than second\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn float_cmp.cc:165\n-_\bD_\bu_\bn_\be_\b:_\b:_\bF_\bl_\bo_\ba_\bt_\bC_\bm_\bp_\b:_\b:_\bg_\bt\n-bool gt(const T &first, const T &second, typename EpsilonType< T >::Type\n-epsilon)\n-test if first greater than second\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn float_cmp.cc:158\n-_\bD_\bu_\bn_\be_\b:_\b:_\bF_\bl_\bo_\ba_\bt_\bC_\bm_\bp_\b:_\b:_\bg_\be\n-bool ge(const T &first, const T &second, typename EpsilonType< T >::Type\n-epsilon)\n-test if first greater or equal second\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn float_cmp.cc:172\n-_\bD_\bu_\bn_\be_\b:_\b:_\bF_\bl_\bo_\ba_\bt_\bC_\bm_\bp_\b:_\b:_\bl_\be\n-bool le(const T &first, const T &second, typename EpsilonType< T >::Type\n-epsilon)\n-test if first lesser or equal second\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn float_cmp.cc:179\n-_\bD_\bu_\bn_\be_\b:_\b:_\bF_\bl_\bo_\ba_\bt_\bC_\bm_\bp_\b:_\b:_\bd_\be_\bf_\ba_\bu_\bl_\bt_\bC_\bm_\bp_\bS_\bt_\by_\bl_\be\n-@ defaultCmpStyle\n-the global default compare style (relative_weak)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn float_cmp.hh:112\n-_\bD_\bu_\bn_\be_\b:_\b:_\bF_\bl_\bo_\ba_\bt_\bC_\bm_\bp_\b:_\b:_\br_\be_\bl_\ba_\bt_\bi_\bv_\be_\bS_\bt_\br_\bo_\bn_\bg\n-@ relativeStrong\n-|a-b|/|a| <= epsilon && |a-b|/|b| <= epsilon\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn float_cmp.hh:108\n-_\bD_\bu_\bn_\be_\b:_\b:_\bF_\bl_\bo_\ba_\bt_\bC_\bm_\bp_\b:_\b:_\br_\be_\bl_\ba_\bt_\bi_\bv_\be_\bW_\be_\ba_\bk\n-@ relativeWeak\n-|a-b|/|a| <= epsilon || |a-b|/|b| <= epsilon\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn float_cmp.hh:106\n-_\bD_\bu_\bn_\be_\b:_\b:_\bF_\bl_\bo_\ba_\bt_\bC_\bm_\bp_\b:_\b:_\ba_\bb_\bs_\bo_\bl_\bu_\bt_\be\n-@ absolute\n-|a-b| <= epsilon\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn float_cmp.hh:110\n-_\bD_\bu_\bn_\be_\b:_\b:_\bF_\bl_\bo_\ba_\bt_\bC_\bm_\bp_\b:_\b:_\bt_\bo_\bw_\ba_\br_\bd_\bZ_\be_\br_\bo\n-@ towardZero\n-always round toward 0\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn float_cmp.hh:118\n-_\bD_\bu_\bn_\be_\b:_\b:_\bF_\bl_\bo_\ba_\bt_\bC_\bm_\bp_\b:_\b:_\bt_\bo_\bw_\ba_\br_\bd_\bI_\bn_\bf\n-@ towardInf\n-always round away from 0\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn float_cmp.hh:120\n-_\bD_\bu_\bn_\be_\b:_\b:_\bF_\bl_\bo_\ba_\bt_\bC_\bm_\bp_\b:_\b:_\bu_\bp_\bw_\ba_\br_\bd\n-@ upward\n-round toward\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn float_cmp.hh:124\n-_\bD_\bu_\bn_\be_\b:_\b:_\bF_\bl_\bo_\ba_\bt_\bC_\bm_\bp_\b:_\b:_\bd_\bo_\bw_\bn_\bw_\ba_\br_\bd\n-@ downward\n-round toward\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn float_cmp.hh:122\n-_\bD_\bu_\bn_\be_\b:_\b:_\bF_\bl_\bo_\ba_\bt_\bC_\bm_\bp_\b:_\b:_\bd_\be_\bf_\ba_\bu_\bl_\bt_\bR_\bo_\bu_\bn_\bd_\bi_\bn_\bg_\bS_\bt_\by_\bl_\be\n-@ defaultRoundingStyle\n-the global default rounding style (toward_zero)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn float_cmp.hh:126\n+5\n+6#ifndef DUNE_STREAMOPERATORS_HH\n+7#define DUNE_STREAMOPERATORS_HH\n+8\n+13#include \n+14#include \n+15#include \n+16\n+17#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bh_\by_\bb_\br_\bi_\bd_\bu_\bt_\bi_\bl_\bi_\bt_\bi_\be_\bs_\b._\bh_\bh>\n+18\n+19namespace _\bD_\bu_\bn_\be\n+20{\n+27 template\n+_\b2_\b8 inline Stream& _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b<_\b<(Stream& stream, const std::tuple& t)\n+29 {\n+30 stream<<\"[\";\n+31 if(sizeof...(Ts)>0)\n+32 {\n+33 _\bH_\by_\bb_\br_\bi_\bd_\b:_\b:_\bf_\bo_\br_\bE_\ba_\bc_\bh(std::make_index_sequence{},\n+34 [&](auto i){stream<(t)<<\",\";});\n+35 stream<(t);\n+36 }\n+37 stream<<\"]\";\n+38 return stream;\n+39 }\n+40\n+42 template\n+_\b4_\b3 inline Stream& _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b>_\b>(Stream& stream, std::tuple& t)\n+44 {\n+45 _\bH_\by_\bb_\br_\bi_\bd_\b:_\b:_\bf_\bo_\br_\bE_\ba_\bc_\bh(std::make_index_sequence{},\n+46 [&](auto i){stream>>std::get(t);});\n+47 return stream;\n+48 }\n+49\n+51 template\n+_\b5_\b2 inline Stream& _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b<_\b<(Stream& stream, const std::array& a)\n+53 {\n+54 stream<<\"[\";\n+55 if(N>0)\n+56 {\n+57 for(std::size_t i=0; i_\b>\n+Stream & operator>>(Stream &stream, std::tuple< Ts... > &t)\n+Read a std::tuple.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn streamoperators.hh:43\n+_\bD_\bu_\bn_\be_\b:_\b:_\bH_\by_\bb_\br_\bi_\bd_\b:_\b:_\bf_\bo_\br_\bE_\ba_\bc_\bh\n+constexpr void forEach(Range &&range, F &&f)\n+Range based for loop.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn hybridutilities.hh:256\n+_\bD_\bu_\bn_\be_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b<_\b<\n+std::ostream & operator<<(std::ostream &s, const bigunsignedint< k > &x)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bigunsignedint.hh:278\n _\bD_\bu_\bn_\be\n Dune namespace.\n D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn alignedallocator.hh:13\n-_\bD_\bu_\bn_\be_\b:_\b:_\bF_\bl_\bo_\ba_\bt_\bC_\bm_\bp_\b:_\b:_\bE_\bp_\bs_\bi_\bl_\bo_\bn_\bT_\by_\bp_\be_\b:_\b:_\bT_\by_\bp_\be\n-T Type\n-The epsilon type corresponding to value type T.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn float_cmp.cc:25\n-_\bD_\bu_\bn_\be_\b:_\b:_\bF_\bl_\bo_\ba_\bt_\bC_\bm_\bp_\b:_\b:_\bD_\be_\bf_\ba_\bu_\bl_\bt_\bE_\bp_\bs_\bi_\bl_\bo_\bn\n-mapping from a value type and a compare style to a default epsilon\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn float_cmp.hh:138\n-_\bD_\bu_\bn_\be_\b:_\b:_\bF_\bl_\bo_\ba_\bt_\bC_\bm_\bp_\b:_\b:_\bD_\be_\bf_\ba_\bu_\bl_\bt_\bE_\bp_\bs_\bi_\bl_\bo_\bn_\b:_\b:_\bv_\ba_\bl_\bu_\be\n-static EpsilonType< T >::Type value()\n-Returns the default epsilon for the given value type and compare style.\n-_\bD_\bu_\bn_\be_\b:_\b:_\bF_\bl_\bo_\ba_\bt_\bC_\bm_\bp_\bO_\bp_\bs\n-Class encapsulating a default epsilon.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn float_cmp.hh:288\n-_\bD_\bu_\bn_\be_\b:_\b:_\bF_\bl_\bo_\ba_\bt_\bC_\bm_\bp_\bO_\bp_\bs_\b:_\b:_\bl_\be\n-bool le(const ValueType &first, const ValueType &second) const\n-test if first lesser or equal second\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn float_cmp.cc:486\n-_\bD_\bu_\bn_\be_\b:_\b:_\bF_\bl_\bo_\ba_\bt_\bC_\bm_\bp_\bO_\bp_\bs_\b:_\b:_\be_\bq\n-bool eq(const ValueType &first, const ValueType &second) const\n-test for equality using epsilon\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn float_cmp.cc:451\n-_\bD_\bu_\bn_\be_\b:_\b:_\bF_\bl_\bo_\ba_\bt_\bC_\bm_\bp_\bO_\bp_\bs_\b:_\b:_\bc_\bs_\bt_\by_\bl_\be\n-static const CmpStyle cstyle\n-How comparisons are done.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn float_cmp.hh:295\n-_\bD_\bu_\bn_\be_\b:_\b:_\bF_\bl_\bo_\ba_\bt_\bC_\bm_\bp_\bO_\bp_\bs_\b:_\b:_\bl_\bt\n-bool lt(const ValueType &first, const ValueType &second) const\n-test if first lesser than second\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn float_cmp.cc:472\n-_\bD_\bu_\bn_\be_\b:_\b:_\bF_\bl_\bo_\ba_\bt_\bC_\bm_\bp_\bO_\bp_\bs_\b:_\b:_\bg_\be\n-bool ge(const ValueType &first, const ValueType &second) const\n-test if first greater or equal second\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn float_cmp.cc:479\n-_\bD_\bu_\bn_\be_\b:_\b:_\bF_\bl_\bo_\ba_\bt_\bC_\bm_\bp_\bO_\bp_\bs_\b:_\b:_\br_\bs_\bt_\by_\bl_\be\n-static const RoundingStyle rstyle\n-How rounding is done.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn float_cmp.hh:297\n-_\bD_\bu_\bn_\be_\b:_\b:_\bF_\bl_\bo_\ba_\bt_\bC_\bm_\bp_\bO_\bp_\bs_\b:_\b:_\bE_\bp_\bs_\bi_\bl_\bo_\bn_\bT_\by_\bp_\be\n-FloatCmp::EpsilonType< T >::Type EpsilonType\n-Type of the epsilon.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn float_cmp.hh:304\n-_\bD_\bu_\bn_\be_\b:_\b:_\bF_\bl_\bo_\ba_\bt_\bC_\bm_\bp_\bO_\bp_\bs_\b:_\b:_\bn_\be\n-bool ne(const ValueType &first, const ValueType &second) const\n-test for inequality using epsilon\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn float_cmp.cc:458\n-_\bD_\bu_\bn_\be_\b:_\b:_\bF_\bl_\bo_\ba_\bt_\bC_\bm_\bp_\bO_\bp_\bs_\b:_\b:_\bV_\ba_\bl_\bu_\be_\bT_\by_\bp_\be\n-T ValueType\n-Type of the values to compare.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn float_cmp.hh:299\n-_\bD_\bu_\bn_\be_\b:_\b:_\bF_\bl_\bo_\ba_\bt_\bC_\bm_\bp_\bO_\bp_\bs_\b:_\b:_\be_\bp_\bs_\bi_\bl_\bo_\bn\n-EpsilonType epsilon() const\n-return the current epsilon\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn float_cmp.cc:436\n-_\bD_\bu_\bn_\be_\b:_\b:_\bF_\bl_\bo_\ba_\bt_\bC_\bm_\bp_\bO_\bp_\bs_\b:_\b:_\br_\bo_\bu_\bn_\bd\n-I round(const ValueType &val) const\n-round using epsilon\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn float_cmp.cc:495\n-_\bD_\bu_\bn_\be_\b:_\b:_\bF_\bl_\bo_\ba_\bt_\bC_\bm_\bp_\bO_\bp_\bs_\b:_\b:_\bt_\br_\bu_\bn_\bc\n-I trunc(const ValueType &val) const\n-truncate using epsilon\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn float_cmp.cc:503\n-_\bD_\bu_\bn_\be_\b:_\b:_\bF_\bl_\bo_\ba_\bt_\bC_\bm_\bp_\bO_\bp_\bs_\b:_\b:_\bg_\bt\n-bool gt(const ValueType &first, const ValueType &second) const\n-test if first greater than second\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn float_cmp.cc:465\n ===============================================================================\n Generated by\u00a0_\b[_\bd_\bo_\bx_\by_\bg_\be_\bn_\b] 1.9.8\n"}]}, {"source1": "./usr/share/doc/libdune-common-doc/doxygen/a00113.html", "source2": "./usr/share/doc/libdune-common-doc/doxygen/a00113.html", "unified_diff": "@@ -1,15 +1,15 @@\n \n \n \n \n \n \n \n-dune-common: parametertree.cc File Reference\n+dune-common: bitsetvector.hh File Reference\n \n \n \n \n \n \n \n@@ -69,27 +69,61 @@\n \n
    \n \n
    \n
    \n
    \n-
    parametertree.cc File Reference
    \n+ \n+
    bitsetvector.hh File Reference
    \n
    \n
    \n-
    #include <cstdlib>
    \n+\n+

    Efficient implementation of a dynamic array of static arrays of booleans. \n+More...

    \n+
    #include <vector>
    \n+#include <bitset>
    \n #include <iostream>
    \n-#include <ostream>
    \n-#include <string>
    \n-#include <sstream>
    \n-#include <fstream>
    \n-#include <set>
    \n #include <algorithm>
    \n-#include <dune/common/exceptions.hh>
    \n-#include <dune/common/parametertree.hh>
    \n+#include <dune/common/boundschecking.hh>
    \n+#include <dune/common/genericiterator.hh>
    \n+#include <dune/common/exceptions.hh>
    \n+
    \n+

    Go to the source code of this file.

    \n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+

    \n+Classes

    class  Dune::BitSetVectorConstReference< block_size, Alloc >
     A proxy class that acts as a const reference to a single bitset in a BitSetVector. More...
     
    class  Dune::BitSetVectorReference< block_size, Alloc >
     A proxy class that acts as a mutable reference to a single bitset in a BitSetVector. More...
     
    struct  Dune::const_reference< BitSetVectorReference< block_size, Alloc > >
     
    struct  Dune::const_reference< BitSetVectorConstReference< block_size, Alloc > >
     
    struct  Dune::mutable_reference< BitSetVectorReference< block_size, Alloc > >
     
    struct  Dune::mutable_reference< BitSetVectorConstReference< block_size, Alloc > >
     
    class  Dune::BitSetVector< block_size, Allocator >
     A dynamic array of blocks of booleans. More...
     
    \n+\n+\n+\n+\n+

    \n+Namespaces

    namespace  Dune
     Dune namespace.
     
    \n+

    Detailed Description

    \n+

    Efficient implementation of a dynamic array of static arrays of booleans.

    \n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,19 +1,48 @@\n dune-common\u00a02.10\n Loading...\n Searching...\n No Matches\n * _\bd_\bu_\bn_\be\n * _\bc_\bo_\bm_\bm_\bo_\bn\n-parametertree.cc File Reference\n-#include \n+_\bC_\bl_\ba_\bs_\bs_\be_\bs | _\bN_\ba_\bm_\be_\bs_\bp_\ba_\bc_\be_\bs\n+bitsetvector.hh File Reference\n+Efficient implementation of a dynamic array of static arrays of booleans.\n+_\bM_\bo_\br_\be_\b._\b._\b.\n+#include \n+#include \n #include \n-#include \n-#include \n-#include \n-#include \n-#include \n #include \n+#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bb_\bo_\bu_\bn_\bd_\bs_\bc_\bh_\be_\bc_\bk_\bi_\bn_\bg_\b._\bh_\bh>\n+#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bg_\be_\bn_\be_\br_\bi_\bc_\bi_\bt_\be_\br_\ba_\bt_\bo_\br_\b._\bh_\bh>\n #include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\be_\bx_\bc_\be_\bp_\bt_\bi_\bo_\bn_\bs_\b._\bh_\bh>\n-#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bp_\ba_\br_\ba_\bm_\be_\bt_\be_\br_\bt_\br_\be_\be_\b._\bh_\bh>\n+_\bG_\bo_\b _\bt_\bo_\b _\bt_\bh_\be_\b _\bs_\bo_\bu_\br_\bc_\be_\b _\bc_\bo_\bd_\be_\b _\bo_\bf_\b _\bt_\bh_\bi_\bs_\b _\bf_\bi_\bl_\be_\b.\n+C\bCl\bla\bas\bss\bse\bes\bs\n+ class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bB_\bi_\bt_\bS_\be_\bt_\bV_\be_\bc_\bt_\bo_\br_\bC_\bo_\bn_\bs_\bt_\bR_\be_\bf_\be_\br_\be_\bn_\bc_\be_\b<_\b _\bb_\bl_\bo_\bc_\bk_\b__\bs_\bi_\bz_\be_\b,_\b _\bA_\bl_\bl_\bo_\bc_\b _\b>\n+\u00a0 A proxy class that acts as a const reference to a single bitset in a\n+ _\bB_\bi_\bt_\bS_\be_\bt_\bV_\be_\bc_\bt_\bo_\br. _\bM_\bo_\br_\be_\b._\b._\b.\n+\u00a0\n+ class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bB_\bi_\bt_\bS_\be_\bt_\bV_\be_\bc_\bt_\bo_\br_\bR_\be_\bf_\be_\br_\be_\bn_\bc_\be_\b<_\b _\bb_\bl_\bo_\bc_\bk_\b__\bs_\bi_\bz_\be_\b,_\b _\bA_\bl_\bl_\bo_\bc_\b _\b>\n+\u00a0 A proxy class that acts as a mutable reference to a single bitset in a\n+ _\bB_\bi_\bt_\bS_\be_\bt_\bV_\be_\bc_\bt_\bo_\br. _\bM_\bo_\br_\be_\b._\b._\b.\n+\u00a0\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bc_\bo_\bn_\bs_\bt_\b__\br_\be_\bf_\be_\br_\be_\bn_\bc_\be_\b<_\b _\bB_\bi_\bt_\bS_\be_\bt_\bV_\be_\bc_\bt_\bo_\br_\bR_\be_\bf_\be_\br_\be_\bn_\bc_\be_\b<_\b _\bb_\bl_\bo_\bc_\bk_\b__\bs_\bi_\bz_\be_\b,_\b _\bA_\bl_\bl_\bo_\bc_\b _\b>_\b _\b>\n+\u00a0\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bc_\bo_\bn_\bs_\bt_\b__\br_\be_\bf_\be_\br_\be_\bn_\bc_\be_\b<_\b _\bB_\bi_\bt_\bS_\be_\bt_\bV_\be_\bc_\bt_\bo_\br_\bC_\bo_\bn_\bs_\bt_\bR_\be_\bf_\be_\br_\be_\bn_\bc_\be_\b<_\b _\bb_\bl_\bo_\bc_\bk_\b__\bs_\bi_\bz_\be_\b,_\b _\bA_\bl_\bl_\bo_\bc_\b _\b>\n+ _\b>\n+\u00a0\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bm_\bu_\bt_\ba_\bb_\bl_\be_\b__\br_\be_\bf_\be_\br_\be_\bn_\bc_\be_\b<_\b _\bB_\bi_\bt_\bS_\be_\bt_\bV_\be_\bc_\bt_\bo_\br_\bR_\be_\bf_\be_\br_\be_\bn_\bc_\be_\b<_\b _\bb_\bl_\bo_\bc_\bk_\b__\bs_\bi_\bz_\be_\b,_\b _\bA_\bl_\bl_\bo_\bc_\b _\b>_\b _\b>\n+\u00a0\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bm_\bu_\bt_\ba_\bb_\bl_\be_\b__\br_\be_\bf_\be_\br_\be_\bn_\bc_\be_\b<_\b _\bB_\bi_\bt_\bS_\be_\bt_\bV_\be_\bc_\bt_\bo_\br_\bC_\bo_\bn_\bs_\bt_\bR_\be_\bf_\be_\br_\be_\bn_\bc_\be_\b<_\b _\bb_\bl_\bo_\bc_\bk_\b__\bs_\bi_\bz_\be_\b,_\b _\bA_\bl_\bl_\bo_\bc\n+ _\b>_\b _\b>\n+\u00a0\n+ class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bB_\bi_\bt_\bS_\be_\bt_\bV_\be_\bc_\bt_\bo_\br_\b<_\b _\bb_\bl_\bo_\bc_\bk_\b__\bs_\bi_\bz_\be_\b,_\b _\bA_\bl_\bl_\bo_\bc_\ba_\bt_\bo_\br_\b _\b>\n+\u00a0 A dynamic array of blocks of booleans. _\bM_\bo_\br_\be_\b._\b._\b.\n+\u00a0\n+N\bNa\bam\bme\bes\bsp\bpa\bac\bce\bes\bs\n+namespace \u00a0 _\bD_\bu_\bn_\be\n+\u00a0 _\bD_\bu_\bn_\be namespace.\n+\u00a0\n+*\b**\b**\b**\b**\b* D\bDe\bet\bta\bai\bil\ble\bed\bd D\bDe\bes\bsc\bcr\bri\bip\bpt\bti\bio\bon\bn *\b**\b**\b**\b**\b*\n+Efficient implementation of a dynamic array of static arrays of booleans.\n ===============================================================================\n Generated by\u00a0_\b[_\bd_\bo_\bx_\by_\bg_\be_\bn_\b] 1.9.8\n"}]}, {"source1": "./usr/share/doc/libdune-common-doc/doxygen/a00116.html", "source2": "./usr/share/doc/libdune-common-doc/doxygen/a00116.html", "unified_diff": "@@ -1,15 +1,15 @@\n \n \n \n \n \n \n \n-dune-common: documentation.hh File Reference\n+dune-common: poolallocator.hh File Reference\n \n \n \n \n \n \n \n@@ -72,44 +72,84 @@\n
  • dune
  • common
  • \n
    \n \n
    \n \n-
    documentation.hh File Reference
    \n+Functions
    \n+
    poolallocator.hh File Reference
    \n \n
    \n \n-

    Documentation related stuff. \n+

    An stl-compliant pool allocator. \n More...

    \n-\n+
    #include <numeric>
    \n+#include <typeinfo>
    \n+#include <iostream>
    \n+#include <cassert>
    \n+#include <new>
    \n+
    \n

    Go to the source code of this file.

    \n \n \n-\n-\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n \n

    \n Classes

    struct  Dune::ImplementationDefined
     Dummy struct used for documentation purposes. More...
    class  Dune::Pool< T, s >
     A memory pool of objects. More...
     
    class  Dune::PoolAllocator< T, s >
     An allocator managing a pool of objects for reuse. More...
     
    struct  Dune::PoolAllocator< T, s >::rebind< U >
     Rebind the allocator to another type. More...
     
    class  Dune::PoolAllocator< void, s >
     
    struct  Dune::PoolAllocator< void, s >::rebind< U >
     
    \n \n \n \n \n+\n+\n+\n

    \n Namespaces

    namespace  Dune
     Dune namespace.
     
    namespace  std
     STL namespace.
     
    \n-\n-\n-\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n

    \n-Enumerations

    enum  { Dune::implementationDefined\n- }
     

    \n+Functions

    template<typename T1 , std::size_t t1, typename T2 , std::size_t t2>
    bool Dune::operator== (const PoolAllocator< T1, t1 > &, const PoolAllocator< T2, t2 > &)
     
    template<typename T1 , std::size_t t1, typename T2 , std::size_t t2>
    bool Dune::operator!= (const PoolAllocator< T1, t1 > &, const PoolAllocator< T2, t2 > &)
     
    template<typename T , std::size_t t1, std::size_t t2>
    bool Dune::operator== (const PoolAllocator< T, t1 > &p1, const PoolAllocator< T, t2 > &p2)
     
    template<typename T , std::size_t t1, std::size_t t2>
    bool Dune::operator!= (const PoolAllocator< T, t1 > &p1, const PoolAllocator< T, t2 > &p2)
     
    template<typename T , std::size_t t1, std::size_t t2>
    bool Dune::operator== (const PoolAllocator< void, t1 > &, const PoolAllocator< T, t2 > &)
     
    template<typename T , std::size_t t1, std::size_t t2>
    bool Dune::operator!= (const PoolAllocator< void, t1 > &, const PoolAllocator< T, t2 > &)
     
    template<std::size_t t1, std::size_t t2>
    bool Dune::operator== (const PoolAllocator< void, t1 > &p1, const PoolAllocator< void, t2 > &p2)
     
    template<std::size_t t1, std::size_t t2>
    bool Dune::operator!= (const PoolAllocator< void, t1 > &p1, const PoolAllocator< void, t2 > &p2)
     
    \n

    Detailed Description

    \n-

    Documentation related stuff.

    \n+

    An stl-compliant pool allocator.

    \n+

    This file implements the classes Pool and PoolAllocator providing memory allocation for objects in chunks.

    Author
    Markus Blatt
    \n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,25 +1,77 @@\n dune-common\u00a02.10\n Loading...\n Searching...\n No Matches\n * _\bd_\bu_\bn_\be\n * _\bc_\bo_\bm_\bm_\bo_\bn\n-_\bC_\bl_\ba_\bs_\bs_\be_\bs | _\bN_\ba_\bm_\be_\bs_\bp_\ba_\bc_\be_\bs | _\bE_\bn_\bu_\bm_\be_\br_\ba_\bt_\bi_\bo_\bn_\bs\n-documentation.hh File Reference\n-Documentation related stuff. _\bM_\bo_\br_\be_\b._\b._\b.\n+_\bC_\bl_\ba_\bs_\bs_\be_\bs | _\bN_\ba_\bm_\be_\bs_\bp_\ba_\bc_\be_\bs | _\bF_\bu_\bn_\bc_\bt_\bi_\bo_\bn_\bs\n+poolallocator.hh File Reference\n+An stl-compliant pool allocator. _\bM_\bo_\br_\be_\b._\b._\b.\n+#include \n+#include \n+#include \n+#include \n+#include \n _\bG_\bo_\b _\bt_\bo_\b _\bt_\bh_\be_\b _\bs_\bo_\bu_\br_\bc_\be_\b _\bc_\bo_\bd_\be_\b _\bo_\bf_\b _\bt_\bh_\bi_\bs_\b _\bf_\bi_\bl_\be_\b.\n C\bCl\bla\bas\bss\bse\bes\bs\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bI_\bm_\bp_\bl_\be_\bm_\be_\bn_\bt_\ba_\bt_\bi_\bo_\bn_\bD_\be_\bf_\bi_\bn_\be_\bd\n-\u00a0 Dummy struct used for documentation purposes. _\bM_\bo_\br_\be_\b._\b._\b.\n+ class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bP_\bo_\bo_\bl_\b<_\b _\bT_\b,_\b _\bs_\b _\b>\n+\u00a0 A memory pool of objects. _\bM_\bo_\br_\be_\b._\b._\b.\n+\u00a0\n+ class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bP_\bo_\bo_\bl_\bA_\bl_\bl_\bo_\bc_\ba_\bt_\bo_\br_\b<_\b _\bT_\b,_\b _\bs_\b _\b>\n+\u00a0 An allocator managing a pool of objects for reuse. _\bM_\bo_\br_\be_\b._\b._\b.\n+\u00a0\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bP_\bo_\bo_\bl_\bA_\bl_\bl_\bo_\bc_\ba_\bt_\bo_\br_\b<_\b _\bT_\b,_\b _\bs_\b _\b>_\b:_\b:_\br_\be_\bb_\bi_\bn_\bd_\b<_\b _\bU_\b _\b>\n+\u00a0 Rebind the allocator to another type. _\bM_\bo_\br_\be_\b._\b._\b.\n+\u00a0\n+ class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bP_\bo_\bo_\bl_\bA_\bl_\bl_\bo_\bc_\ba_\bt_\bo_\br_\b<_\b _\bv_\bo_\bi_\bd_\b,_\b _\bs_\b _\b>\n+\u00a0\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bP_\bo_\bo_\bl_\bA_\bl_\bl_\bo_\bc_\ba_\bt_\bo_\br_\b<_\b _\bv_\bo_\bi_\bd_\b,_\b _\bs_\b _\b>_\b:_\b:_\br_\be_\bb_\bi_\bn_\bd_\b<_\b _\bU_\b _\b>\n \u00a0\n N\bNa\bam\bme\bes\bsp\bpa\bac\bce\bes\bs\n namespace \u00a0 _\bD_\bu_\bn_\be\n \u00a0 _\bD_\bu_\bn_\be namespace.\n \u00a0\n-E\bEn\bnu\bum\bme\ber\bra\bat\bti\bio\bon\bns\bs\n-enum \u00a0 { _\bD_\bu_\bn_\be_\b:_\b:_\bi_\bm_\bp_\bl_\be_\bm_\be_\bn_\bt_\ba_\bt_\bi_\bo_\bn_\bD_\be_\bf_\bi_\bn_\be_\bd }\n+namespace \u00a0 _\bs_\bt_\bd\n+\u00a0 STL namespace.\n+\u00a0\n+F\bFu\bun\bnc\bct\bti\bio\bon\bns\bs\n+template\n+bool\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b=_\b= (const _\bP_\bo_\bo_\bl_\bA_\bl_\bl_\bo_\bc_\ba_\bt_\bo_\br< T1, t1 > &, const _\bP_\bo_\bo_\bl_\bA_\bl_\bl_\bo_\bc_\ba_\bt_\bo_\br<\n+ T2, t2 > &)\n+\u00a0\n+template\n+bool\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b!_\b= (const _\bP_\bo_\bo_\bl_\bA_\bl_\bl_\bo_\bc_\ba_\bt_\bo_\br< T1, t1 > &, const _\bP_\bo_\bo_\bl_\bA_\bl_\bl_\bo_\bc_\ba_\bt_\bo_\br<\n+ T2, t2 > &)\n+\u00a0\n+template\n+bool\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b=_\b= (const _\bP_\bo_\bo_\bl_\bA_\bl_\bl_\bo_\bc_\ba_\bt_\bo_\br< T, t1 > &p1, const _\bP_\bo_\bo_\bl_\bA_\bl_\bl_\bo_\bc_\ba_\bt_\bo_\br<\n+ T, t2 > &p2)\n+\u00a0\n+template\n+bool\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b!_\b= (const _\bP_\bo_\bo_\bl_\bA_\bl_\bl_\bo_\bc_\ba_\bt_\bo_\br< T, t1 > &p1, const _\bP_\bo_\bo_\bl_\bA_\bl_\bl_\bo_\bc_\ba_\bt_\bo_\br<\n+ T, t2 > &p2)\n+\u00a0\n+template\n+bool\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b=_\b= (const _\bP_\bo_\bo_\bl_\bA_\bl_\bl_\bo_\bc_\ba_\bt_\bo_\br< void, t1 > &, const _\bP_\bo_\bo_\bl_\bA_\bl_\bl_\bo_\bc_\ba_\bt_\bo_\br<\n+ T, t2 > &)\n+\u00a0\n+template\n+bool\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b!_\b= (const _\bP_\bo_\bo_\bl_\bA_\bl_\bl_\bo_\bc_\ba_\bt_\bo_\br< void, t1 > &, const _\bP_\bo_\bo_\bl_\bA_\bl_\bl_\bo_\bc_\ba_\bt_\bo_\br<\n+ T, t2 > &)\n+\u00a0\n+template\n+bool\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b=_\b= (const _\bP_\bo_\bo_\bl_\bA_\bl_\bl_\bo_\bc_\ba_\bt_\bo_\br< void, t1 > &p1, const\n+ _\bP_\bo_\bo_\bl_\bA_\bl_\bl_\bo_\bc_\ba_\bt_\bo_\br< void, t2 > &p2)\n+\u00a0\n+template\n+bool\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b!_\b= (const _\bP_\bo_\bo_\bl_\bA_\bl_\bl_\bo_\bc_\ba_\bt_\bo_\br< void, t1 > &p1, const\n+ _\bP_\bo_\bo_\bl_\bA_\bl_\bl_\bo_\bc_\ba_\bt_\bo_\br< void, t2 > &p2)\n \u00a0\n *\b**\b**\b**\b**\b* D\bDe\bet\bta\bai\bil\ble\bed\bd D\bDe\bes\bsc\bcr\bri\bip\bpt\bti\bio\bon\bn *\b**\b**\b**\b**\b*\n-Documentation related stuff.\n+An stl-compliant pool allocator.\n+This file implements the classes Pool and PoolAllocator providing memory\n+allocation for objects in chunks.\n+ Author\n+ Markus Blatt\n ===============================================================================\n Generated by\u00a0_\b[_\bd_\bo_\bx_\by_\bg_\be_\bn_\b] 1.9.8\n"}]}, {"source1": "./usr/share/doc/libdune-common-doc/doxygen/a00116_source.html", "source2": "./usr/share/doc/libdune-common-doc/doxygen/a00116_source.html", "unified_diff": "@@ -1,15 +1,15 @@\n \n \n \n \n \n \n \n-dune-common: documentation.hh Source File\n+dune-common: poolallocator.hh Source File\n \n \n \n \n \n \n \n@@ -74,38 +74,519 @@\n \n
    \n \n
    \n
    \n
    \n-
    documentation.hh
    \n+
    poolallocator.hh
    \n
    \n
    \n Go to the documentation of this file.
    1// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
    \n
    2// vi: set et ts=4 sw=2 sts=2:
    \n
    3// SPDX-FileCopyrightInfo: Copyright \u00a9 DUNE Project contributors, see file LICENSE.md in module root
    \n
    4// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception
    \n-
    5
    \n-
    6#ifndef DUNE_COMMON_DOCUMENTATION_HH
    \n-
    7#define DUNE_COMMON_DOCUMENTATION_HH
    \n-
    8
    \n-
    13namespace Dune {
    \n-
    14
    \n-\n-
    43
    \n-\n-
    56
    \n-
    57}
    \n-
    58
    \n-
    59
    \n-
    60#endif // DUNE_COMMON_DOCUMENTATION_HH
    \n+
    5#ifndef DUNE_COMMON_POOLALLOCATOR_HH
    \n+
    6#define DUNE_COMMON_POOLALLOCATOR_HH
    \n+
    7
    \n+
    12#include <numeric>
    \n+
    13#include <typeinfo>
    \n+
    14#include <iostream>
    \n+
    15#include <cassert>
    \n+
    16#include <new>
    \n+
    17
    \n+
    18#ifndef DOXYGEN
    \n+
    19// forward declarations.
    \n+
    20// we need to know the test function to declare it friend
    \n+
    21template<std::size_t size, typename T>
    \n+
    22struct testPoolMain;
    \n+
    23#endif
    \n+
    24
    \n+
    25namespace Dune
    \n+
    26{
    \n+
    27
    \n+
    28 template<typename T, std::size_t s>
    \n+
    29 class Pool;
    \n+
    30
    \n+
    31 template<typename T, std::size_t s>
    \n+
    32 class PoolAllocator;
    \n+
    33
    \n+
    34}
    \n+
    35
    \n+
    36namespace std
    \n+
    37{
    \n+
    38 /*
    \n+
    39 template<class T, std::size_t S>
    \n+
    40 inline ostream& operator<<(ostream& os, Dune::Pool<T,S>& pool)
    \n+
    41 {
    \n+
    42 os<<"pool="<<&pool<<" allocated_="<<pool.allocated_;
    \n+
    43 return os;
    \n+
    44 }
    \n+
    45
    \n+
    46 template<class T, std::size_t S>
    \n+
    47 inline ostream& operator<<(ostream& os, Dune::PoolAllocator<T,S>& pool)
    \n+
    48 {
    \n+
    49 os<<pool.memoryPool_<<std::endl;
    \n+
    50 return os;
    \n+
    51 }
    \n+
    52 */
    \n+
    53}
    \n+
    54
    \n+
    55
    \n+
    56namespace Dune
    \n+
    57{
    \n+
    88 template<class T, std::size_t s>
    \n+
    \n+
    89 class Pool
    \n+
    90 {
    \n+
    91 // make the test function friend
    \n+
    92 friend struct ::testPoolMain<s,T>;
    \n+
    93
    \n+
    94 //friend std::ostream& std::operator<<<>(std::ostream&,Pool<T,s>&);
    \n+
    95 template< class, std::size_t > friend class PoolAllocator;
    \n+
    96
    \n+
    97 private:
    \n+
    98
    \n+
    100 struct Reference
    \n+
    101 {
    \n+
    102 Reference *next_;
    \n+
    103 };
    \n+
    104
    \n+
    105 public:
    \n+
    106
    \n+
    108 typedef T MemberType;
    \n+
    109
    \n+
    113 constexpr static int unionSize = (sizeof(MemberType) < sizeof(Reference)) ?
    \n+
    114 sizeof(Reference) : sizeof(MemberType);
    \n+
    115
    \n+
    120 constexpr static int size = (sizeof(MemberType) <= s && sizeof(Reference) <= s) ?
    \n+
    121 s : unionSize;
    \n+
    122
    \n+
    127 constexpr static int alignment = std::lcm(alignof(MemberType), alignof(Reference));
    \n+
    128
    \n+
    135 constexpr static int alignedSize = (unionSize % alignment == 0) ?
    \n+
    136 unionSize :
    \n+
    137 ((unionSize / alignment + 1) * alignment);
    \n+
    138
    \n+
    144 constexpr static int chunkSize = (size % alignment == 0) ?
    \n+
    145 size : ((size / alignment + 1)* alignment);
    \n+
    146
    \n+
    150 constexpr static int elements = (chunkSize / alignedSize);
    \n+
    151
    \n+
    152 private:
    \n+
    154 struct Chunk
    \n+
    155 {
    \n+
    156
    \n+
    157 //friend int testPool<s,T>();
    \n+
    158
    \n+
    160 alignas(alignment) char chunk_[chunkSize];
    \n+
    161
    \n+
    163 Chunk *next_;
    \n+
    164 };
    \n+
    165
    \n+
    166 public:
    \n+
    \n+
    168 inline Pool();
    \n+
    \n+
    170 inline ~Pool();
    \n+
    \n+
    175 inline void* allocate();
    \n+
    \n+
    180 inline void free(void* o);
    \n+
    181
    \n+
    \n+
    185 inline void print(std::ostream& os);
    \n+
    186
    \n+
    187 private:
    \n+
    188
    \n+
    189 // Prevent Copying!
    \n+
    190 Pool(const Pool<MemberType,s>&);
    \n+
    191
    \n+
    192 void operator=(const Pool<MemberType,s>& pool) const;
    \n+
    194 inline void grow();
    \n+
    196 Reference *head_;
    \n+
    198 Chunk *chunks_;
    \n+
    199 /* @brief The number of currently allocated elements. */
    \n+
    200 //size_t allocated_;
    \n+
    201
    \n+
    202 };
    \n+
    203
    \n+
    221 template<class T, std::size_t s>
    \n+
    \n+\n+
    223 {
    \n+
    224 //friend std::ostream& std::operator<<<>(std::ostream&,PoolAllocator<T,s>&);
    \n+
    225
    \n+
    226 public:
    \n+
    230 typedef T value_type;
    \n+
    231
    \n+
    236 constexpr static int size = s * sizeof(value_type);
    \n+
    237
    \n+
    241 typedef T* pointer;
    \n+
    242
    \n+
    246 typedef const T* const_pointer;
    \n+
    247
    \n+
    251 typedef T& reference;
    \n+
    252
    \n+
    256 typedef const T& const_reference;
    \n+
    257
    \n+
    261 typedef std::size_t size_type;
    \n+
    262
    \n+
    266 typedef std::ptrdiff_t difference_type;
    \n+
    267
    \n+
    271 inline PoolAllocator();
    \n+
    272
    \n+
    276 template<typename U, std::size_t u>
    \n+
    \n+\n+
    278 {
    \n+
    279 // we allow copying but never copy the pool
    \n+
    280 // to have a clear ownership of allocated pointers.
    \n+
    281 }
    \n+
    \n+
    282
    \n+
    \n+\n+
    285 {
    \n+
    286 // we allow copying but never copy the pool
    \n+
    287 // to have a clear ownership of allocated pointers.
    \n+
    288 // For this behaviour we have to implement
    \n+
    289 // the copy constructor, because the default
    \n+
    290 // one would copy the pool and deallocation
    \n+
    291 // of it would break.
    \n+
    292 }
    \n+
    \n+
    299 inline pointer allocate(std::size_t n, const_pointer hint=0);
    \n+
    300
    \n+
    308 inline void deallocate(pointer p, std::size_t n);
    \n+
    309
    \n+
    315 inline void construct(pointer p, const_reference value);
    \n+
    316
    \n+
    321 inline void destroy(pointer p);
    \n+
    322
    \n+
    326 inline pointer address(reference x) const { return &x; }
    \n+
    327
    \n+
    328
    \n+
    332 inline const_pointer address(const_reference x) const { return &x; }
    \n+
    333
    \n+
    337 inline int max_size() const noexcept { return 1; }
    \n+
    338
    \n+
    342 template<class U>
    \n+
    \n+
    343 struct rebind
    \n+
    344 {
    \n+\n+
    346 };
    \n+
    \n+
    347
    \n+\n+
    350
    \n+
    351 private:
    \n+
    355 PoolType memoryPool_;
    \n+
    356 };
    \n+
    \n+
    357
    \n+
    358 // specialization for void
    \n+
    359 template <std::size_t s>
    \n+
    \n+
    360 class PoolAllocator<void,s>
    \n+
    361 {
    \n+
    362 public:
    \n+
    363 typedef void* pointer;
    \n+
    364 typedef const void* const_pointer;
    \n+
    365 // reference to void members are impossible.
    \n+
    366 typedef void value_type;
    \n+
    \n+
    367 template <class U> struct rebind
    \n+
    368 {
    \n+\n+
    370 };
    \n+
    \n+
    371 };
    \n+
    \n+
    372
    \n+
    373
    \n+
    374 template<typename T1, std::size_t t1, typename T2, std::size_t t2>
    \n+
    \n+\n+
    376 {
    \n+
    377 return false;
    \n+
    378 }
    \n+
    \n+
    379
    \n+
    380
    \n+
    381 template<typename T1, std::size_t t1, typename T2, std::size_t t2>
    \n+
    \n+\n+
    383 {
    \n+
    384 return true;
    \n+
    385 }
    \n+
    \n+
    386
    \n+
    387 template<typename T, std::size_t t1, std::size_t t2>
    \n+
    \n+\n+
    389 {
    \n+
    390 return &p1==&p2;
    \n+
    391 }
    \n+
    \n+
    392
    \n+
    393
    \n+
    394 template<typename T, std::size_t t1, std::size_t t2>
    \n+
    \n+\n+
    396 {
    \n+
    397 return &p1 != &p2;
    \n+
    398 }
    \n+
    \n+
    399
    \n+
    400 template<typename T, std::size_t t1, std::size_t t2>
    \n+
    \n+\n+
    402 {
    \n+
    403 return false;
    \n+
    404 }
    \n+
    \n+
    405
    \n+
    406
    \n+
    407 template<typename T, std::size_t t1, std::size_t t2>
    \n+
    \n+\n+
    409 {
    \n+
    410 return true;
    \n+
    411 }
    \n+
    \n+
    412
    \n+
    413 template<std::size_t t1, std::size_t t2>
    \n+
    \n+\n+
    415 {
    \n+
    416 return &p1==&p2;
    \n+
    417 }
    \n+
    \n+
    418
    \n+
    419 template<std::size_t t1, std::size_t t2>
    \n+
    \n+\n+
    421 {
    \n+
    422 return &p1!=&p2;
    \n+
    423 }
    \n+
    \n+
    424
    \n+
    425 template<class T, std::size_t S>
    \n+
    \n+\n+
    427 : head_(0), chunks_(0) //, allocated_(0)
    \n+
    428 {
    \n+
    429 static_assert(sizeof(T)<=unionSize, "Library Error: type T is too big");
    \n+
    430 static_assert(sizeof(Reference)<=unionSize, "Library Error: type of reference is too big");
    \n+
    431 static_assert(unionSize<=alignedSize, "Library Error: alignedSize too small");
    \n+
    432 static_assert(sizeof(T)<=chunkSize, "Library Error: chunkSize must be able to hold at least one value");
    \n+
    433 static_assert(sizeof(Reference)<=chunkSize, "Library Error: chunkSize must be able to hold at least one reference");
    \n+
    434 static_assert(chunkSize % alignment == 0, "Library Error: compiler cannot calculate!");
    \n+
    435 static_assert(elements>=1, "Library Error: we need to hold at least one element!");
    \n+
    436 static_assert(elements*alignedSize<=chunkSize, "Library Error: aligned elements must fit into chuck!");
    \n+
    437 }
    \n+
    \n+
    438
    \n+
    439 template<class T, std::size_t S>
    \n+
    \n+\n+
    441 {
    \n+
    442 /*
    \n+
    443 if(allocated_!=0)
    \n+
    444 std::cerr<<"There are still "<<allocated_<<" allocated elements by the Pool<"<<typeid(T).name()<<","<<S<<"> "
    \n+
    445 <<static_cast<void*>(this)<<"! This is a memory leak and might result in segfaults"
    \n+
    446 <<std::endl;
    \n+
    447 */
    \n+
    448 // delete the allocated chunks.
    \n+
    449 Chunk *current=chunks_;
    \n+
    450
    \n+
    451 while(current!=0)
    \n+
    452 {
    \n+
    453 Chunk *tmp = current;
    \n+
    454 current = current->next_;
    \n+
    455 delete tmp;
    \n+
    456 }
    \n+
    457 }
    \n+
    \n+
    458
    \n+
    459 template<class T, std::size_t S>
    \n+
    \n+
    460 inline void Pool<T,S>::print(std::ostream& os)
    \n+
    461 {
    \n+
    462 Chunk* current=chunks_;
    \n+
    463 while(current) {
    \n+
    464 os<<current<<" ";
    \n+
    465 current=current->next_;
    \n+
    466 }
    \n+
    467 os<<current<<" ";
    \n+
    468 }
    \n+
    \n+
    \n+
    469
    \n+
    470 template<class T, std::size_t S>
    \n+
    471 inline void Pool<T,S>::grow()
    \n+
    472 {
    \n+
    473 Chunk *newChunk = new Chunk;
    \n+
    474 newChunk->next_ = chunks_;
    \n+
    475 chunks_ = newChunk;
    \n+
    476
    \n+
    477 char* start = chunks_->chunk_;
    \n+
    478 char* last = &start[elements*alignedSize];
    \n+
    479 Reference* ref = new (start) (Reference);
    \n+
    480
    \n+
    481 // grow is only called if head==0,
    \n+
    482 assert(!head_);
    \n+
    483
    \n+
    484 head_ = ref;
    \n+
    485
    \n+
    486 for(char* element=start+alignedSize; element<last; element=element+alignedSize) {
    \n+
    487 Reference* next = new (element) (Reference);
    \n+
    488 ref->next_ = next;
    \n+
    489 ref = next;
    \n+
    490 }
    \n+
    491 ref->next_=0;
    \n+
    492 }
    \n+
    493
    \n+
    494 template<class T, std::size_t S>
    \n+
    \n+
    495 inline void Pool<T,S>::free(void* b)
    \n+
    496 {
    \n+
    497 if(b) {
    \n+
    498#ifndef NDEBUG
    \n+
    499 Chunk* current=chunks_;
    \n+
    500 while(current) {
    \n+
    501 if(static_cast<void*>(current->chunk_)<=b &&
    \n+
    502 static_cast<void*>(current->chunk_+chunkSize)>b)
    \n+
    503 break;
    \n+
    504 current=current->next_;
    \n+
    505 }
    \n+
    506 if(!current)
    \n+
    507 throw std::bad_alloc();
    \n+
    508#endif
    \n+
    509 Reference* freed = static_cast<Reference*>(b);
    \n+
    510 freed->next_ = head_;
    \n+
    511 head_ = freed;
    \n+
    512 //--allocated_;
    \n+
    513 }
    \n+
    514 else
    \n+
    515 {
    \n+
    516 std::cerr<< "Tried to free null pointer! "<<b<<std::endl;
    \n+
    517 throw std::bad_alloc();
    \n+
    518 }
    \n+
    519 }
    \n+
    \n+
    \n+
    520
    \n+
    521 template<class T, std::size_t S>
    \n+
    \n+
    522 inline void* Pool<T,S>::allocate()
    \n+
    523 {
    \n+
    524 if(!head_)
    \n+
    525 grow();
    \n+
    526
    \n+
    527 Reference* p = head_;
    \n+
    528 head_ = p->next_;
    \n+
    529 //++allocated_;
    \n+
    530 return p;
    \n+
    531 }
    \n+
    \n+
    \n+
    532
    \n+
    533 template<class T, std::size_t s>
    \n+
    \n+\n+
    535 { }
    \n+
    \n+
    536
    \n+
    537 template<class T, std::size_t s>
    \n+
    538 inline typename PoolAllocator<T,s>::pointer
    \n+
    \n+\n+
    540 {
    \n+
    541 if(n==1)
    \n+
    542 return static_cast<T*>(memoryPool_.allocate());
    \n+
    543 else
    \n+
    544 throw std::bad_alloc();
    \n+
    545 }
    \n+
    \n+
    546
    \n+
    547 template<class T, std::size_t s>
    \n+
    \n+
    548 inline void PoolAllocator<T,s>::deallocate(pointer p, std::size_t n)
    \n+
    549 {
    \n+
    550 for(size_t i=0; i<n; i++)
    \n+
    551 memoryPool_.free(p++);
    \n+
    552 }
    \n+
    \n+
    553
    \n+
    554 template<class T, std::size_t s>
    \n+
    \n+\n+
    556 {
    \n+
    557 ::new (static_cast<void*>(p))T(value);
    \n+
    558 }
    \n+
    \n+
    559
    \n+
    560 template<class T, std::size_t s>
    \n+
    561 inline void PoolAllocator<T,s>::destroy(pointer p)
    \n+
    562 {
    \n+
    563 p->~T();
    \n+
    564 }
    \n+
    565
    \n+
    567}
    \n+
    568#endif
    \n+
    \n+
    \n+
    \n+
    void construct(pointer p, const_reference value)
    Construct an object.
    Definition poolallocator.hh:555
    \n+
    void free(void *o)
    Free an object.
    Definition poolallocator.hh:495
    \n+
    ~Pool()
    Destructor.
    Definition poolallocator.hh:440
    \n+
    void * allocate()
    Get a new or recycled object.
    Definition poolallocator.hh:522
    \n+
    void print(std::ostream &os)
    Print elements in pool for debugging.
    Definition poolallocator.hh:460
    \n+
    pointer allocate(std::size_t n, const_pointer hint=0)
    Allocates objects.
    Definition poolallocator.hh:539
    \n+
    Pool()
    Constructor.
    Definition poolallocator.hh:426
    \n+
    void deallocate(pointer p, std::size_t n)
    Free objects.
    Definition poolallocator.hh:548
    \n+
    void destroy(pointer p)
    Destroy an object without freeing memory.
    Definition poolallocator.hh:561
    \n+
    PoolAllocator()
    Constructor.
    Definition poolallocator.hh:534
    \n+
    EnableIfInterOperable< T1, T2, bool >::type operator==(const ForwardIteratorFacade< T1, V1, R1, D > &lhs, const ForwardIteratorFacade< T2, V2, R2, D > &rhs)
    Checks for equality.
    Definition iteratorfacades.hh:238
    \n+
    EnableIfInterOperable< T1, T2, bool >::type operator!=(const ForwardIteratorFacade< T1, V1, R1, D > &lhs, const ForwardIteratorFacade< T2, V2, R2, D > &rhs)
    Checks for inequality.
    Definition iteratorfacades.hh:260
    \n+
    STL namespace.
    \n
    Dune namespace.
    Definition alignedallocator.hh:13
    \n-
    @ implementationDefined
    Definition documentation.hh:55
    \n-
    Dummy struct used for documentation purposes.
    Definition documentation.hh:42
    \n+
    Get the 'const' version of a reference to a mutable object.
    Definition genericiterator.hh:87
    \n+
    A memory pool of objects.
    Definition poolallocator.hh:90
    \n+
    static constexpr int alignment
    The alignment that suits both the MemberType and the Reference (i.e. their least common multiple).
    Definition poolallocator.hh:127
    \n+
    static constexpr int alignedSize
    The aligned size of the type.
    Definition poolallocator.hh:135
    \n+
    static constexpr int chunkSize
    The size of each chunk memory chunk.
    Definition poolallocator.hh:144
    \n+
    static constexpr int size
    Size requirement. At least one object has to stored.
    Definition poolallocator.hh:120
    \n+
    static constexpr int unionSize
    The size of a union of Reference and MemberType.
    Definition poolallocator.hh:113
    \n+
    T MemberType
    The type of object we allocate memory for.
    Definition poolallocator.hh:108
    \n+
    static constexpr int elements
    The number of element each chunk can hold.
    Definition poolallocator.hh:150
    \n+
    An allocator managing a pool of objects for reuse.
    Definition poolallocator.hh:223
    \n+
    Pool< T, size > PoolType
    The type of the memory pool we use.
    Definition poolallocator.hh:349
    \n+
    const_pointer address(const_reference x) const
    Convert a reference to a pointer.
    Definition poolallocator.hh:332
    \n+
    const T & const_reference
    The constant reference type.
    Definition poolallocator.hh:256
    \n+
    std::size_t size_type
    The size type.
    Definition poolallocator.hh:261
    \n+
    T value_type
    Type of the values we construct and allocate.
    Definition poolallocator.hh:230
    \n+
    T & reference
    The reference type.
    Definition poolallocator.hh:251
    \n+
    PoolAllocator(const PoolAllocator &)
    Copy constructor that does not copy the memory pool.
    Definition poolallocator.hh:284
    \n+
    const T * const_pointer
    The constant pointer type.
    Definition poolallocator.hh:246
    \n+
    pointer address(reference x) const
    Convert a reference to a pointer.
    Definition poolallocator.hh:326
    \n+
    T * pointer
    The pointer type.
    Definition poolallocator.hh:241
    \n+
    PoolAllocator(const PoolAllocator< U, u > &)
    Copy Constructor that does not copy the memory pool.
    Definition poolallocator.hh:277
    \n+
    std::ptrdiff_t difference_type
    The difference_type.
    Definition poolallocator.hh:266
    \n+
    int max_size() const noexcept
    Not correctly implemented, yet!
    Definition poolallocator.hh:337
    \n+
    static constexpr int size
    The number of objects to fit into one memory chunk allocated.
    Definition poolallocator.hh:236
    \n+
    Rebind the allocator to another type.
    Definition poolallocator.hh:344
    \n+
    PoolAllocator< U, s > other
    Definition poolallocator.hh:345
    \n+
    void value_type
    Definition poolallocator.hh:366
    \n+
    void * pointer
    Definition poolallocator.hh:363
    \n+
    const void * const_pointer
    Definition poolallocator.hh:364
    \n+
    PoolAllocator< U, s > other
    Definition poolallocator.hh:369
    \n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,38 +1,597 @@\n dune-common\u00a02.10\n Loading...\n Searching...\n No Matches\n * _\bd_\bu_\bn_\be\n * _\bc_\bo_\bm_\bm_\bo_\bn\n-documentation.hh\n+poolallocator.hh\n _\bG_\bo_\b _\bt_\bo_\b _\bt_\bh_\be_\b _\bd_\bo_\bc_\bu_\bm_\be_\bn_\bt_\ba_\bt_\bi_\bo_\bn_\b _\bo_\bf_\b _\bt_\bh_\bi_\bs_\b _\bf_\bi_\bl_\be_\b.\n 1// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-\n 2// vi: set et ts=4 sw=2 sts=2:\n 3// SPDX-FileCopyrightInfo: Copyright \u00c2\u00a9 DUNE Project contributors, see file\n LICENSE.md in module root\n 4// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception\n-5\n-6#ifndef DUNE_COMMON_DOCUMENTATION_HH\n-7#define DUNE_COMMON_DOCUMENTATION_HH\n-8\n-13namespace _\bD_\bu_\bn_\be {\n-14\n-_\b4_\b2 struct _\bI_\bm_\bp_\bl_\be_\bm_\be_\bn_\bt_\ba_\bt_\bi_\bo_\bn_\bD_\be_\bf_\bi_\bn_\be_\bd {};\n-43\n-_\b5_\b5 enum { _\bi_\bm_\bp_\bl_\be_\bm_\be_\bn_\bt_\ba_\bt_\bi_\bo_\bn_\bD_\be_\bf_\bi_\bn_\be_\bd };\n-56\n-57}\n-58\n-59\n-60#endif // DUNE_COMMON_DOCUMENTATION_HH\n+5#ifndef DUNE_COMMON_POOLALLOCATOR_HH\n+6#define DUNE_COMMON_POOLALLOCATOR_HH\n+7\n+12#include \n+13#include \n+14#include \n+15#include \n+16#include \n+17\n+18#ifndef DOXYGEN\n+19// forward declarations.\n+20// we need to know the test function to declare it friend\n+21template\n+22struct testPoolMain;\n+23#endif\n+24\n+25namespace _\bD_\bu_\bn_\be\n+26{\n+27\n+28 template\n+29 class Pool;\n+30\n+31 template\n+32 class PoolAllocator;\n+33\n+34}\n+35\n+36namespace _\bs_\bt_\bd\n+37{\n+38 /*\n+39 template\n+40 inline ostream& operator<<(ostream& os, Dune::Pool& pool)\n+41 {\n+42 os<<\"pool=\"<<&pool<<\" allocated_=\"<\n+47 inline ostream& operator<<(ostream& os, Dune::PoolAllocator& pool)\n+48 {\n+49 os<\n+_\b8_\b9 class _\bP_\bo_\bo_\bl\n+90 {\n+91 // make the test function friend\n+92 friend struct ::testPoolMain;\n+93\n+94 //friend std::ostream& std::operator<<<>(std::ostream&,Pool&);\n+_\b9_\b5 template< class, std::size_t > friend class _\bP_\bo_\bo_\bl_\bA_\bl_\bl_\bo_\bc_\ba_\bt_\bo_\br;\n+96\n+97 private:\n+98\n+100 struct Reference\n+101 {\n+102 Reference *next_;\n+103 };\n+104\n+105 public:\n+106\n+_\b1_\b0_\b8 typedef T _\bM_\be_\bm_\bb_\be_\br_\bT_\by_\bp_\be;\n+109\n+_\b1_\b1_\b3 constexpr static int _\bu_\bn_\bi_\bo_\bn_\bS_\bi_\bz_\be = (sizeof(_\bM_\be_\bm_\bb_\be_\br_\bT_\by_\bp_\be) < sizeof(Reference)) ?\n+114 sizeof(Reference) : sizeof(_\bM_\be_\bm_\bb_\be_\br_\bT_\by_\bp_\be);\n+115\n+_\b1_\b2_\b0 constexpr static int _\bs_\bi_\bz_\be = (sizeof(_\bM_\be_\bm_\bb_\be_\br_\bT_\by_\bp_\be) <= s && sizeof(Reference)\n+<= s) ?\n+121 s : _\bu_\bn_\bi_\bo_\bn_\bS_\bi_\bz_\be;\n+122\n+_\b1_\b2_\b7 constexpr static int _\ba_\bl_\bi_\bg_\bn_\bm_\be_\bn_\bt = std::lcm(alignof(_\bM_\be_\bm_\bb_\be_\br_\bT_\by_\bp_\be), alignof\n+(Reference));\n+128\n+_\b1_\b3_\b5 constexpr static int _\ba_\bl_\bi_\bg_\bn_\be_\bd_\bS_\bi_\bz_\be = (_\bu_\bn_\bi_\bo_\bn_\bS_\bi_\bz_\be % _\ba_\bl_\bi_\bg_\bn_\bm_\be_\bn_\bt == 0) ?\n+136 _\bu_\bn_\bi_\bo_\bn_\bS_\bi_\bz_\be :\n+137 ((_\bu_\bn_\bi_\bo_\bn_\bS_\bi_\bz_\be / _\ba_\bl_\bi_\bg_\bn_\bm_\be_\bn_\bt + 1) * _\ba_\bl_\bi_\bg_\bn_\bm_\be_\bn_\bt);\n+138\n+_\b1_\b4_\b4 constexpr static int _\bc_\bh_\bu_\bn_\bk_\bS_\bi_\bz_\be = (_\bs_\bi_\bz_\be % _\ba_\bl_\bi_\bg_\bn_\bm_\be_\bn_\bt == 0) ?\n+145 _\bs_\bi_\bz_\be : ((_\bs_\bi_\bz_\be / _\ba_\bl_\bi_\bg_\bn_\bm_\be_\bn_\bt + 1)* _\ba_\bl_\bi_\bg_\bn_\bm_\be_\bn_\bt);\n+146\n+_\b1_\b5_\b0 constexpr static int _\be_\bl_\be_\bm_\be_\bn_\bt_\bs = (_\bc_\bh_\bu_\bn_\bk_\bS_\bi_\bz_\be / _\ba_\bl_\bi_\bg_\bn_\be_\bd_\bS_\bi_\bz_\be);\n+151\n+152 private:\n+154 struct Chunk\n+155 {\n+156\n+157 //friend int testPool();\n+158\n+160 alignas(_\ba_\bl_\bi_\bg_\bn_\bm_\be_\bn_\bt) char chunk_[_\bc_\bh_\bu_\bn_\bk_\bS_\bi_\bz_\be];\n+161\n+163 Chunk *next_;\n+164 };\n+165\n+166 public:\n+_\b1_\b6_\b8 inline _\bP_\bo_\bo_\bl();\n+_\b1_\b7_\b0 inline _\b~_\bP_\bo_\bo_\bl();\n+_\b1_\b7_\b5 inline void* _\ba_\bl_\bl_\bo_\bc_\ba_\bt_\be();\n+_\b1_\b8_\b0 inline void _\bf_\br_\be_\be(void* o);\n+181\n+_\b1_\b8_\b5 inline void _\bp_\br_\bi_\bn_\bt(std::ostream& os);\n+186\n+187 private:\n+188\n+189 // Prevent Copying!\n+190 _\bP_\bo_\bo_\bl(const _\bP_\bo_\bo_\bl_\b<_\bM_\be_\bm_\bb_\be_\br_\bT_\by_\bp_\be_\b,_\bs_\b>&);\n+191\n+192 void operator=(const _\bP_\bo_\bo_\bl_\b<_\bM_\be_\bm_\bb_\be_\br_\bT_\by_\bp_\be_\b,_\bs_\b>& pool) const;\n+194 inline void grow();\n+196 Reference *head_;\n+198 Chunk *chunks_;\n+199 /* @brief The number of currently allocated elements. */\n+200 //size_t allocated_;\n+201\n+202 };\n+203\n+221 template\n+_\b2_\b2_\b2 class _\bP_\bo_\bo_\bl_\bA_\bl_\bl_\bo_\bc_\ba_\bt_\bo_\br\n+223 {\n+224 //friend std::ostream& std::operator<<<>(std::\n+ostream&,PoolAllocator&);\n+225\n+226 public:\n+_\b2_\b3_\b0 typedef T _\bv_\ba_\bl_\bu_\be_\b__\bt_\by_\bp_\be;\n+231\n+_\b2_\b3_\b6 constexpr static int _\bs_\bi_\bz_\be = s * sizeof(_\bv_\ba_\bl_\bu_\be_\b__\bt_\by_\bp_\be);\n+237\n+_\b2_\b4_\b1 typedef T* _\bp_\bo_\bi_\bn_\bt_\be_\br;\n+242\n+_\b2_\b4_\b6 typedef const T* _\bc_\bo_\bn_\bs_\bt_\b__\bp_\bo_\bi_\bn_\bt_\be_\br;\n+247\n+_\b2_\b5_\b1 typedef T& _\br_\be_\bf_\be_\br_\be_\bn_\bc_\be;\n+252\n+_\b2_\b5_\b6 typedef const T& _\bc_\bo_\bn_\bs_\bt_\b__\br_\be_\bf_\be_\br_\be_\bn_\bc_\be;\n+257\n+_\b2_\b6_\b1 typedef std::size_t _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be;\n+262\n+_\b2_\b6_\b6 typedef std::ptrdiff_t _\bd_\bi_\bf_\bf_\be_\br_\be_\bn_\bc_\be_\b__\bt_\by_\bp_\be;\n+267\n+271 inline _\bP_\bo_\bo_\bl_\bA_\bl_\bl_\bo_\bc_\ba_\bt_\bo_\br();\n+272\n+276 template\n+_\b2_\b7_\b7 inline _\bP_\bo_\bo_\bl_\bA_\bl_\bl_\bo_\bc_\ba_\bt_\bo_\br(const _\bP_\bo_\bo_\bl_\bA_\bl_\bl_\bo_\bc_\ba_\bt_\bo_\br_\b<_\bU_\b,_\bu_\b>&)\n+278 {\n+279 // we allow copying but never copy the pool\n+280 // to have a clear ownership of allocated pointers.\n+281 }\n+282\n+_\b2_\b8_\b4 _\bP_\bo_\bo_\bl_\bA_\bl_\bl_\bo_\bc_\ba_\bt_\bo_\br(const _\bP_\bo_\bo_\bl_\bA_\bl_\bl_\bo_\bc_\ba_\bt_\bo_\br&)\n+285 {\n+286 // we allow copying but never copy the pool\n+287 // to have a clear ownership of allocated pointers.\n+288 // For this behaviour we have to implement\n+289 // the copy constructor, because the default\n+290 // one would copy the pool and deallocation\n+291 // of it would break.\n+292 }\n+299 inline _\bp_\bo_\bi_\bn_\bt_\be_\br _\ba_\bl_\bl_\bo_\bc_\ba_\bt_\be(std::size_t n, _\bc_\bo_\bn_\bs_\bt_\b__\bp_\bo_\bi_\bn_\bt_\be_\br hint=0);\n+300\n+308 inline void _\bd_\be_\ba_\bl_\bl_\bo_\bc_\ba_\bt_\be(_\bp_\bo_\bi_\bn_\bt_\be_\br p, std::size_t n);\n+309\n+315 inline void _\bc_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt(_\bp_\bo_\bi_\bn_\bt_\be_\br p, _\bc_\bo_\bn_\bs_\bt_\b__\br_\be_\bf_\be_\br_\be_\bn_\bc_\be value);\n+316\n+321 inline void _\bd_\be_\bs_\bt_\br_\bo_\by(_\bp_\bo_\bi_\bn_\bt_\be_\br p);\n+322\n+_\b3_\b2_\b6 inline _\bp_\bo_\bi_\bn_\bt_\be_\br _\ba_\bd_\bd_\br_\be_\bs_\bs(_\br_\be_\bf_\be_\br_\be_\bn_\bc_\be x) const { return &x; }\n+327\n+328\n+_\b3_\b3_\b2 inline _\bc_\bo_\bn_\bs_\bt_\b__\bp_\bo_\bi_\bn_\bt_\be_\br _\ba_\bd_\bd_\br_\be_\bs_\bs(_\bc_\bo_\bn_\bs_\bt_\b__\br_\be_\bf_\be_\br_\be_\bn_\bc_\be x) const { return &x; }\n+333\n+_\b3_\b3_\b7 inline int _\bm_\ba_\bx_\b__\bs_\bi_\bz_\be() const noexcept { return 1; }\n+338\n+342 template\n+_\b3_\b4_\b3 struct _\br_\be_\bb_\bi_\bn_\bd\n+344 {\n+_\b3_\b4_\b5 typedef _\bP_\bo_\bo_\bl_\bA_\bl_\bl_\bo_\bc_\ba_\bt_\bo_\br_\b<_\bU_\b,_\bs_\b> _\bo_\bt_\bh_\be_\br;\n+346 };\n+347\n+_\b3_\b4_\b9 typedef _\bP_\bo_\bo_\bl_\b<_\bT_\b,_\bs_\bi_\bz_\be_\b> _\bP_\bo_\bo_\bl_\bT_\by_\bp_\be;\n+350\n+351 private:\n+355 _\bP_\bo_\bo_\bl_\bT_\by_\bp_\be memoryPool_;\n+356 };\n+357\n+358 // specialization for void\n+359 template \n+_\b3_\b6_\b0 class _\bP_\bo_\bo_\bl_\bA_\bl_\bl_\bo_\bc_\ba_\bt_\bo_\br\n+361 {\n+362 public:\n+_\b3_\b6_\b3 typedef void* _\bp_\bo_\bi_\bn_\bt_\be_\br;\n+_\b3_\b6_\b4 typedef const void* _\bc_\bo_\bn_\bs_\bt_\b__\bp_\bo_\bi_\bn_\bt_\be_\br;\n+365 // reference to void members are impossible.\n+_\b3_\b6_\b6 typedef void _\bv_\ba_\bl_\bu_\be_\b__\bt_\by_\bp_\be;\n+_\b3_\b6_\b7 template struct rebind\n+368 {\n+_\b3_\b6_\b9 typedef _\bP_\bo_\bo_\bl_\bA_\bl_\bl_\bo_\bc_\ba_\bt_\bo_\br_\b<_\bU_\b,_\bs_\b> _\bo_\bt_\bh_\be_\br;\n+370 };\n+371 };\n+372\n+373\n+374 template\n+_\b3_\b7_\b5 bool _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b=_\b=(const _\bP_\bo_\bo_\bl_\bA_\bl_\bl_\bo_\bc_\ba_\bt_\bo_\br_\b<_\bT_\b1_\b,_\bt_\b1_\b>&, const _\bP_\bo_\bo_\bl_\bA_\bl_\bl_\bo_\bc_\ba_\bt_\bo_\br_\b<_\bT_\b2_\b,_\bt_\b2_\b>&)\n+376 {\n+377 return false;\n+378 }\n+379\n+380\n+381 template\n+_\b3_\b8_\b2 bool _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b!_\b=(const _\bP_\bo_\bo_\bl_\bA_\bl_\bl_\bo_\bc_\ba_\bt_\bo_\br_\b<_\bT_\b1_\b,_\bt_\b1_\b>&, const _\bP_\bo_\bo_\bl_\bA_\bl_\bl_\bo_\bc_\ba_\bt_\bo_\br_\b<_\bT_\b2_\b,_\bt_\b2_\b>&)\n+383 {\n+384 return true;\n+385 }\n+386\n+387 template\n+_\b3_\b8_\b8 bool _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b=_\b=(const _\bP_\bo_\bo_\bl_\bA_\bl_\bl_\bo_\bc_\ba_\bt_\bo_\br_\b<_\bT_\b,_\bt_\b1_\b>& p1, const _\bP_\bo_\bo_\bl_\bA_\bl_\bl_\bo_\bc_\ba_\bt_\bo_\br_\b<_\bT_\b,_\bt_\b2_\b>&\n+p2)\n+389 {\n+390 return &p1==&p2;\n+391 }\n+392\n+393\n+394 template\n+_\b3_\b9_\b5 bool _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b!_\b=(const _\bP_\bo_\bo_\bl_\bA_\bl_\bl_\bo_\bc_\ba_\bt_\bo_\br_\b<_\bT_\b,_\bt_\b1_\b>& p1, const _\bP_\bo_\bo_\bl_\bA_\bl_\bl_\bo_\bc_\ba_\bt_\bo_\br_\b<_\bT_\b,_\bt_\b2_\b>&\n+p2)\n+396 {\n+397 return &p1 != &p2;\n+398 }\n+399\n+400 template\n+_\b4_\b0_\b1 bool _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b=_\b=(const _\bP_\bo_\bo_\bl_\bA_\bl_\bl_\bo_\bc_\ba_\bt_\bo_\br_\b<_\bv_\bo_\bi_\bd_\b,_\bt_\b1_\b>&, const _\bP_\bo_\bo_\bl_\bA_\bl_\bl_\bo_\bc_\ba_\bt_\bo_\br_\b<_\bT_\b,_\bt_\b2_\b>&)\n+402 {\n+403 return false;\n+404 }\n+405\n+406\n+407 template\n+_\b4_\b0_\b8 bool _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b!_\b=(const _\bP_\bo_\bo_\bl_\bA_\bl_\bl_\bo_\bc_\ba_\bt_\bo_\br_\b<_\bv_\bo_\bi_\bd_\b,_\bt_\b1_\b>&, const _\bP_\bo_\bo_\bl_\bA_\bl_\bl_\bo_\bc_\ba_\bt_\bo_\br_\b<_\bT_\b,_\bt_\b2_\b>&)\n+409 {\n+410 return true;\n+411 }\n+412\n+413 template\n+_\b4_\b1_\b4 bool _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b=_\b=(const _\bP_\bo_\bo_\bl_\bA_\bl_\bl_\bo_\bc_\ba_\bt_\bo_\br_\b<_\bv_\bo_\bi_\bd_\b,_\bt_\b1_\b>& p1, const\n+_\bP_\bo_\bo_\bl_\bA_\bl_\bl_\bo_\bc_\ba_\bt_\bo_\br_\b<_\bv_\bo_\bi_\bd_\b,_\bt_\b2_\b>& p2)\n+415 {\n+416 return &p1==&p2;\n+417 }\n+418\n+419 template\n+_\b4_\b2_\b0 bool _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b!_\b=(const _\bP_\bo_\bo_\bl_\bA_\bl_\bl_\bo_\bc_\ba_\bt_\bo_\br_\b<_\bv_\bo_\bi_\bd_\b,_\bt_\b1_\b>& p1, const\n+_\bP_\bo_\bo_\bl_\bA_\bl_\bl_\bo_\bc_\ba_\bt_\bo_\br_\b<_\bv_\bo_\bi_\bd_\b,_\bt_\b2_\b>& p2)\n+421 {\n+422 return &p1!=&p2;\n+423 }\n+424\n+425 template\n+_\b4_\b2_\b6 inline _\bP_\bo_\bo_\bl_\b<_\bT_\b,_\bS_\b>_\b:_\b:_\bP_\bo_\bo_\bl()\n+427 : head_(0), chunks_(0) //, allocated_(0)\n+428 {\n+429 static_assert(sizeof(T)<=_\bu_\bn_\bi_\bo_\bn_\bS_\bi_\bz_\be, \"Library Error: type T is too big\");\n+430 static_assert(sizeof(Reference)<=_\bu_\bn_\bi_\bo_\bn_\bS_\bi_\bz_\be, \"Library Error: type of\n+reference is too big\");\n+431 static_assert(_\bu_\bn_\bi_\bo_\bn_\bS_\bi_\bz_\be<=_\ba_\bl_\bi_\bg_\bn_\be_\bd_\bS_\bi_\bz_\be, \"Library Error: alignedSize too\n+small\");\n+432 static_assert(sizeof(T)<=_\bc_\bh_\bu_\bn_\bk_\bS_\bi_\bz_\be, \"Library Error: chunkSize must be able\n+to hold at least one value\");\n+433 static_assert(sizeof(Reference)<=_\bc_\bh_\bu_\bn_\bk_\bS_\bi_\bz_\be, \"Library Error: chunkSize must\n+be able to hold at least one reference\");\n+434 static_assert(_\bc_\bh_\bu_\bn_\bk_\bS_\bi_\bz_\be % _\ba_\bl_\bi_\bg_\bn_\bm_\be_\bn_\bt == 0, \"Library Error: compiler cannot\n+calculate!\");\n+435 static_assert(_\be_\bl_\be_\bm_\be_\bn_\bt_\bs>=1, \"Library Error: we need to hold at least one\n+element!\");\n+436 static_assert(_\be_\bl_\be_\bm_\be_\bn_\bt_\bs*_\ba_\bl_\bi_\bg_\bn_\be_\bd_\bS_\bi_\bz_\be<=_\bc_\bh_\bu_\bn_\bk_\bS_\bi_\bz_\be, \"Library Error: aligned\n+elements must fit into chuck!\");\n+437 }\n+438\n+439 template\n+_\b4_\b4_\b0 inline _\bP_\bo_\bo_\bl_\b<_\bT_\b,_\bS_\b>_\b:_\b:_\b~_\bP_\bo_\bo_\bl()\n+441 {\n+442 /*\n+443 if(allocated_!=0)\n+444 std::cerr<<\"There are still \"< \"\n+445 <(this)<<\"! This is a memory leak and might result in\n+segfaults\"\n+446 <next_;\n+455 delete tmp;\n+456 }\n+457 }\n+458\n+459 template\n+_\b4_\b6_\b0 inline void _\bP_\bo_\bo_\bl_\b<_\bT_\b,_\bS_\b>_\b:_\b:_\bp_\br_\bi_\bn_\bt(std::ostream& os)\n+461 {\n+462 Chunk* current=chunks_;\n+463 while(current) {\n+464 os<next_;\n+466 }\n+467 os<\n+471 inline void _\bP_\bo_\bo_\bl_\b<_\bT_\b,_\bS_\b>_\b:_\b:_\bg_\br_\bo_\bw()\n+472 {\n+473 Chunk *newChunk = new Chunk;\n+474 newChunk->next_ = chunks_;\n+475 chunks_ = newChunk;\n+476\n+477 char* start = chunks_->chunk_;\n+478 char* last = &start[elements*alignedSize];\n+479 Reference* ref = new (start) (Reference);\n+480\n+481 // grow is only called if head==0,\n+482 assert(!head_);\n+483\n+484 head_ = ref;\n+485\n+486 for(char* element=start+alignedSize; elementnext_ = next;\n+489 ref = next;\n+490 }\n+491 ref->next_=0;\n+492 }\n+493\n+494 template\n+_\b4_\b9_\b5 inline void _\bP_\bo_\bo_\bl_\b<_\bT_\b,_\bS_\b>_\b:_\b:_\bf_\br_\be_\be(void* b)\n+496 {\n+497 if(b) {\n+498#ifndef NDEBUG\n+499 Chunk* current=chunks_;\n+500 while(current) {\n+501 if(static_cast(current->chunk_)<=b &&\n+502 static_cast(current->chunk_+chunkSize)>b)\n+503 break;\n+504 current=current->next_;\n+505 }\n+506 if(!current)\n+507 throw std::bad_alloc();\n+508#endif\n+509 Reference* freed = static_cast(b);\n+510 freed->next_ = head_;\n+511 head_ = freed;\n+512 //--allocated_;\n+513 }\n+514 else\n+515 {\n+516 std::cerr<< \"Tried to free null pointer! \"<\n+_\b5_\b2_\b2 inline void* _\bP_\bo_\bo_\bl_\b<_\bT_\b,_\bS_\b>_\b:_\b:_\ba_\bl_\bl_\bo_\bc_\ba_\bt_\be()\n+523 {\n+524 if(!head_)\n+525 grow();\n+526\n+527 Reference* p = head_;\n+528 head_ = p->next_;\n+529 //++allocated_;\n+530 return p;\n+531 }\n+532\n+533 template\n+_\b5_\b3_\b4 inline _\bP_\bo_\bo_\bl_\bA_\bl_\bl_\bo_\bc_\ba_\bt_\bo_\br_\b<_\bT_\b,_\bs_\b>_\b:_\b:_\bP_\bo_\bo_\bl_\bA_\bl_\bl_\bo_\bc_\ba_\bt_\bo_\br()\n+535 { }\n+536\n+537 template\n+538 inline typename _\bP_\bo_\bo_\bl_\bA_\bl_\bl_\bo_\bc_\ba_\bt_\bo_\br_\b<_\bT_\b,_\bs_\b>_\b:_\b:_\bp_\bo_\bi_\bn_\bt_\be_\br\n+_\b5_\b3_\b9 _\bP_\bo_\bo_\bl_\bA_\bl_\bl_\bo_\bc_\ba_\bt_\bo_\br_\b<_\bT_\b,_\bs_\b>_\b:_\b:_\ba_\bl_\bl_\bo_\bc_\ba_\bt_\be(std::size_t n, _\bc_\bo_\bn_\bs_\bt_\b__\bp_\bo_\bi_\bn_\bt_\be_\br)\n+540 {\n+541 if(n==1)\n+542 return static_cast(memoryPool_.allocate());\n+543 else\n+544 throw std::bad_alloc();\n+545 }\n+546\n+547 template\n+_\b5_\b4_\b8 inline void _\bP_\bo_\bo_\bl_\bA_\bl_\bl_\bo_\bc_\ba_\bt_\bo_\br_\b<_\bT_\b,_\bs_\b>_\b:_\b:_\bd_\be_\ba_\bl_\bl_\bo_\bc_\ba_\bt_\be(_\bp_\bo_\bi_\bn_\bt_\be_\br p, std::size_t n)\n+549 {\n+550 for(size_t i=0; i\n+_\b5_\b5_\b5 inline void _\bP_\bo_\bo_\bl_\bA_\bl_\bl_\bo_\bc_\ba_\bt_\bo_\br_\b<_\bT_\b,_\bs_\b>_\b:_\b:_\bc_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt(_\bp_\bo_\bi_\bn_\bt_\be_\br p, _\bc_\bo_\bn_\bs_\bt_\b__\br_\be_\bf_\be_\br_\be_\bn_\bc_\be value)\n+556 {\n+557 ::new (static_cast(p))T(value);\n+558 }\n+559\n+560 template\n+_\b5_\b6_\b1 inline void _\bP_\bo_\bo_\bl_\bA_\bl_\bl_\bo_\bc_\ba_\bt_\bo_\br_\b<_\bT_\b,_\bs_\b>_\b:_\b:_\bd_\be_\bs_\bt_\br_\bo_\by(pointer p)\n+562 {\n+563 p->~T();\n+564 }\n+565\n+567}\n+568#endif\n+_\bD_\bu_\bn_\be_\b:_\b:_\bP_\bo_\bo_\bl_\bA_\bl_\bl_\bo_\bc_\ba_\bt_\bo_\br_\b:_\b:_\bc_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt\n+void construct(pointer p, const_reference value)\n+Construct an object.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn poolallocator.hh:555\n+_\bD_\bu_\bn_\be_\b:_\b:_\bP_\bo_\bo_\bl_\b:_\b:_\bf_\br_\be_\be\n+void free(void *o)\n+Free an object.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn poolallocator.hh:495\n+_\bD_\bu_\bn_\be_\b:_\b:_\bP_\bo_\bo_\bl_\b:_\b:_\b~_\bP_\bo_\bo_\bl\n+~Pool()\n+Destructor.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn poolallocator.hh:440\n+_\bD_\bu_\bn_\be_\b:_\b:_\bP_\bo_\bo_\bl_\b:_\b:_\ba_\bl_\bl_\bo_\bc_\ba_\bt_\be\n+void * allocate()\n+Get a new or recycled object.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn poolallocator.hh:522\n+_\bD_\bu_\bn_\be_\b:_\b:_\bP_\bo_\bo_\bl_\b:_\b:_\bp_\br_\bi_\bn_\bt\n+void print(std::ostream &os)\n+Print elements in pool for debugging.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn poolallocator.hh:460\n+_\bD_\bu_\bn_\be_\b:_\b:_\bP_\bo_\bo_\bl_\bA_\bl_\bl_\bo_\bc_\ba_\bt_\bo_\br_\b:_\b:_\ba_\bl_\bl_\bo_\bc_\ba_\bt_\be\n+pointer allocate(std::size_t n, const_pointer hint=0)\n+Allocates objects.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn poolallocator.hh:539\n+_\bD_\bu_\bn_\be_\b:_\b:_\bP_\bo_\bo_\bl_\b:_\b:_\bP_\bo_\bo_\bl\n+Pool()\n+Constructor.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn poolallocator.hh:426\n+_\bD_\bu_\bn_\be_\b:_\b:_\bP_\bo_\bo_\bl_\bA_\bl_\bl_\bo_\bc_\ba_\bt_\bo_\br_\b:_\b:_\bd_\be_\ba_\bl_\bl_\bo_\bc_\ba_\bt_\be\n+void deallocate(pointer p, std::size_t n)\n+Free objects.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn poolallocator.hh:548\n+_\bD_\bu_\bn_\be_\b:_\b:_\bP_\bo_\bo_\bl_\bA_\bl_\bl_\bo_\bc_\ba_\bt_\bo_\br_\b:_\b:_\bd_\be_\bs_\bt_\br_\bo_\by\n+void destroy(pointer p)\n+Destroy an object without freeing memory.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn poolallocator.hh:561\n+_\bD_\bu_\bn_\be_\b:_\b:_\bP_\bo_\bo_\bl_\bA_\bl_\bl_\bo_\bc_\ba_\bt_\bo_\br_\b:_\b:_\bP_\bo_\bo_\bl_\bA_\bl_\bl_\bo_\bc_\ba_\bt_\bo_\br\n+PoolAllocator()\n+Constructor.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn poolallocator.hh:534\n+_\bD_\bu_\bn_\be_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b=_\b=\n+EnableIfInterOperable< T1, T2, bool >::type operator==(const\n+ForwardIteratorFacade< T1, V1, R1, D > &lhs, const ForwardIteratorFacade< T2,\n+V2, R2, D > &rhs)\n+Checks for equality.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn iteratorfacades.hh:238\n+_\bD_\bu_\bn_\be_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b!_\b=\n+EnableIfInterOperable< T1, T2, bool >::type operator!=(const\n+ForwardIteratorFacade< T1, V1, R1, D > &lhs, const ForwardIteratorFacade< T2,\n+V2, R2, D > &rhs)\n+Checks for inequality.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn iteratorfacades.hh:260\n+_\bs_\bt_\bd\n+STL namespace.\n _\bD_\bu_\bn_\be\n Dune namespace.\n D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn alignedallocator.hh:13\n-_\bD_\bu_\bn_\be_\b:_\b:_\bi_\bm_\bp_\bl_\be_\bm_\be_\bn_\bt_\ba_\bt_\bi_\bo_\bn_\bD_\be_\bf_\bi_\bn_\be_\bd\n-@ implementationDefined\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn documentation.hh:55\n-_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bm_\bp_\bl_\be_\bm_\be_\bn_\bt_\ba_\bt_\bi_\bo_\bn_\bD_\be_\bf_\bi_\bn_\be_\bd\n-Dummy struct used for documentation purposes.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn documentation.hh:42\n+_\bD_\bu_\bn_\be_\b:_\b:_\bc_\bo_\bn_\bs_\bt_\b__\br_\be_\bf_\be_\br_\be_\bn_\bc_\be\n+Get the 'const' version of a reference to a mutable object.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn genericiterator.hh:87\n+_\bD_\bu_\bn_\be_\b:_\b:_\bP_\bo_\bo_\bl\n+A memory pool of objects.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn poolallocator.hh:90\n+_\bD_\bu_\bn_\be_\b:_\b:_\bP_\bo_\bo_\bl_\b:_\b:_\ba_\bl_\bi_\bg_\bn_\bm_\be_\bn_\bt\n+static constexpr int alignment\n+The alignment that suits both the MemberType and the Reference (i.e. their\n+least common multiple).\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn poolallocator.hh:127\n+_\bD_\bu_\bn_\be_\b:_\b:_\bP_\bo_\bo_\bl_\b:_\b:_\ba_\bl_\bi_\bg_\bn_\be_\bd_\bS_\bi_\bz_\be\n+static constexpr int alignedSize\n+The aligned size of the type.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn poolallocator.hh:135\n+_\bD_\bu_\bn_\be_\b:_\b:_\bP_\bo_\bo_\bl_\b:_\b:_\bc_\bh_\bu_\bn_\bk_\bS_\bi_\bz_\be\n+static constexpr int chunkSize\n+The size of each chunk memory chunk.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn poolallocator.hh:144\n+_\bD_\bu_\bn_\be_\b:_\b:_\bP_\bo_\bo_\bl_\b:_\b:_\bs_\bi_\bz_\be\n+static constexpr int size\n+Size requirement. At least one object has to stored.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn poolallocator.hh:120\n+_\bD_\bu_\bn_\be_\b:_\b:_\bP_\bo_\bo_\bl_\b:_\b:_\bu_\bn_\bi_\bo_\bn_\bS_\bi_\bz_\be\n+static constexpr int unionSize\n+The size of a union of Reference and MemberType.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn poolallocator.hh:113\n+_\bD_\bu_\bn_\be_\b:_\b:_\bP_\bo_\bo_\bl_\b:_\b:_\bM_\be_\bm_\bb_\be_\br_\bT_\by_\bp_\be\n+T MemberType\n+The type of object we allocate memory for.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn poolallocator.hh:108\n+_\bD_\bu_\bn_\be_\b:_\b:_\bP_\bo_\bo_\bl_\b:_\b:_\be_\bl_\be_\bm_\be_\bn_\bt_\bs\n+static constexpr int elements\n+The number of element each chunk can hold.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn poolallocator.hh:150\n+_\bD_\bu_\bn_\be_\b:_\b:_\bP_\bo_\bo_\bl_\bA_\bl_\bl_\bo_\bc_\ba_\bt_\bo_\br\n+An allocator managing a pool of objects for reuse.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn poolallocator.hh:223\n+_\bD_\bu_\bn_\be_\b:_\b:_\bP_\bo_\bo_\bl_\bA_\bl_\bl_\bo_\bc_\ba_\bt_\bo_\br_\b:_\b:_\bP_\bo_\bo_\bl_\bT_\by_\bp_\be\n+Pool< T, size > PoolType\n+The type of the memory pool we use.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn poolallocator.hh:349\n+_\bD_\bu_\bn_\be_\b:_\b:_\bP_\bo_\bo_\bl_\bA_\bl_\bl_\bo_\bc_\ba_\bt_\bo_\br_\b:_\b:_\ba_\bd_\bd_\br_\be_\bs_\bs\n+const_pointer address(const_reference x) const\n+Convert a reference to a pointer.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn poolallocator.hh:332\n+_\bD_\bu_\bn_\be_\b:_\b:_\bP_\bo_\bo_\bl_\bA_\bl_\bl_\bo_\bc_\ba_\bt_\bo_\br_\b:_\b:_\bc_\bo_\bn_\bs_\bt_\b__\br_\be_\bf_\be_\br_\be_\bn_\bc_\be\n+const T & const_reference\n+The constant reference type.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn poolallocator.hh:256\n+_\bD_\bu_\bn_\be_\b:_\b:_\bP_\bo_\bo_\bl_\bA_\bl_\bl_\bo_\bc_\ba_\bt_\bo_\br_\b:_\b:_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be\n+std::size_t size_type\n+The size type.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn poolallocator.hh:261\n+_\bD_\bu_\bn_\be_\b:_\b:_\bP_\bo_\bo_\bl_\bA_\bl_\bl_\bo_\bc_\ba_\bt_\bo_\br_\b:_\b:_\bv_\ba_\bl_\bu_\be_\b__\bt_\by_\bp_\be\n+T value_type\n+Type of the values we construct and allocate.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn poolallocator.hh:230\n+_\bD_\bu_\bn_\be_\b:_\b:_\bP_\bo_\bo_\bl_\bA_\bl_\bl_\bo_\bc_\ba_\bt_\bo_\br_\b:_\b:_\br_\be_\bf_\be_\br_\be_\bn_\bc_\be\n+T & reference\n+The reference type.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn poolallocator.hh:251\n+_\bD_\bu_\bn_\be_\b:_\b:_\bP_\bo_\bo_\bl_\bA_\bl_\bl_\bo_\bc_\ba_\bt_\bo_\br_\b:_\b:_\bP_\bo_\bo_\bl_\bA_\bl_\bl_\bo_\bc_\ba_\bt_\bo_\br\n+PoolAllocator(const PoolAllocator &)\n+Copy constructor that does not copy the memory pool.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn poolallocator.hh:284\n+_\bD_\bu_\bn_\be_\b:_\b:_\bP_\bo_\bo_\bl_\bA_\bl_\bl_\bo_\bc_\ba_\bt_\bo_\br_\b:_\b:_\bc_\bo_\bn_\bs_\bt_\b__\bp_\bo_\bi_\bn_\bt_\be_\br\n+const T * const_pointer\n+The constant pointer type.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn poolallocator.hh:246\n+_\bD_\bu_\bn_\be_\b:_\b:_\bP_\bo_\bo_\bl_\bA_\bl_\bl_\bo_\bc_\ba_\bt_\bo_\br_\b:_\b:_\ba_\bd_\bd_\br_\be_\bs_\bs\n+pointer address(reference x) const\n+Convert a reference to a pointer.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn poolallocator.hh:326\n+_\bD_\bu_\bn_\be_\b:_\b:_\bP_\bo_\bo_\bl_\bA_\bl_\bl_\bo_\bc_\ba_\bt_\bo_\br_\b:_\b:_\bp_\bo_\bi_\bn_\bt_\be_\br\n+T * pointer\n+The pointer type.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn poolallocator.hh:241\n+_\bD_\bu_\bn_\be_\b:_\b:_\bP_\bo_\bo_\bl_\bA_\bl_\bl_\bo_\bc_\ba_\bt_\bo_\br_\b:_\b:_\bP_\bo_\bo_\bl_\bA_\bl_\bl_\bo_\bc_\ba_\bt_\bo_\br\n+PoolAllocator(const PoolAllocator< U, u > &)\n+Copy Constructor that does not copy the memory pool.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn poolallocator.hh:277\n+_\bD_\bu_\bn_\be_\b:_\b:_\bP_\bo_\bo_\bl_\bA_\bl_\bl_\bo_\bc_\ba_\bt_\bo_\br_\b:_\b:_\bd_\bi_\bf_\bf_\be_\br_\be_\bn_\bc_\be_\b__\bt_\by_\bp_\be\n+std::ptrdiff_t difference_type\n+The difference_type.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn poolallocator.hh:266\n+_\bD_\bu_\bn_\be_\b:_\b:_\bP_\bo_\bo_\bl_\bA_\bl_\bl_\bo_\bc_\ba_\bt_\bo_\br_\b:_\b:_\bm_\ba_\bx_\b__\bs_\bi_\bz_\be\n+int max_size() const noexcept\n+Not correctly implemented, yet!\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn poolallocator.hh:337\n+_\bD_\bu_\bn_\be_\b:_\b:_\bP_\bo_\bo_\bl_\bA_\bl_\bl_\bo_\bc_\ba_\bt_\bo_\br_\b:_\b:_\bs_\bi_\bz_\be\n+static constexpr int size\n+The number of objects to fit into one memory chunk allocated.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn poolallocator.hh:236\n+_\bD_\bu_\bn_\be_\b:_\b:_\bP_\bo_\bo_\bl_\bA_\bl_\bl_\bo_\bc_\ba_\bt_\bo_\br_\b:_\b:_\br_\be_\bb_\bi_\bn_\bd\n+Rebind the allocator to another type.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn poolallocator.hh:344\n+_\bD_\bu_\bn_\be_\b:_\b:_\bP_\bo_\bo_\bl_\bA_\bl_\bl_\bo_\bc_\ba_\bt_\bo_\br_\b:_\b:_\br_\be_\bb_\bi_\bn_\bd_\b:_\b:_\bo_\bt_\bh_\be_\br\n+PoolAllocator< U, s > other\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn poolallocator.hh:345\n+_\bD_\bu_\bn_\be_\b:_\b:_\bP_\bo_\bo_\bl_\bA_\bl_\bl_\bo_\bc_\ba_\bt_\bo_\br_\b<_\b _\bv_\bo_\bi_\bd_\b,_\b _\bs_\b _\b>_\b:_\b:_\bv_\ba_\bl_\bu_\be_\b__\bt_\by_\bp_\be\n+void value_type\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn poolallocator.hh:366\n+_\bD_\bu_\bn_\be_\b:_\b:_\bP_\bo_\bo_\bl_\bA_\bl_\bl_\bo_\bc_\ba_\bt_\bo_\br_\b<_\b _\bv_\bo_\bi_\bd_\b,_\b _\bs_\b _\b>_\b:_\b:_\bp_\bo_\bi_\bn_\bt_\be_\br\n+void * pointer\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn poolallocator.hh:363\n+_\bD_\bu_\bn_\be_\b:_\b:_\bP_\bo_\bo_\bl_\bA_\bl_\bl_\bo_\bc_\ba_\bt_\bo_\br_\b<_\b _\bv_\bo_\bi_\bd_\b,_\b _\bs_\b _\b>_\b:_\b:_\bc_\bo_\bn_\bs_\bt_\b__\bp_\bo_\bi_\bn_\bt_\be_\br\n+const void * const_pointer\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn poolallocator.hh:364\n+_\bD_\bu_\bn_\be_\b:_\b:_\bP_\bo_\bo_\bl_\bA_\bl_\bl_\bo_\bc_\ba_\bt_\bo_\br_\b<_\b _\bv_\bo_\bi_\bd_\b,_\b _\bs_\b _\b>_\b:_\b:_\br_\be_\bb_\bi_\bn_\bd_\b:_\b:_\bo_\bt_\bh_\be_\br\n+PoolAllocator< U, s > other\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn poolallocator.hh:369\n ===============================================================================\n Generated by\u00a0_\b[_\bd_\bo_\bx_\by_\bg_\be_\bn_\b] 1.9.8\n"}]}, {"source1": "./usr/share/doc/libdune-common-doc/doxygen/a00119.html", "source2": "./usr/share/doc/libdune-common-doc/doxygen/a00119.html", "unified_diff": "@@ -1,15 +1,15 @@\n \n \n \n \n \n \n \n-dune-common: lru.hh File Reference\n+dune-common: diagonalmatrix.hh File Reference\n \n \n \n \n \n \n \n@@ -72,43 +72,73 @@\n
  • dune
  • common
  • \n \n \n
    \n \n-
    lru.hh File Reference
    \n+
    diagonalmatrix.hh File Reference
    \n
    \n
    \n \n-

    LRU Cache Container, using an STL like interface. \n+

    This file implements a quadratic diagonal matrix of fixed size. \n More...

    \n-
    #include <list>
    \n-#include <utility>
    \n-#include <map>
    \n+
    #include <algorithm>
    \n+#include <cassert>
    \n+#include <cmath>
    \n+#include <complex>
    \n+#include <cstddef>
    \n+#include <initializer_list>
    \n+#include <iostream>
    \n #include <memory>
    \n-#include <dune/common/exceptions.hh>
    \n+#include <dune/common/boundschecking.hh>
    \n+#include <dune/common/densematrix.hh>
    \n+#include <dune/common/exceptions.hh>
    \n+#include <dune/common/fmatrix.hh>
    \n+#include <dune/common/fvector.hh>
    \n+#include <dune/common/genericiterator.hh>
    \n+#include <dune/common/typetraits.hh>
    \n
    \n

    Go to the source code of this file.

    \n \n \n-\n-\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n \n

    \n Classes

    class  Dune::lru< Key, Tp, Traits >
     LRU Cache Container. More...
    class  Dune::DiagonalMatrix< K, n >
     A diagonal matrix of static size. More...
     
    struct  Dune::FieldTraits< DiagonalMatrix< K, n > >
     
    class  Dune::DiagonalMatrixWrapper< DiagonalMatrixType >
     
    class  Dune::DiagonalRowVectorConst< K, n >
     
    class  Dune::DiagonalRowVector< K, n >
     
    struct  Dune::const_reference< DiagonalRowVector< K, n > >
     
    struct  Dune::const_reference< DiagonalRowVectorConst< K, n > >
     
    struct  Dune::mutable_reference< DiagonalRowVector< K, n > >
     
    struct  Dune::mutable_reference< DiagonalRowVectorConst< K, n > >
     
    class  Dune::ContainerWrapperIterator< CW, T, R >
     Iterator class for sparse vector-like containers. More...
     
    struct  Dune::DenseMatrixAssigner< DenseMatrix, DiagonalMatrix< field, N > >
     
    \n \n \n \n \n

    \n Namespaces

    namespace  Dune
     Dune namespace.
     
    \n

    Detailed Description

    \n-

    LRU Cache Container, using an STL like interface.

    \n-
    Author
    Christian Engwer
    \n+

    This file implements a quadratic diagonal matrix of fixed size.

    \n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,29 +1,58 @@\n dune-common\u00a02.10\n Loading...\n Searching...\n No Matches\n * _\bd_\bu_\bn_\be\n * _\bc_\bo_\bm_\bm_\bo_\bn\n _\bC_\bl_\ba_\bs_\bs_\be_\bs | _\bN_\ba_\bm_\be_\bs_\bp_\ba_\bc_\be_\bs\n-lru.hh File Reference\n-LRU Cache Container, using an STL like interface. _\bM_\bo_\br_\be_\b._\b._\b.\n-#include \n-#include \n-#include \n+diagonalmatrix.hh File Reference\n+This file implements a quadratic diagonal matrix of fixed size. _\bM_\bo_\br_\be_\b._\b._\b.\n+#include \n+#include \n+#include \n+#include \n+#include \n+#include \n+#include \n #include \n+#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bb_\bo_\bu_\bn_\bd_\bs_\bc_\bh_\be_\bc_\bk_\bi_\bn_\bg_\b._\bh_\bh>\n+#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bd_\be_\bn_\bs_\be_\bm_\ba_\bt_\br_\bi_\bx_\b._\bh_\bh>\n #include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\be_\bx_\bc_\be_\bp_\bt_\bi_\bo_\bn_\bs_\b._\bh_\bh>\n+#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bf_\bm_\ba_\bt_\br_\bi_\bx_\b._\bh_\bh>\n+#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bf_\bv_\be_\bc_\bt_\bo_\br_\b._\bh_\bh>\n+#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bg_\be_\bn_\be_\br_\bi_\bc_\bi_\bt_\be_\br_\ba_\bt_\bo_\br_\b._\bh_\bh>\n+#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bt_\by_\bp_\be_\bt_\br_\ba_\bi_\bt_\bs_\b._\bh_\bh>\n _\bG_\bo_\b _\bt_\bo_\b _\bt_\bh_\be_\b _\bs_\bo_\bu_\br_\bc_\be_\b _\bc_\bo_\bd_\be_\b _\bo_\bf_\b _\bt_\bh_\bi_\bs_\b _\bf_\bi_\bl_\be_\b.\n C\bCl\bla\bas\bss\bse\bes\bs\n-class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bl_\br_\bu_\b<_\b _\bK_\be_\by_\b,_\b _\bT_\bp_\b,_\b _\bT_\br_\ba_\bi_\bt_\bs_\b _\b>\n-\u00a0 LRU Cache Container. _\bM_\bo_\br_\be_\b._\b._\b.\n+ class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bD_\bi_\ba_\bg_\bo_\bn_\ba_\bl_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bK_\b,_\b _\bn_\b _\b>\n+\u00a0 A diagonal matrix of static size. _\bM_\bo_\br_\be_\b._\b._\b.\n+\u00a0\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bF_\bi_\be_\bl_\bd_\bT_\br_\ba_\bi_\bt_\bs_\b<_\b _\bD_\bi_\ba_\bg_\bo_\bn_\ba_\bl_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bK_\b,_\b _\bn_\b _\b>_\b _\b>\n+\u00a0\n+ class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bD_\bi_\ba_\bg_\bo_\bn_\ba_\bl_\bM_\ba_\bt_\br_\bi_\bx_\bW_\br_\ba_\bp_\bp_\be_\br_\b<_\b _\bD_\bi_\ba_\bg_\bo_\bn_\ba_\bl_\bM_\ba_\bt_\br_\bi_\bx_\bT_\by_\bp_\be_\b _\b>\n+\u00a0\n+ class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bD_\bi_\ba_\bg_\bo_\bn_\ba_\bl_\bR_\bo_\bw_\bV_\be_\bc_\bt_\bo_\br_\bC_\bo_\bn_\bs_\bt_\b<_\b _\bK_\b,_\b _\bn_\b _\b>\n+\u00a0\n+ class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bD_\bi_\ba_\bg_\bo_\bn_\ba_\bl_\bR_\bo_\bw_\bV_\be_\bc_\bt_\bo_\br_\b<_\b _\bK_\b,_\b _\bn_\b _\b>\n+\u00a0\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bc_\bo_\bn_\bs_\bt_\b__\br_\be_\bf_\be_\br_\be_\bn_\bc_\be_\b<_\b _\bD_\bi_\ba_\bg_\bo_\bn_\ba_\bl_\bR_\bo_\bw_\bV_\be_\bc_\bt_\bo_\br_\b<_\b _\bK_\b,_\b _\bn_\b _\b>_\b _\b>\n+\u00a0\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bc_\bo_\bn_\bs_\bt_\b__\br_\be_\bf_\be_\br_\be_\bn_\bc_\be_\b<_\b _\bD_\bi_\ba_\bg_\bo_\bn_\ba_\bl_\bR_\bo_\bw_\bV_\be_\bc_\bt_\bo_\br_\bC_\bo_\bn_\bs_\bt_\b<_\b _\bK_\b,_\b _\bn_\b _\b>_\b _\b>\n+\u00a0\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bm_\bu_\bt_\ba_\bb_\bl_\be_\b__\br_\be_\bf_\be_\br_\be_\bn_\bc_\be_\b<_\b _\bD_\bi_\ba_\bg_\bo_\bn_\ba_\bl_\bR_\bo_\bw_\bV_\be_\bc_\bt_\bo_\br_\b<_\b _\bK_\b,_\b _\bn_\b _\b>_\b _\b>\n+\u00a0\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bm_\bu_\bt_\ba_\bb_\bl_\be_\b__\br_\be_\bf_\be_\br_\be_\bn_\bc_\be_\b<_\b _\bD_\bi_\ba_\bg_\bo_\bn_\ba_\bl_\bR_\bo_\bw_\bV_\be_\bc_\bt_\bo_\br_\bC_\bo_\bn_\bs_\bt_\b<_\b _\bK_\b,_\b _\bn_\b _\b>_\b _\b>\n+\u00a0\n+ class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bn_\bt_\ba_\bi_\bn_\be_\br_\bW_\br_\ba_\bp_\bp_\be_\br_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b<_\b _\bC_\bW_\b,_\b _\bT_\b,_\b _\bR_\b _\b>\n+\u00a0 Iterator class for sparse vector-like containers. _\bM_\bo_\br_\be_\b._\b._\b.\n+\u00a0\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\bA_\bs_\bs_\bi_\bg_\bn_\be_\br_\b<_\b _\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\b,_\b _\bD_\bi_\ba_\bg_\bo_\bn_\ba_\bl_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bf_\bi_\be_\bl_\bd_\b,_\b _\bN_\b _\b>_\b _\b>\n \u00a0\n N\bNa\bam\bme\bes\bsp\bpa\bac\bce\bes\bs\n namespace \u00a0 _\bD_\bu_\bn_\be\n \u00a0 _\bD_\bu_\bn_\be namespace.\n \u00a0\n *\b**\b**\b**\b**\b* D\bDe\bet\bta\bai\bil\ble\bed\bd D\bDe\bes\bsc\bcr\bri\bip\bpt\bti\bio\bon\bn *\b**\b**\b**\b**\b*\n-LRU Cache Container, using an STL like interface.\n- Author\n- Christian Engwer\n+This file implements a quadratic diagonal matrix of fixed size.\n ===============================================================================\n Generated by\u00a0_\b[_\bd_\bo_\bx_\by_\bg_\be_\bn_\b] 1.9.8\n"}]}, {"source1": "./usr/share/doc/libdune-common-doc/doxygen/a00119_source.html", "source2": "./usr/share/doc/libdune-common-doc/doxygen/a00119_source.html", "unified_diff": "@@ -1,15 +1,15 @@\n \n \n \n \n \n \n \n-dune-common: lru.hh Source File\n+dune-common: diagonalmatrix.hh Source File\n \n \n \n \n \n \n \n@@ -74,238 +74,1353 @@\n \n
    \n \n
    \n
    \n
    \n-
    lru.hh
    \n+
    diagonalmatrix.hh
    \n
    \n
    \n Go to the documentation of this file.
    1// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
    \n
    2// vi: set et ts=4 sw=2 sts=2:
    \n
    3// SPDX-FileCopyrightInfo: Copyright \u00a9 DUNE Project contributors, see file LICENSE.md in module root
    \n
    4// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception
    \n-
    5#ifndef DUNE_COMMON_LRU_HH
    \n-
    6#define DUNE_COMMON_LRU_HH
    \n+
    5#ifndef DUNE_DIAGONAL_MATRIX_HH
    \n+
    6#define DUNE_DIAGONAL_MATRIX_HH
    \n
    7
    \n-
    8#include <list>
    \n-
    9#include <utility>
    \n-
    10#include <map>
    \n-
    11#include <memory>
    \n-
    12
    \n-\n-
    14
    \n-
    20namespace Dune {
    \n-
    21
    \n-
    22 namespace {
    \n-
    23
    \n-
    24 /*
    \n-
    25 hide the default traits in an empty namespace
    \n-
    26 */
    \n-
    27 template <typename Key, typename Tp,
    \n-
    28 typename Alloc = std::allocator<Tp> >
    \n-
    29 struct _lru_default_traits
    \n-
    30 {
    \n-
    31 typedef Key key_type;
    \n-
    32 typedef Alloc allocator;
    \n-
    33 typedef std::list< std::pair<Key, Tp> > list_type;
    \n-
    34 typedef typename list_type::iterator iterator;
    \n-
    35 typedef typename std::less<key_type> cmp;
    \n-
    36 typedef std::map< key_type, iterator, cmp,
    \n-
    37 typename std::allocator_traits<allocator>::template rebind_alloc<std::pair<const key_type, iterator> > > map_type;
    \n-
    38 };
    \n-
    39
    \n-
    40 } // end empty namespace
    \n-
    41
    \n-
    49 template <typename Key, typename Tp,
    \n-
    50 typename Traits = _lru_default_traits<Key, Tp> >
    \n-
    \n-
    51 class lru
    \n-
    52 {
    \n-
    53 typedef typename Traits::list_type list_type;
    \n-
    54 typedef typename Traits::map_type map_type;
    \n-
    55 typedef typename Traits::allocator allocator;
    \n-
    56 typedef typename map_type::iterator map_iterator;
    \n-
    57 typedef typename map_type::const_iterator const_map_iterator;
    \n+
    12#include <algorithm>
    \n+
    13#include <cassert>
    \n+
    14#include <cmath>
    \n+
    15#include <complex>
    \n+
    16#include <cstddef>
    \n+
    17#include <initializer_list>
    \n+
    18#include <iostream>
    \n+
    19#include <memory>
    \n+
    20
    \n+\n+\n+\n+\n+\n+\n+\n+
    28
    \n+
    29
    \n+
    30namespace Dune {
    \n+
    31
    \n+
    32 template< class K, int n > class DiagonalRowVectorConst;
    \n+
    33 template< class K, int n > class DiagonalRowVector;
    \n+
    34 template< class DiagonalMatrixType > class DiagonalMatrixWrapper;
    \n+
    35 template< class C, class T, class R> class ContainerWrapperIterator;
    \n+
    36
    \n+
    51 template<class K, int n>
    \n+
    \n+\n+
    53 {
    \n+\n+
    55
    \n+
    56 public:
    \n+
    57 //===== type definitions and constants
    \n
    58
    \n-
    59 public:
    \n-
    60 typedef typename Traits::key_type key_type;
    \n-
    61 typedef typename allocator::value_type value_type;
    \n-
    62 using pointer = typename allocator::value_type*;
    \n-
    63 using const_pointer = typename allocator::value_type const*;
    \n-
    64 using const_reference = typename allocator::value_type const&;
    \n-
    65 using reference = typename allocator::value_type&;
    \n-
    66 typedef typename allocator::size_type size_type;
    \n-
    67 typedef typename list_type::iterator iterator;
    \n-
    68 typedef typename list_type::const_iterator const_iterator;
    \n-
    69
    \n-
    \n-\n-
    75 {
    \n-
    76 return _data.front().second;
    \n-
    77 }
    \n-
    \n-
    78
    \n-
    \n-\n-
    84 {
    \n-
    85 return _data.front().second;
    \n-
    86 }
    \n-
    \n-
    87
    \n-
    \n-\n-
    93 {
    \n-
    94 return _data.back().second;
    \n-
    95 }
    \n-
    \n+
    60 typedef K value_type;
    \n+\n+
    62
    \n+
    64 typedef K block_type;
    \n+
    65
    \n+
    67 typedef std::size_t size_type;
    \n+
    68
    \n+
    70 constexpr static int blocklevel = 1;
    \n+
    71
    \n+\n+\n+\n+\n+\n+\n+
    79
    \n+
    81 constexpr static int rows = n;
    \n+
    83 constexpr static int cols = n;
    \n+
    84
    \n+
    85 //==== size
    \n+
    86
    \n+
    \n+
    87 static constexpr size_type size ()
    \n+
    88 {
    \n+
    89 return rows;
    \n+
    90 }
    \n+
    \n+
    91
    \n+
    92 //===== constructors
    \n+
    93
    \n+
    95 constexpr DiagonalMatrix() = default;
    \n
    96
    \n-
    \n-
    101 const_reference back ([[maybe_unused]] int i) const
    \n-
    102 {
    \n-
    103 return _data.back().second;
    \n-
    104 }
    \n+
    \n+
    98 DiagonalMatrix (const K& k)
    \n+
    99 : diag_(k)
    \n+
    100 {}
    \n+
    \n+
    101
    \n+
    \n+\n+
    104 : diag_(diag)
    \n+
    105 {}
    \n
    \n-
    105
    \n
    106
    \n-
    \n-\n-
    111 {
    \n-
    112 key_type k = _data.front().first;
    \n-
    113 _data.pop_front();
    \n-
    114 _index.erase(k);
    \n-
    115 }
    \n-
    \n-
    \n-
    119 void pop_back()
    \n-
    120 {
    \n-
    121 key_type k = _data.back().first;
    \n-
    122 _data.pop_back();
    \n-
    123 _index.erase(k);
    \n-
    124 }
    \n-
    \n-
    125
    \n-
    \n-
    131 iterator find (const key_type & key)
    \n-
    132 {
    \n-
    133 const map_iterator it = _index.find(key);
    \n-
    134 if (it == _index.end()) return _data.end();
    \n-
    135 return it->second;
    \n-
    136 }
    \n-
    \n-
    137
    \n-
    \n-
    143 const_iterator find (const key_type & key) const
    \n-
    144 {
    \n-
    145 const map_iterator it = _index.find(key);
    \n-
    146 if (it == _index.end()) return _data.end();
    \n-
    147 return it->second;
    \n-
    148 }
    \n-
    \n-
    149
    \n-
    \n-\n-
    162 {
    \n-
    163 std::pair<key_type, value_type> x(key, data);
    \n-
    164 /* insert item as mru */
    \n-
    165 iterator it = _data.insert(_data.begin(), x);
    \n-
    166 /* store index */
    \n-
    167 _index.insert(std::make_pair(key,it));
    \n-
    168
    \n-
    169 return it->second;
    \n-
    170 }
    \n-
    \n-
    171
    \n-
    \n-\n-
    176 {
    \n-
    177 return touch (key);
    \n-
    178 }
    \n-
    \n-
    179
    \n-
    \n-\n-
    186 {
    \n-
    187 /* query _index for iterator */
    \n-
    188 map_iterator it = _index.find(key);
    \n-
    189 if (it == _index.end())
    \n-\n-
    191 "Failed to touch key " << key << ", it is not in the lru container");
    \n-
    192 /* update _data
    \n-
    193 move it to the front
    \n-
    194 */
    \n-
    195 _data.splice(_data.begin(), _data, it->second);
    \n-
    196 return it->second->second;
    \n+
    \n+
    115 DiagonalMatrix (std::initializer_list<K> const &l)
    \n+
    116 {
    \n+
    117 std::copy_n(l.begin(), std::min(static_cast<std::size_t>(rows),
    \n+
    118 l.size()),
    \n+
    119 diag_.begin());
    \n+
    120 }
    \n+
    \n+
    121
    \n+
    \n+\n+
    124 {
    \n+
    125 diag_ = k;
    \n+
    126 return *this;
    \n+
    127 }
    \n+
    \n+
    128
    \n+
    \n+
    130 bool identical(const DiagonalMatrix<K,n>& other) const
    \n+
    131 {
    \n+
    132 return (this==&other);
    \n+
    133 }
    \n+
    \n+
    134
    \n+
    \n+\n+
    137 {
    \n+
    138 return *this;
    \n+
    139 }
    \n+
    \n+
    140
    \n+
    141 //===== iterator interface to rows of the matrix
    \n+\n+\n+\n+\n+
    150
    \n+
    \n+\n+
    153 {
    \n+
    154 return Iterator(WrapperType(this),0);
    \n+
    155 }
    \n+
    \n+
    156
    \n+
    \n+\n+
    159 {
    \n+
    160 return Iterator(WrapperType(this),n);
    \n+
    161 }
    \n+
    \n+
    162
    \n+
    \n+\n+
    166 {
    \n+
    167 return Iterator(WrapperType(this),n-1);
    \n+
    168 }
    \n+
    \n+
    169
    \n+
    \n+\n+
    173 {
    \n+
    174 return Iterator(WrapperType(this),-1);
    \n+
    175 }
    \n+
    \n+
    176
    \n+
    177
    \n+\n+\n+\n+\n+
    186
    \n+
    \n+\n+
    189 {
    \n+
    190 return ConstIterator(WrapperType(this),0);
    \n+
    191 }
    \n+
    \n+
    192
    \n+
    \n+\n+
    195 {
    \n+
    196 return ConstIterator(WrapperType(this),n);
    \n
    197 }
    \n
    \n
    198
    \n-
    \n-\n-
    203 {
    \n-
    204 return _data.size();
    \n-
    205 }
    \n-
    \n-
    206
    \n-
    \n-
    213 void resize(size_type new_size)
    \n-
    214 {
    \n-
    215 assert(new_size <= size());
    \n+
    \n+\n+
    202 {
    \n+
    203 return ConstIterator(WrapperType(this),n-1);
    \n+
    204 }
    \n+
    \n+
    205
    \n+
    \n+\n+
    209 {
    \n+
    210 return ConstIterator(WrapperType(this),-1);
    \n+
    211 }
    \n+
    \n+
    212
    \n+
    213
    \n+
    214
    \n+
    215 //===== vector space arithmetic
    \n
    216
    \n-
    217 while (new_size < size())
    \n-
    218 pop_back();
    \n-
    219 }
    \n-
    \n-
    220
    \n-
    \n-
    224 void clear()
    \n-
    225 {
    \n-
    226 _data.clear();
    \n-
    227 _index.clear();
    \n-
    228 }
    \n-
    \n-
    229
    \n-
    230 private:
    \n-
    231 list_type _data;
    \n-
    232 map_type _index;
    \n-
    233
    \n-
    234 };
    \n+
    \n+\n+
    219 {
    \n+
    220 diag_ += y.diag_;
    \n+
    221 return *this;
    \n+
    222 }
    \n+
    \n+
    223
    \n+
    \n+\n+
    226 {
    \n+
    227 diag_ -= y.diag_;
    \n+
    228 return *this;
    \n+
    229 }
    \n+
    \n+
    230
    \n+
    \n+\n+
    233 {
    \n+
    234 diag_ += k;
    \n+
    235 return *this;
    \n+
    236 }
    \n
    \n-
    235
    \n-
    236} // namespace Dune
    \n
    237
    \n-
    238#endif // DUNE_COMMON_LRU_HH
    \n-
    A few common exception classes.
    \n+
    \n+\n+
    240 {
    \n+
    241 diag_ -= k;
    \n+
    242 return *this;
    \n+
    243 }
    \n+
    \n+
    244
    \n+
    \n+\n+
    247 {
    \n+
    248 diag_ *= k;
    \n+
    249 return *this;
    \n+
    250 }
    \n+
    \n+
    251
    \n+
    \n+\n+
    254 {
    \n+
    255 diag_ /= k;
    \n+
    256 return *this;
    \n+
    257 }
    \n+
    \n+
    258
    \n+
    259 //===== comparison ops
    \n+
    260
    \n+
    \n+
    262 bool operator==(const DiagonalMatrix& other) const
    \n+
    263 {
    \n+
    264 return diag_==other.diagonal();
    \n+
    265 }
    \n+
    \n+
    266
    \n+
    \n+
    268 bool operator!=(const DiagonalMatrix& other) const
    \n+
    269 {
    \n+
    270 return diag_!=other.diagonal();
    \n+
    271 }
    \n+
    \n+
    272
    \n+
    273
    \n+
    274 //===== linear maps
    \n+
    275
    \n+
    277 template<class X, class Y>
    \n+
    \n+
    278 void mv (const X& x, Y& y) const
    \n+
    279 {
    \n+
    280#ifdef DUNE_FMatrix_WITH_CHECKING
    \n+
    281 if (x.N()!=M()) DUNE_THROW(FMatrixError,"index out of range");
    \n+
    282 if (y.N()!=N()) DUNE_THROW(FMatrixError,"index out of range");
    \n+
    283#endif
    \n+
    284 for (size_type i=0; i<n; ++i)
    \n+
    285 y[i] = diag_[i] * x[i];
    \n+
    286 }
    \n+
    \n+
    287
    \n+
    289 template<class X, class Y>
    \n+
    \n+
    290 void mtv (const X& x, Y& y) const
    \n+
    291 {
    \n+
    292 mv(x, y);
    \n+
    293 }
    \n+
    \n+
    294
    \n+
    296 template<class X, class Y>
    \n+
    \n+
    297 void umv (const X& x, Y& y) const
    \n+
    298 {
    \n+
    299#ifdef DUNE_FMatrix_WITH_CHECKING
    \n+
    300 if (x.N()!=M()) DUNE_THROW(FMatrixError,"index out of range");
    \n+
    301 if (y.N()!=N()) DUNE_THROW(FMatrixError,"index out of range");
    \n+
    302#endif
    \n+
    303 for (size_type i=0; i<n; ++i)
    \n+
    304 y[i] += diag_[i] * x[i];
    \n+
    305 }
    \n+
    \n+
    306
    \n+
    308 template<class X, class Y>
    \n+
    \n+
    309 void umtv (const X& x, Y& y) const
    \n+
    310 {
    \n+
    311#ifdef DUNE_FMatrix_WITH_CHECKING
    \n+
    312 if (x.N()!=N()) DUNE_THROW(FMatrixError,"index out of range");
    \n+
    313 if (y.N()!=M()) DUNE_THROW(FMatrixError,"index out of range");
    \n+
    314#endif
    \n+
    315 for (size_type i=0; i<n; ++i)
    \n+
    316 y[i] += diag_[i] * x[i];
    \n+
    317 }
    \n+
    \n+
    318
    \n+
    320 template<class X, class Y>
    \n+
    \n+
    321 void umhv (const X& x, Y& y) const
    \n+
    322 {
    \n+
    323#ifdef DUNE_FMatrix_WITH_CHECKING
    \n+
    324 if (x.N()!=N()) DUNE_THROW(FMatrixError,"index out of range");
    \n+
    325 if (y.N()!=M()) DUNE_THROW(FMatrixError,"index out of range");
    \n+
    326#endif
    \n+
    327 for (size_type i=0; i<n; i++)
    \n+
    328 y[i] += conjugateComplex(diag_[i])*x[i];
    \n+
    329 }
    \n+
    \n+
    330
    \n+
    332 template<class X, class Y>
    \n+
    \n+
    333 void mmv (const X& x, Y& y) const
    \n+
    334 {
    \n+
    335#ifdef DUNE_FMatrix_WITH_CHECKING
    \n+
    336 if (x.N()!=M()) DUNE_THROW(FMatrixError,"index out of range");
    \n+
    337 if (y.N()!=N()) DUNE_THROW(FMatrixError,"index out of range");
    \n+
    338#endif
    \n+
    339 for (size_type i=0; i<n; ++i)
    \n+
    340 y[i] -= diag_[i] * x[i];
    \n+
    341 }
    \n+
    \n+
    342
    \n+
    344 template<class X, class Y>
    \n+
    \n+
    345 void mmtv (const X& x, Y& y) const
    \n+
    346 {
    \n+
    347#ifdef DUNE_FMatrix_WITH_CHECKING
    \n+
    348 if (x.N()!=N()) DUNE_THROW(FMatrixError,"index out of range");
    \n+
    349 if (y.N()!=M()) DUNE_THROW(FMatrixError,"index out of range");
    \n+
    350#endif
    \n+
    351 for (size_type i=0; i<n; ++i)
    \n+
    352 y[i] -= diag_[i] * x[i];
    \n+
    353 }
    \n+
    \n+
    354
    \n+
    356 template<class X, class Y>
    \n+
    \n+
    357 void mmhv (const X& x, Y& y) const
    \n+
    358 {
    \n+
    359#ifdef DUNE_FMatrix_WITH_CHECKING
    \n+
    360 if (x.N()!=N()) DUNE_THROW(FMatrixError,"index out of range");
    \n+
    361 if (y.N()!=M()) DUNE_THROW(FMatrixError,"index out of range");
    \n+
    362#endif
    \n+
    363 for (size_type i=0; i<n; i++)
    \n+
    364 y[i] -= conjugateComplex(diag_[i])*x[i];
    \n+
    365 }
    \n+
    \n+
    366
    \n+
    368 template<class X, class Y>
    \n+
    \n+
    369 void usmv (const typename FieldTraits<Y>::field_type & alpha,
    \n+
    370 const X& x, Y& y) const
    \n+
    371 {
    \n+
    372#ifdef DUNE_FMatrix_WITH_CHECKING
    \n+
    373 if (x.N()!=M()) DUNE_THROW(FMatrixError,"index out of range");
    \n+
    374 if (y.N()!=N()) DUNE_THROW(FMatrixError,"index out of range");
    \n+
    375#endif
    \n+
    376 for (size_type i=0; i<n; i++)
    \n+
    377 y[i] += alpha * diag_[i] * x[i];
    \n+
    378 }
    \n+
    \n+
    379
    \n+
    381 template<class X, class Y>
    \n+
    \n+
    382 void usmtv (const typename FieldTraits<Y>::field_type & alpha,
    \n+
    383 const X& x, Y& y) const
    \n+
    384 {
    \n+
    385#ifdef DUNE_FMatrix_WITH_CHECKING
    \n+
    386 if (x.N()!=N()) DUNE_THROW(FMatrixError,"index out of range");
    \n+
    387 if (y.N()!=M()) DUNE_THROW(FMatrixError,"index out of range");
    \n+
    388#endif
    \n+
    389 for (size_type i=0; i<n; i++)
    \n+
    390 y[i] += alpha * diag_[i] * x[i];
    \n+
    391 }
    \n+
    \n+
    392
    \n+
    394 template<class X, class Y>
    \n+
    \n+
    395 void usmhv (const typename FieldTraits<Y>::field_type & alpha,
    \n+
    396 const X& x, Y& y) const
    \n+
    397 {
    \n+
    398#ifdef DUNE_FMatrix_WITH_CHECKING
    \n+
    399 if (x.N()!=N()) DUNE_THROW(FMatrixError,"index out of range");
    \n+
    400 if (y.N()!=M()) DUNE_THROW(FMatrixError,"index out of range");
    \n+
    401#endif
    \n+
    402 for (size_type i=0; i<n; i++)
    \n+
    403 y[i] += alpha * conjugateComplex(diag_[i]) * x[i];
    \n+
    404 }
    \n+
    \n+
    405
    \n+
    406 //===== norms
    \n+
    407
    \n+
    \n+
    409 double frobenius_norm () const
    \n+
    410 {
    \n+
    411 return diag_.two_norm();
    \n+
    412 }
    \n+
    \n+
    413
    \n+
    \n+
    415 double frobenius_norm2 () const
    \n+
    416 {
    \n+
    417 return diag_.two_norm2();
    \n+
    418 }
    \n+
    \n+
    419
    \n+
    \n+
    421 double infinity_norm () const
    \n+
    422 {
    \n+
    423 return diag_.infinity_norm();
    \n+
    424 }
    \n+
    \n+
    425
    \n+
    \n+
    427 double infinity_norm_real () const
    \n+
    428 {
    \n+
    429 return diag_.infinity_norm_real();
    \n+
    430 }
    \n+
    \n+
    431
    \n+
    432
    \n+
    433
    \n+
    434 //===== solve
    \n+
    435
    \n+
    437 template<class V>
    \n+
    \n+
    438 void solve (V& x, const V& b) const
    \n+
    439 {
    \n+
    440 for (int i=0; i<n; i++)
    \n+
    441 x[i] = b[i]/diag_[i];
    \n+
    442 }
    \n+
    \n+
    443
    \n+
    \n+
    445 void invert()
    \n+
    446 {
    \n+
    447 using real_type = typename FieldTraits<K>::real_type;
    \n+
    448 for (int i=0; i<n; i++)
    \n+
    449 diag_[i] = real_type(1.0)/diag_[i];
    \n+
    450 }
    \n+
    \n+
    451
    \n+
    \n+
    453 K determinant () const
    \n+
    454 {
    \n+
    455 K det = diag_[0];
    \n+
    456 for (int i=1; i<n; i++)
    \n+
    457 det *= diag_[i];
    \n+
    458 return det;
    \n+
    459 }
    \n+
    \n+
    460
    \n+
    461
    \n+
    462
    \n+
    463 //===== matrix-matrix multiplication
    \n+
    464
    \n+
    467 template <class OtherScalar>
    \n+
    \n+
    468 friend auto operator* ( const DiagonalMatrix& matrixA,
    \n+
    469 const DiagonalMatrix<OtherScalar, n>& matrixB)
    \n+
    470 {
    \n+\n+
    472 for(int i=0; i<n; ++i)
    \n+
    473 result.diagonal(i) = matrixA.diagonal(i)*matrixB.diagonal(i);
    \n+
    474 return result;
    \n+
    475 }
    \n+
    \n+
    476
    \n+
    477
    \n+
    478
    \n+
    479 //===== sizes
    \n+
    480
    \n+
    \n+
    482 static constexpr size_type N ()
    \n+
    483 {
    \n+
    484 return n;
    \n+
    485 }
    \n+
    \n+
    486
    \n+
    \n+
    488 static constexpr size_type M ()
    \n+
    489 {
    \n+
    490 return n;
    \n+
    491 }
    \n+
    \n+
    492
    \n+
    493
    \n+
    494
    \n+
    495 //===== query
    \n+
    496
    \n+
    \n+
    498 bool exists (size_type i, size_type j) const
    \n+
    499 {
    \n+
    500 DUNE_ASSERT_BOUNDS(i >= 0 && i < n);
    \n+
    501 DUNE_ASSERT_BOUNDS(j >= 0 && j < n);
    \n+
    502 return i==j;
    \n+
    503 }
    \n+
    \n+
    504
    \n+
    505
    \n+
    506
    \n+
    \n+
    508 friend std::ostream& operator<< (std::ostream& s, const DiagonalMatrix<K,n>& a)
    \n+
    509 {
    \n+
    510 for (size_type i=0; i<n; i++) {
    \n+
    511 for (size_type j=0; j<n; j++)
    \n+
    512 s << ((i==j) ? a.diag_[i] : 0) << " ";
    \n+
    513 s << std::endl;
    \n+
    514 }
    \n+
    515 return s;
    \n+
    516 }
    \n+
    \n+
    517
    \n+
    \n+\n+
    520 {
    \n+
    521 return reference(const_cast<K*>(&diag_[i]), i);
    \n+
    522 }
    \n+
    \n+
    523
    \n+
    \n+\n+
    526 {
    \n+
    527 return const_reference(const_cast<K*>(&diag_[i]), i);
    \n+
    528 }
    \n+
    \n+
    529
    \n+
    \n+
    531 const K& diagonal(size_type i) const
    \n+
    532 {
    \n+
    533 return diag_[i];
    \n+
    534 }
    \n+
    \n+
    535
    \n+
    \n+\n+
    538 {
    \n+
    539 return diag_[i];
    \n+
    540 }
    \n+
    \n+
    541
    \n+
    \n+\n+
    544 {
    \n+
    545 return diag_;
    \n+
    546 }
    \n+
    \n+
    547
    \n+
    \n+\n+
    550 {
    \n+
    551 return diag_;
    \n+
    552 }
    \n+
    \n+
    553
    \n+
    554 private:
    \n+
    555
    \n+
    556 // the data, a FieldVector storing the diagonal
    \n+
    557 FieldVector<K,n> diag_;
    \n+
    558 };
    \n+
    \n+
    559
    \n+
    560 template< class K, int n >
    \n+
    \n+\n+
    562 {
    \n+\n+\n+
    565 };
    \n+
    \n+
    566
    \n+
    567
    \n+
    568#ifndef DOXYGEN // hide specialization
    \n+
    571 template< class K >
    \n+
    572 class DiagonalMatrix<K, 1> : public FieldMatrix<K, 1, 1>
    \n+
    573 {
    \n+
    574 typedef FieldMatrix<K,1,1> Base;
    \n+
    575 public:
    \n+
    577 typedef typename Base::size_type size_type;
    \n+
    578
    \n+
    581 constexpr static int blocklevel = 1;
    \n+
    582
    \n+
    583 typedef typename Base::row_type row_type;
    \n+
    584
    \n+
    585 typedef typename Base::row_reference row_reference;
    \n+
    586 typedef typename Base::const_row_reference const_row_reference;
    \n+
    587
    \n+
    590 constexpr static int rows = 1;
    \n+
    593 constexpr static int cols = 1;
    \n+
    594
    \n+
    595
    \n+
    597 constexpr DiagonalMatrix() = default;
    \n+
    598
    \n+
    600 DiagonalMatrix(const K& scalar)
    \n+
    601 {
    \n+
    602 (*this)[0][0] = scalar;
    \n+
    603 }
    \n+
    604
    \n+
    606 const K& diagonal(size_type) const
    \n+
    607 {
    \n+
    608 return (*this)[0][0];
    \n+
    609 }
    \n+
    610
    \n+\n+
    613 {
    \n+
    614 return (*this)[0][0];
    \n+
    615 }
    \n+
    616
    \n+
    618 const FieldVector<K,1>& diagonal() const
    \n+
    619 {
    \n+
    620 return (*this)[0];
    \n+
    621 }
    \n+
    622
    \n+
    624 FieldVector<K,1>& diagonal()
    \n+
    625 {
    \n+
    626 return (*this)[0];
    \n+
    627 }
    \n+
    628
    \n+
    630 DiagonalMatrix<K, 1> transposed() const
    \n+
    631 {
    \n+
    632 return *this;
    \n+
    633 }
    \n+
    634
    \n+
    637 template <class OtherScalar>
    \n+
    638 friend auto operator* ( const DiagonalMatrix& matrixA,
    \n+
    639 const DiagonalMatrix<OtherScalar, 1>& matrixB)
    \n+
    640 {
    \n+
    641 return DiagonalMatrix<typename PromotionTraits<K,OtherScalar>::PromotedType, 1>{matrixA.diagonal(0)*matrixB.diagonal(0)};
    \n+
    642 }
    \n+
    643
    \n+
    644 };
    \n+
    645#endif
    \n+
    646
    \n+
    647
    \n+
    648 template<class DiagonalMatrixType>
    \n+
    \n+\n+
    650 {
    \n+
    651 typedef typename DiagonalMatrixType::reference reference;
    \n+
    652 typedef typename DiagonalMatrixType::const_reference const_reference;
    \n+
    653 typedef typename DiagonalMatrixType::field_type K;
    \n+\n+
    655 typedef std::size_t size_type;
    \n+\n+
    657
    \n+
    658 friend class ContainerWrapperIterator<const MyType, reference, reference>;
    \n+
    659 friend class ContainerWrapperIterator<const MyType, const_reference, const_reference>;
    \n+
    660
    \n+
    661 public:
    \n+
    662
    \n+
    \n+\n+
    664 mat_(0)
    \n+
    665 {}
    \n+
    \n+
    666
    \n+
    \n+
    667 DiagonalMatrixWrapper(const DiagonalMatrixType* mat) :
    \n+
    668 mat_(const_cast<DiagonalMatrixType*>(mat))
    \n+
    669 {}
    \n+
    \n+
    670
    \n+
    \n+
    671 size_type realIndex(int i) const
    \n+
    672 {
    \n+
    673 return i;
    \n+
    674 }
    \n+
    \n+
    675
    \n+
    \n+
    676 row_type* pointer(int i) const
    \n+
    677 {
    \n+
    678 row_ = row_type(&(mat_->diagonal(i)), i);
    \n+
    679 return &row_;
    \n+
    680 }
    \n+
    \n+
    681
    \n+
    \n+
    682 bool identical(const DiagonalMatrixWrapper& other) const
    \n+
    683 {
    \n+
    684 return mat_==other.mat_;
    \n+
    685 }
    \n+
    \n+
    686
    \n+
    687 private:
    \n+
    688
    \n+
    689 mutable DiagonalMatrixType* mat_;
    \n+
    690 mutable row_type row_;
    \n+
    691 };
    \n+
    \n+
    692
    \n+
    696 template< class K, int n >
    \n+
    \n+\n+
    698 {
    \n+
    699 template<class DiagonalMatrixType>
    \n+\n+
    701 friend class ContainerWrapperIterator<DiagonalRowVectorConst<K,n>, const K, const K&>;
    \n+
    702
    \n+
    703 public:
    \n+
    704 // remember size of vector
    \n+
    705 constexpr static int dimension = n;
    \n+
    706
    \n+
    707 // standard constructor and everything is sufficient ...
    \n+
    708
    \n+
    709 //===== type definitions and constants
    \n+
    710
    \n+
    712 typedef K field_type;
    \n+
    713
    \n+
    715 typedef K block_type;
    \n+
    716
    \n+
    718 typedef std::size_t size_type;
    \n+
    719
    \n+
    721 constexpr static int blocklevel = 1;
    \n+
    722
    \n+
    724 constexpr static int size = n;
    \n+
    725
    \n+
    \n+\n+
    728 p_(0),
    \n+
    729 row_(0)
    \n+
    730 {}
    \n+
    \n+
    731
    \n+
    \n+
    733 explicit DiagonalRowVectorConst (K* p, int col) :
    \n+
    734 p_(p),
    \n+
    735 row_(col)
    \n+
    736 {}
    \n+
    \n+
    737
    \n+
    738 //===== access to components
    \n+
    739
    \n+
    \n+
    741 const K& operator[] ([[maybe_unused]] size_type i) const
    \n+
    742 {
    \n+\n+
    744 return *p_;
    \n+
    745 }
    \n+
    \n+
    746
    \n+
    747 // check if row is identical to other row (not only identical values)
    \n+
    748 // since this is a proxy class we need to check equality of the stored pointer
    \n+
    \n+
    749 bool identical(const DiagonalRowVectorConst<K,n>& other) const
    \n+
    750 {
    \n+
    751 return ((p_ == other.p_)and (row_ == other.row_));
    \n+
    752 }
    \n+
    \n+
    753
    \n+\n+\n+
    758
    \n+
    \n+\n+
    761 {
    \n+
    762 return ConstIterator(*this,0);
    \n+
    763 }
    \n+
    \n+
    764
    \n+
    \n+\n+
    767 {
    \n+
    768 return ConstIterator(*this,1);
    \n+
    769 }
    \n+
    \n+
    770
    \n+
    \n+\n+
    774 {
    \n+
    775 return ConstIterator(*this,0);
    \n+
    776 }
    \n+
    \n+
    777
    \n+
    \n+\n+
    781 {
    \n+
    782 return ConstIterator(*this,-1);
    \n+
    783 }
    \n+
    \n+
    784
    \n+
    \n+\n+
    787 {
    \n+
    788 return ((p_==y.p_)and (row_==y.row_));
    \n+
    789 }
    \n+
    \n+
    790
    \n+
    791 //===== sizes
    \n+
    792
    \n+
    \n+
    794 size_type N () const
    \n+
    795 {
    \n+
    796 return n;
    \n+
    797 }
    \n+
    \n+
    798
    \n+
    \n+
    800 size_type dim () const
    \n+
    801 {
    \n+
    802 return n;
    \n+
    803 }
    \n+
    \n+
    804
    \n+
    \n+\n+
    807 {
    \n+
    808 return row_;
    \n+
    809 }
    \n+
    \n+
    810
    \n+
    \n+
    812 const K& diagonal() const
    \n+
    813 {
    \n+
    814 return *p_;
    \n+
    815 }
    \n+
    \n+
    816
    \n+
    817 protected:
    \n+
    818
    \n+
    \n+
    819 size_type realIndex([[maybe_unused]] int i) const
    \n+
    820 {
    \n+
    821 return rowIndex();
    \n+
    822 }
    \n+
    \n+
    823
    \n+
    \n+
    824 K* pointer([[maybe_unused]] size_type i) const
    \n+
    825 {
    \n+
    826 return const_cast<K*>(p_);
    \n+
    827 }
    \n+
    \n+
    828
    \n+
    \n+\n+
    830 {
    \n+
    831 return this;
    \n+
    832 }
    \n+
    \n+
    833
    \n+
    834 // the data, very simply a pointer to the diagonal value and the row number
    \n+
    835 K* p_;
    \n+\n+
    837 };
    \n+
    \n+
    838
    \n+
    839 template< class K, int n >
    \n+
    \n+\n+
    841 {
    \n+
    842 template<class DiagonalMatrixType>
    \n+\n+
    844 friend class ContainerWrapperIterator<DiagonalRowVector<K,n>, K, K&>;
    \n+
    845
    \n+
    846 public:
    \n+
    847 // standard constructor and everything is sufficient ...
    \n+
    848
    \n+
    849 //===== type definitions and constants
    \n+
    850
    \n+
    852 typedef K field_type;
    \n+
    853
    \n+
    855 typedef K block_type;
    \n+
    856
    \n+
    858 typedef std::size_t size_type;
    \n+
    859
    \n+
    \n+\n+
    862 {}
    \n+
    \n+
    863
    \n+
    \n+
    865 explicit DiagonalRowVector (K* p, int col) : DiagonalRowVectorConst<K,n>(p, col)
    \n+
    866 {}
    \n+
    \n+
    867
    \n+
    868 //===== assignment from scalar
    \n+
    \n+\n+
    871 {
    \n+
    872 *p_ = k;
    \n+
    873 return *this;
    \n+
    874 }
    \n+
    \n+
    875
    \n+
    876 //===== access to components
    \n+
    877
    \n+
    \n+
    879 K& operator[] ([[maybe_unused]] size_type i)
    \n+
    880 {
    \n+\n+
    882 return *p_;
    \n+
    883 }
    \n+
    \n+
    884
    \n+\n+\n+
    889
    \n+
    \n+\n+
    892 {
    \n+
    893 return Iterator(*this, 0);
    \n+
    894 }
    \n+
    \n+
    895
    \n+
    \n+\n+
    898 {
    \n+
    899 return Iterator(*this, 1);
    \n+
    900 }
    \n+
    \n+
    901
    \n+
    \n+\n+
    905 {
    \n+
    906 return Iterator(*this, 0);
    \n+
    907 }
    \n+
    \n+
    908
    \n+
    \n+\n+
    912 {
    \n+
    913 return Iterator(*this, -1);
    \n+
    914 }
    \n+
    \n+
    915
    \n+\n+\n+
    920
    \n+\n+
    922 using DiagonalRowVectorConst<K,n>::operator[];
    \n+
    923 using DiagonalRowVectorConst<K,n>::operator==;
    \n+\n+\n+\n+\n+
    928 using DiagonalRowVectorConst<K,n>::N;
    \n+\n+\n+\n+
    932
    \n+
    933 protected:
    \n+
    934
    \n+
    \n+\n+
    936 {
    \n+
    937 return this;
    \n+
    938 }
    \n+
    \n+
    939
    \n+
    940 private:
    \n+
    941
    \n+\n+\n+
    944 };
    \n+
    \n+
    945
    \n+
    946
    \n+
    947 // implement type traits
    \n+
    948 template<class K, int n>
    \n+
    \n+\n+
    950 {
    \n+\n+
    952 };
    \n+
    \n+
    953
    \n+
    954 template<class K, int n>
    \n+
    \n+\n+
    956 {
    \n+\n+
    958 };
    \n+
    \n+
    959
    \n+
    960 template<class K, int n>
    \n+
    \n+\n+
    962 {
    \n+\n+
    964 };
    \n+
    \n+
    965
    \n+
    966 template<class K, int n>
    \n+
    \n+\n+
    968 {
    \n+\n+
    970 };
    \n+
    \n+
    971
    \n+
    972
    \n+
    973
    \n+
    996 template<class CW, class T, class R>
    \n+
    \n+
    997 class ContainerWrapperIterator : public BidirectionalIteratorFacade<ContainerWrapperIterator<CW,T,R>,T, R, int>
    \n+
    998 {
    \n+
    999 typedef typename std::remove_const<CW>::type NonConstCW;
    \n+
    1000
    \n+
    1001 friend class ContainerWrapperIterator<CW, typename mutable_reference<T>::type, typename mutable_reference<R>::type>;
    \n+
    1002 friend class ContainerWrapperIterator<CW, typename const_reference<T>::type, typename const_reference<R>::type>;
    \n+
    1003
    \n+
    1004 typedef ContainerWrapperIterator<CW, typename mutable_reference<T>::type, typename mutable_reference<R>::type> MyType;
    \n+
    1005 typedef ContainerWrapperIterator<CW, typename const_reference<T>::type, typename const_reference<R>::type> MyConstType;
    \n+
    1006
    \n+
    1007 public:
    \n+
    1008
    \n+
    1009 // Constructors needed by the facade iterators.
    \n+
    \n+\n+
    1011 containerWrapper_(),
    \n+
    1012 position_(0)
    \n+
    1013 {}
    \n+
    \n+
    1014
    \n+
    \n+
    1015 ContainerWrapperIterator(CW containerWrapper, int position) :
    \n+
    1016 containerWrapper_(containerWrapper),
    \n+
    1017 position_(position)
    \n+
    1018 {}
    \n+
    \n+
    1019
    \n+
    1020 template<class OtherContainerWrapperIteratorType>
    \n+
    \n+
    1021 ContainerWrapperIterator(OtherContainerWrapperIteratorType& other) :
    \n+
    1022 containerWrapper_(other.containerWrapper_),
    \n+
    1023 position_(other.position_)
    \n+
    1024 {}
    \n+
    \n+
    1025
    \n+
    \n+\n+
    1027 containerWrapper_(other.containerWrapper_),
    \n+
    1028 position_(other.position_)
    \n+
    1029 {}
    \n+
    \n+
    1030
    \n+
    \n+\n+
    1032 containerWrapper_(other.containerWrapper_),
    \n+
    1033 position_(other.position_)
    \n+
    1034 {}
    \n+
    \n+
    1035
    \n+
    1036 template<class OtherContainerWrapperIteratorType>
    \n+
    \n+
    1037 ContainerWrapperIterator& operator=(OtherContainerWrapperIteratorType& other)
    \n+
    1038 {
    \n+
    1039 containerWrapper_ = other.containerWrapper_;
    \n+
    1040 position_ = other.position_;
    \n+
    1041 return *this;
    \n+
    1042 }
    \n+
    \n+
    1043
    \n+
    1044 // This operator is needed since we can not get the address of the
    \n+
    1045 // temporary object returned by dereference
    \n+
    \n+
    1046 T* operator->() const
    \n+
    1047 {
    \n+
    1048 return containerWrapper_.pointer(position_);
    \n+
    1049 }
    \n+
    \n+
    1050
    \n+
    1051 // Methods needed by the forward iterator
    \n+
    \n+
    1052 bool equals(const MyType& other) const
    \n+
    1053 {
    \n+
    1054 return position_ == other.position_ && containerWrapper_.identical(other.containerWrapper_);
    \n+
    1055 }
    \n+
    \n+
    1056
    \n+
    \n+
    1057 bool equals(const MyConstType& other) const
    \n+
    1058 {
    \n+
    1059 return position_ == other.position_ && containerWrapper_.identical(other.containerWrapper_);
    \n+
    1060 }
    \n+
    \n+
    1061
    \n+
    \n+
    1062 R dereference() const
    \n+
    1063 {
    \n+
    1064 return *containerWrapper_.pointer(position_);
    \n+
    1065 }
    \n+
    \n+
    1066
    \n+
    \n+\n+
    1068 {
    \n+
    1069 ++position_;
    \n+
    1070 }
    \n+
    \n+
    1071
    \n+
    1072 // Additional function needed by BidirectionalIterator
    \n+
    \n+\n+
    1074 {
    \n+
    1075 --position_;
    \n+
    1076 }
    \n+
    \n+
    1077
    \n+
    1078 // Additional function needed by RandomAccessIterator
    \n+
    \n+
    1079 R elementAt(int i) const
    \n+
    1080 {
    \n+
    1081 return *containerWrapper_.pointer(position_+i);
    \n+
    1082 }
    \n+
    \n+
    1083
    \n+
    \n+
    1084 void advance(int n)
    \n+
    1085 {
    \n+
    1086 position_=position_+n;
    \n+
    1087 }
    \n+
    \n+
    1088
    \n+
    1089 template<class OtherContainerWrapperIteratorType>
    \n+
    \n+
    1090 std::ptrdiff_t distanceTo(OtherContainerWrapperIteratorType& other) const
    \n+
    1091 {
    \n+
    1092 assert(containerWrapper_.identical(other));
    \n+
    1093 return other.position_ - position_;
    \n+
    1094 }
    \n+
    \n+
    1095
    \n+
    \n+
    1096 std::ptrdiff_t index() const
    \n+
    1097 {
    \n+
    1098 return containerWrapper_.realIndex(position_);
    \n+
    1099 }
    \n+
    \n+
    1100
    \n+
    1101 private:
    \n+
    1102 NonConstCW containerWrapper_;
    \n+
    1103 size_t position_;
    \n+
    1104 };
    \n+
    \n+
    1105
    \n+
    1106 template <class DenseMatrix, class field, int N>
    \n+
    \n+\n+
    \n+
    1108 static void apply(DenseMatrix& denseMatrix,
    \n+
    1109 DiagonalMatrix<field, N> const& rhs) {
    \n+
    1110 DUNE_ASSERT_BOUNDS(denseMatrix.M() == N);
    \n+
    1111 DUNE_ASSERT_BOUNDS(denseMatrix.N() == N);
    \n+
    1112 denseMatrix = field(0);
    \n+
    1113 for (int i = 0; i < N; ++i)
    \n+
    1114 denseMatrix[i][i] = rhs.diagonal()[i];
    \n+
    1115 }
    \n+
    \n+
    1116 };
    \n+
    \n+
    1117 /* @} */
    \n+
    1118} // end namespace
    \n+
    1119#endif
    \n+
    Implements a matrix constructed from a given type representing a field and a compile-time given numbe...
    \n+
    Traits for type conversions and type information.
    \n+
    Macro for wrapping boundary checks.
    \n+
    Implements a generic iterator class for writing stl conformant iterators.
    \n+
    Implements a matrix constructed from a given type representing a field and compile-time given number ...
    \n+
    A few common exception classes.
    \n+
    Implements a vector constructed from a given type representing a field and a compile-time given size.
    \n+
    #define DUNE_ASSERT_BOUNDS(cond)
    If DUNE_CHECK_BOUNDS is defined: check if condition cond holds; otherwise, do nothing.
    Definition boundschecking.hh:30
    \n+
    ConstIterator beforeBegin() const
    Definition diagonalmatrix.hh:208
    \n+
    DiagonalMatrix< K, n > transposed() const
    Return transposed of the matrix as DiagonalMatrix.
    Definition diagonalmatrix.hh:136
    \n+
    void mmhv(const X &x, Y &y) const
    y -= A^H x
    Definition diagonalmatrix.hh:357
    \n+
    DiagonalMatrix & operator*=(const K &k)
    vector space multiplication with scalar
    Definition diagonalmatrix.hh:246
    \n+
    FieldTraits< K >::field_type field_type
    Definition diagonalmatrix.hh:563
    \n+
    std::size_t size_type
    The type used for the index access and size operations.
    Definition diagonalmatrix.hh:67
    \n+
    size_type dim() const
    dimension of the vector space
    Definition diagonalmatrix.hh:800
    \n+
    ConstIterator ConstRowIterator
    rename the iterators for easier access
    Definition diagonalmatrix.hh:183
    \n+
    row_type row_reference
    Definition diagonalmatrix.hh:75
    \n+
    K & operator[](size_type i)
    random access
    Definition diagonalmatrix.hh:879
    \n+
    ContainerWrapperIterator & operator=(OtherContainerWrapperIteratorType &other)
    Definition diagonalmatrix.hh:1037
    \n+
    static constexpr int rows
    The number of rows.
    Definition diagonalmatrix.hh:81
    \n+
    static constexpr size_type M()
    number of blocks in column direction
    Definition diagonalmatrix.hh:488
    \n+
    FieldVector< K, n > & diagonal()
    Get reference to diagonal vector.
    Definition diagonalmatrix.hh:549
    \n+
    void usmhv(const typename FieldTraits< Y >::field_type &alpha, const X &x, Y &y) const
    y += alpha A^H x
    Definition diagonalmatrix.hh:395
    \n+
    Iterator iterator
    typedef for stl compliant access
    Definition diagonalmatrix.hh:888
    \n+
    void increment()
    Definition diagonalmatrix.hh:1067
    \n+
    static constexpr int blocklevel
    The number of block levels we contain. This is the leaf, that is, 1.
    Definition diagonalmatrix.hh:70
    \n+
    DiagonalRowVectorConst< K, n > type
    Definition diagonalmatrix.hh:957
    \n+
    T * operator->() const
    Definition diagonalmatrix.hh:1046
    \n+
    static constexpr int size
    The size of this vector.
    Definition diagonalmatrix.hh:724
    \n+
    K * pointer(size_type i) const
    Definition diagonalmatrix.hh:824
    \n+
    K field_type
    export the type representing the field
    Definition diagonalmatrix.hh:712
    \n+
    DiagonalRowVector< K, n > type
    Definition diagonalmatrix.hh:963
    \n+
    ConstIterator beforeEnd() const
    Definition diagonalmatrix.hh:773
    \n+
    const_row_type::ConstIterator ConstColIterator
    rename the iterators for easier access
    Definition diagonalmatrix.hh:185
    \n+
    bool exists(size_type i, size_type j) const
    return true when (i,j) is in pattern
    Definition diagonalmatrix.hh:498
    \n+
    ContainerWrapperIterator< const WrapperType, const_reference, const_reference > ConstIterator
    Iterator class for sequential access.
    Definition diagonalmatrix.hh:179
    \n+
    const_row_type const_row_reference
    Definition diagonalmatrix.hh:78
    \n+
    static constexpr size_type size()
    Definition diagonalmatrix.hh:87
    \n+
    size_type row_
    Definition diagonalmatrix.hh:836
    \n+
    ContainerWrapperIterator(CW containerWrapper, int position)
    Definition diagonalmatrix.hh:1015
    \n+
    DiagonalRowVector(K *p, int col)
    Constructor making vector with identical coordinates.
    Definition diagonalmatrix.hh:865
    \n+
    K & diagonal(size_type i)
    Get reference to diagonal entry.
    Definition diagonalmatrix.hh:537
    \n+
    void solve(V &x, const V &b) const
    Solve system A x = b.
    Definition diagonalmatrix.hh:438
    \n+
    static constexpr size_type N()
    number of blocks in row direction
    Definition diagonalmatrix.hh:482
    \n+
    Iterator beforeBegin()
    Definition diagonalmatrix.hh:911
    \n+
    ContainerWrapperIterator(OtherContainerWrapperIteratorType &other)
    Definition diagonalmatrix.hh:1021
    \n+
    const_reference operator[](size_type i) const
    Return const_reference object as row replacement.
    Definition diagonalmatrix.hh:525
    \n+
    Iterator iterator
    typedef for stl compliant access
    Definition diagonalmatrix.hh:145
    \n+
    ConstIterator begin() const
    begin ConstIterator
    Definition diagonalmatrix.hh:760
    \n+
    ConstIterator const_iterator
    typedef for stl compliant access
    Definition diagonalmatrix.hh:919
    \n+
    bool identical(const DiagonalRowVectorConst< K, n > &other) const
    Definition diagonalmatrix.hh:749
    \n+
    DiagonalMatrix & operator-=(const DiagonalMatrix &y)
    vector space subtraction
    Definition diagonalmatrix.hh:225
    \n+
    DiagonalRowVectorConst(K *p, int col)
    Constructor making vector with identical coordinates.
    Definition diagonalmatrix.hh:733
    \n+
    void mmtv(const X &x, Y &y) const
    y -= A^T x
    Definition diagonalmatrix.hh:345
    \n+
    static constexpr int blocklevel
    The number of block levels we contain.
    Definition diagonalmatrix.hh:721
    \n+
    row_type * pointer(int i) const
    Definition diagonalmatrix.hh:676
    \n+
    DiagonalMatrix(const K &k)
    Constructor initializing the whole matrix with a scalar.
    Definition diagonalmatrix.hh:98
    \n+
    ContainerWrapperIterator< DiagonalRowVector< K, n >, K, K & > Iterator
    Iterator class for sequential access.
    Definition diagonalmatrix.hh:886
    \n+
    R elementAt(int i) const
    Definition diagonalmatrix.hh:1079
    \n+
    std::ptrdiff_t distanceTo(OtherContainerWrapperIteratorType &other) const
    Definition diagonalmatrix.hh:1090
    \n+
    Iterator beforeEnd()
    Definition diagonalmatrix.hh:904
    \n+
    void umtv(const X &x, Y &y) const
    y += A^T x
    Definition diagonalmatrix.hh:309
    \n+
    ConstIterator const_iterator
    typedef for stl compliant access
    Definition diagonalmatrix.hh:757
    \n+
    double infinity_norm_real() const
    simplified infinity norm (uses Manhattan norm for complex values)
    Definition diagonalmatrix.hh:427
    \n+
    DiagonalMatrixWrapper(const DiagonalMatrixType *mat)
    Definition diagonalmatrix.hh:667
    \n+
    void umv(const X &x, Y &y) const
    y += A x
    Definition diagonalmatrix.hh:297
    \n+
    ContainerWrapperIterator< const WrapperType, reference, reference > Iterator
    Iterator class for sequential access.
    Definition diagonalmatrix.hh:143
    \n+
    DiagonalRowVector< K, n > type
    Definition diagonalmatrix.hh:969
    \n+
    void mv(const X &x, Y &y) const
    y = A x
    Definition diagonalmatrix.hh:278
    \n+
    double frobenius_norm() const
    frobenius norm: sqrt(sum over squared values of entries)
    Definition diagonalmatrix.hh:409
    \n+
    ConstIterator end() const
    end iterator
    Definition diagonalmatrix.hh:194
    \n+
    static constexpr int cols
    The number of columns.
    Definition diagonalmatrix.hh:83
    \n+
    static constexpr int dimension
    Definition diagonalmatrix.hh:705
    \n+
    K * p_
    Definition diagonalmatrix.hh:835
    \n+
    size_type rowIndex() const
    index of this row in surrounding matrix
    Definition diagonalmatrix.hh:806
    \n+
    R dereference() const
    Definition diagonalmatrix.hh:1062
    \n+
    DiagonalRowVector & operator=(const K &k)
    Assignment operator for scalar.
    Definition diagonalmatrix.hh:870
    \n+
    bool operator!=(const DiagonalMatrix &other) const
    incomparison operator
    Definition diagonalmatrix.hh:268
    \n+
    value_type field_type
    Definition diagonalmatrix.hh:61
    \n+
    void advance(int n)
    Definition diagonalmatrix.hh:1084
    \n+
    ConstIterator begin() const
    begin iterator
    Definition diagonalmatrix.hh:188
    \n+
    Iterator begin()
    begin iterator
    Definition diagonalmatrix.hh:891
    \n+
    void mmv(const X &x, Y &y) const
    y -= A x
    Definition diagonalmatrix.hh:333
    \n+
    DiagonalMatrix & operator/=(const K &k)
    vector space division by scalar
    Definition diagonalmatrix.hh:253
    \n+
    ConstIterator const_iterator
    typedef for stl compliant access
    Definition diagonalmatrix.hh:181
    \n+
    const_row_type const_reference
    Definition diagonalmatrix.hh:77
    \n+
    bool identical(const DiagonalMatrix< K, n > &other) const
    Check if matrix is the same object as the other matrix.
    Definition diagonalmatrix.hh:130
    \n+
    friend auto operator*(const DiagonalMatrix &matrixA, const DiagonalMatrix< OtherScalar, n > &matrixB)
    Matrix-matrix multiplication.
    Definition diagonalmatrix.hh:468
    \n+
    size_type realIndex(int i) const
    Definition diagonalmatrix.hh:671
    \n+
    Iterator end()
    end iterator
    Definition diagonalmatrix.hh:158
    \n+
    const K & operator[](size_type i) const
    same for read only access
    Definition diagonalmatrix.hh:741
    \n+
    DiagonalRowVector()
    Constructor making uninitialized vector.
    Definition diagonalmatrix.hh:861
    \n+
    row_type reference
    Definition diagonalmatrix.hh:74
    \n+
    DiagonalRowVectorConst * operator&()
    Definition diagonalmatrix.hh:829
    \n+
    bool operator==(const DiagonalRowVectorConst &y) const
    Binary vector comparison.
    Definition diagonalmatrix.hh:786
    \n+
    double frobenius_norm2() const
    square of frobenius norm, need for block recursion
    Definition diagonalmatrix.hh:415
    \n+
    constexpr DiagonalMatrix()=default
    Default constructor.
    \n+
    void mtv(const X &x, Y &y) const
    y = A^T x
    Definition diagonalmatrix.hh:290
    \n+
    ContainerWrapperIterator< DiagonalRowVectorConst< K, n >, const K, const K & > ConstIterator
    ConstIterator class for sequential access.
    Definition diagonalmatrix.hh:917
    \n+
    bool identical(const DiagonalMatrixWrapper &other) const
    Definition diagonalmatrix.hh:682
    \n+
    void usmtv(const typename FieldTraits< Y >::field_type &alpha, const X &x, Y &y) const
    y += alpha A^T x
    Definition diagonalmatrix.hh:382
    \n+
    void decrement()
    Definition diagonalmatrix.hh:1073
    \n+
    std::ptrdiff_t index() const
    Definition diagonalmatrix.hh:1096
    \n+
    const FieldVector< K, n > & diagonal() const
    Get const reference to diagonal vector.
    Definition diagonalmatrix.hh:543
    \n+
    void invert()
    Compute inverse.
    Definition diagonalmatrix.hh:445
    \n+
    DiagonalRowVector * operator&()
    Definition diagonalmatrix.hh:935
    \n+
    const K & diagonal(size_type i) const
    Get const reference to diagonal entry.
    Definition diagonalmatrix.hh:531
    \n+
    size_type N() const
    number of blocks in the vector (are of size 1 here)
    Definition diagonalmatrix.hh:794
    \n+
    DiagonalMatrix(std::initializer_list< K > const &l)
    Construct diagonal matrix from an initializer list.
    Definition diagonalmatrix.hh:115
    \n+
    row_type::Iterator ColIterator
    rename the iterators for easier access
    Definition diagonalmatrix.hh:149
    \n+
    K field_type
    export the type representing the field
    Definition diagonalmatrix.hh:852
    \n+
    reference operator[](size_type i)
    Return reference object as row replacement.
    Definition diagonalmatrix.hh:519
    \n+
    DiagonalRowVectorConst< K, n > type
    Definition diagonalmatrix.hh:951
    \n+
    Iterator end()
    end iterator
    Definition diagonalmatrix.hh:897
    \n+
    DiagonalMatrix(const FieldVector< K, n > &diag)
    Constructor initializing the diagonal with a vector.
    Definition diagonalmatrix.hh:103
    \n+
    std::size_t size_type
    The type used for the index access and size operation.
    Definition diagonalmatrix.hh:858
    \n+
    void usmv(const typename FieldTraits< Y >::field_type &alpha, const X &x, Y &y) const
    y += alpha A x
    Definition diagonalmatrix.hh:369
    \n+
    double infinity_norm() const
    infinity norm (row sum norm, how to generalize for blocks?)
    Definition diagonalmatrix.hh:421
    \n+
    DiagonalMatrix & operator+=(const DiagonalMatrix &y)
    vector space addition
    Definition diagonalmatrix.hh:218
    \n+
    K block_type
    export the type representing the components
    Definition diagonalmatrix.hh:64
    \n+
    void umhv(const X &x, Y &y) const
    y += A^H x
    Definition diagonalmatrix.hh:321
    \n+
    Iterator beforeBegin()
    Definition diagonalmatrix.hh:172
    \n+
    static void apply(DenseMatrix &denseMatrix, DiagonalMatrix< field, N > const &rhs)
    Definition diagonalmatrix.hh:1108
    \n+
    ContainerWrapperIterator(const MyType &other)
    Definition diagonalmatrix.hh:1026
    \n+
    ConstIterator end() const
    end ConstIterator
    Definition diagonalmatrix.hh:766
    \n+
    std::size_t size_type
    The type used for the index access and size operation.
    Definition diagonalmatrix.hh:718
    \n+
    DiagonalMatrix & operator=(const K &k)
    Assignment from a scalar.
    Definition diagonalmatrix.hh:123
    \n+
    DiagonalRowVectorConst()
    Constructor making uninitialized vector.
    Definition diagonalmatrix.hh:727
    \n+
    Iterator beforeEnd()
    Definition diagonalmatrix.hh:165
    \n+
    size_type realIndex(int i) const
    Definition diagonalmatrix.hh:819
    \n+
    friend std::ostream & operator<<(std::ostream &s, const DiagonalMatrix< K, n > &a)
    Sends the matrix to an output stream.
    Definition diagonalmatrix.hh:508
    \n+
    K value_type
    export the type representing the field
    Definition diagonalmatrix.hh:60
    \n+
    K block_type
    export the type representing the components
    Definition diagonalmatrix.hh:715
    \n+
    K determinant() const
    calculates the determinant of this matrix
    Definition diagonalmatrix.hh:453
    \n+
    FieldTraits< K >::real_type real_type
    Definition diagonalmatrix.hh:564
    \n+
    ConstIterator beforeBegin() const
    Definition diagonalmatrix.hh:780
    \n+
    DiagonalMatrixWrapper()
    Definition diagonalmatrix.hh:663
    \n+
    ContainerWrapperIterator< DiagonalRowVectorConst< K, n >, const K, const K & > ConstIterator
    ConstIterator class for sequential access.
    Definition diagonalmatrix.hh:755
    \n+
    Iterator begin()
    begin iterator
    Definition diagonalmatrix.hh:152
    \n+
    bool operator==(const DiagonalMatrix &other) const
    comparison operator
    Definition diagonalmatrix.hh:262
    \n+
    DiagonalRowVectorConst< K, n > const_row_type
    Definition diagonalmatrix.hh:76
    \n+
    DiagonalRowVector< K, n > row_type
    Each row is implemented by a field vector.
    Definition diagonalmatrix.hh:73
    \n+
    bool equals(const MyType &other) const
    Definition diagonalmatrix.hh:1052
    \n+
    Iterator RowIterator
    rename the iterators for easier access
    Definition diagonalmatrix.hh:147
    \n+
    K block_type
    export the type representing the components
    Definition diagonalmatrix.hh:855
    \n+
    ConstIterator beforeEnd() const
    Definition diagonalmatrix.hh:201
    \n+
    const K & diagonal() const
    the diagonal value
    Definition diagonalmatrix.hh:812
    \n
    #define DUNE_THROW(E, m)
    Definition exceptions.hh:218
    \n
    Dune namespace.
    Definition alignedallocator.hh:13
    \n-
    Default exception class for range errors.
    Definition exceptions.hh:254
    \n-
    LRU Cache Container.
    Definition lru.hh:52
    \n-
    void pop_back()
    Removes the last element.
    Definition lru.hh:119
    \n-
    iterator find(const key_type &key)
    Finds the element whose key is k.
    Definition lru.hh:131
    \n-
    reference insert(const key_type &key)
    mark data associated with key as most recent
    Definition lru.hh:175
    \n-
    list_type::const_iterator const_iterator
    Definition lru.hh:68
    \n-
    void resize(size_type new_size)
    ensure a maximum size of the container
    Definition lru.hh:213
    \n-
    allocator::size_type size_type
    Definition lru.hh:66
    \n-
    list_type::iterator iterator
    Definition lru.hh:67
    \n-
    allocator::value_type value_type
    Definition lru.hh:61
    \n-
    const_reference front() const
    Definition lru.hh:83
    \n-
    typename allocator::value_type const * const_pointer
    Definition lru.hh:63
    \n-
    size_type size() const
    Retrieve number of entries in the container.
    Definition lru.hh:202
    \n-
    typename allocator::value_type & reference
    Definition lru.hh:65
    \n-
    reference back()
    Definition lru.hh:92
    \n-
    void pop_front()
    Removes the first element.
    Definition lru.hh:110
    \n-
    reference front()
    Definition lru.hh:74
    \n-
    void clear()
    Definition lru.hh:224
    \n-
    reference touch(const key_type &key)
    mark data associated with key as most recent
    Definition lru.hh:185
    \n-
    reference insert(const key_type &key, const_reference data)
    Insert a value into the container.
    Definition lru.hh:161
    \n-
    typename allocator::value_type * pointer
    Definition lru.hh:62
    \n-
    const_iterator find(const key_type &key) const
    Finds the element whose key is k.
    Definition lru.hh:143
    \n-
    typename allocator::value_type const & const_reference
    Definition lru.hh:64
    \n-
    Traits::key_type key_type
    Definition lru.hh:60
    \n-
    const_reference back(int i) const
    Definition lru.hh:101
    \n+
    K conjugateComplex(const K &x)
    compute conjugate complex of x
    Definition math.hh:164
    \n+
    A dense n x m matrix.
    Definition densematrix.hh:140
    \n+
    constexpr size_type M() const
    number of columns
    Definition densematrix.hh:703
    \n+
    constexpr size_type N() const
    number of rows
    Definition densematrix.hh:697
    \n+
    A dense n x m matrix.
    Definition fmatrix.hh:117
    \n+
    vector space out of a tensor product of fields.
    Definition fvector.hh:91
    \n+
    you have to specialize this structure for any type that should be assignable to a DenseMatrix
    Definition densematrix.hh:59
    \n+
    Error thrown if operations of a FieldMatrix fail.
    Definition densematrix.hh:126
    \n+
    FieldTraits< value_type >::real_type two_norm2() const
    square of two norm (sum over squared values of entries), need for block recursion
    Definition densevector.hh:650
    \n+
    FieldTraits< value_type >::real_type two_norm() const
    two norm sqrt(sum over squared values of entries)
    Definition densevector.hh:641
    \n+
    Iterator begin()
    begin iterator
    Definition densevector.hh:347
    \n+
    FieldTraits< vt >::real_type infinity_norm() const
    infinity norm (maximum of absolute values of entries)
    Definition densevector.hh:661
    \n+
    FieldTraits< vt >::real_type infinity_norm_real() const
    simplified infinity norm (uses Manhattan norm for complex values)
    Definition densevector.hh:677
    \n+
    Definition diagonalmatrix.hh:698
    \n+
    Definition diagonalmatrix.hh:841
    \n+
    Definition diagonalmatrix.hh:650
    \n+
    Iterator class for sparse vector-like containers.
    Definition diagonalmatrix.hh:998
    \n+
    ContainerWrapperIterator(const MyConstType &other)
    Definition diagonalmatrix.hh:1031
    \n+
    bool equals(const MyConstType &other) const
    Definition diagonalmatrix.hh:1057
    \n+
    A diagonal matrix of static size.
    Definition diagonalmatrix.hh:53
    \n+
    Definition ftraits.hh:26
    \n+
    T field_type
    export the type representing the field
    Definition ftraits.hh:28
    \n+
    T real_type
    export the type representing the real type of the field
    Definition ftraits.hh:30
    \n+
    Get the 'const' version of a reference to a mutable object.
    Definition genericiterator.hh:87
    \n+
    get the 'mutable' version of a reference to a const object
    Definition genericiterator.hh:116
    \n+
    Facade class for stl conformant bidirectional iterators.
    Definition iteratorfacades.hh:275
    \n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,267 +1,1601 @@\n dune-common\u00a02.10\n Loading...\n Searching...\n No Matches\n * _\bd_\bu_\bn_\be\n * _\bc_\bo_\bm_\bm_\bo_\bn\n-lru.hh\n+diagonalmatrix.hh\n _\bG_\bo_\b _\bt_\bo_\b _\bt_\bh_\be_\b _\bd_\bo_\bc_\bu_\bm_\be_\bn_\bt_\ba_\bt_\bi_\bo_\bn_\b _\bo_\bf_\b _\bt_\bh_\bi_\bs_\b _\bf_\bi_\bl_\be_\b.\n 1// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-\n 2// vi: set et ts=4 sw=2 sts=2:\n 3// SPDX-FileCopyrightInfo: Copyright \u00c2\u00a9 DUNE Project contributors, see file\n LICENSE.md in module root\n 4// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception\n-5#ifndef DUNE_COMMON_LRU_HH\n-6#define DUNE_COMMON_LRU_HH\n+5#ifndef DUNE_DIAGONAL_MATRIX_HH\n+6#define DUNE_DIAGONAL_MATRIX_HH\n 7\n-8#include \n-9#include \n-10#include \n-11#include \n-12\n-13#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\be_\bx_\bc_\be_\bp_\bt_\bi_\bo_\bn_\bs_\b._\bh_\bh>\n-14\n-20namespace _\bD_\bu_\bn_\be {\n-21\n-22 namespace {\n-23\n-24 /*\n-25 hide the default traits in an empty namespace\n-26 */\n-27 template >\n-29 struct _lru_default_traits\n-30 {\n-31 typedef Key key_type;\n-32 typedef Alloc allocator;\n-33 typedef std::list< std::pair > list_type;\n-34 typedef typename list_type::iterator iterator;\n-35 typedef typename std::less cmp;\n-36 typedef std::map< key_type, iterator, cmp,\n-37 typename std::allocator_traits::template rebind_alloc > > map_type;\n-38 };\n-39\n-40 } // end empty namespace\n-41\n-49 template >\n-_\b5_\b1 class _\bl_\br_\bu\n-52 {\n-53 typedef typename Traits::list_type list_type;\n-54 typedef typename Traits::map_type map_type;\n-55 typedef typename Traits::allocator allocator;\n-56 typedef typename map_type::iterator map_iterator;\n-57 typedef typename map_type::const_iterator const_map_iterator;\n+12#include \n+13#include \n+14#include \n+15#include \n+16#include \n+17#include \n+18#include \n+19#include \n+20\n+21#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bb_\bo_\bu_\bn_\bd_\bs_\bc_\bh_\be_\bc_\bk_\bi_\bn_\bg_\b._\bh_\bh>\n+22#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bd_\be_\bn_\bs_\be_\bm_\ba_\bt_\br_\bi_\bx_\b._\bh_\bh>\n+23#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\be_\bx_\bc_\be_\bp_\bt_\bi_\bo_\bn_\bs_\b._\bh_\bh>\n+24#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bf_\bm_\ba_\bt_\br_\bi_\bx_\b._\bh_\bh>\n+25#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bf_\bv_\be_\bc_\bt_\bo_\br_\b._\bh_\bh>\n+26#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bg_\be_\bn_\be_\br_\bi_\bc_\bi_\bt_\be_\br_\ba_\bt_\bo_\br_\b._\bh_\bh>\n+27#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bt_\by_\bp_\be_\bt_\br_\ba_\bi_\bt_\bs_\b._\bh_\bh>\n+28\n+29\n+30namespace _\bD_\bu_\bn_\be {\n+31\n+32 template< class K, int n > class DiagonalRowVectorConst;\n+33 template< class K, int n > class DiagonalRowVector;\n+34 template< class DiagonalMatrixType > class DiagonalMatrixWrapper;\n+35 template< class C, class T, class R> class ContainerWrapperIterator;\n+36\n+51 template\n+_\b5_\b2 class _\bD_\bi_\ba_\bg_\bo_\bn_\ba_\bl_\bM_\ba_\bt_\br_\bi_\bx\n+53 {\n+54 typedef _\bD_\bi_\ba_\bg_\bo_\bn_\ba_\bl_\bM_\ba_\bt_\br_\bi_\bx_\bW_\br_\ba_\bp_\bp_\be_\br_\b<_\b _\bD_\bi_\ba_\bg_\bo_\bn_\ba_\bl_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bK_\b,_\bn_\b> > _\bW_\br_\ba_\bp_\bp_\be_\br_\bT_\by_\bp_\be;\n+55\n+56 public:\n+57 //===== type definitions and constants\n 58\n-59 public:\n-_\b6_\b0 typedef typename Traits::key_type _\bk_\be_\by_\b__\bt_\by_\bp_\be;\n-_\b6_\b1 typedef typename allocator::value_type _\bv_\ba_\bl_\bu_\be_\b__\bt_\by_\bp_\be;\n-_\b6_\b2 using _\bp_\bo_\bi_\bn_\bt_\be_\br = typename allocator::value_type*;\n-_\b6_\b3 using _\bc_\bo_\bn_\bs_\bt_\b__\bp_\bo_\bi_\bn_\bt_\be_\br = typename allocator::value_type const*;\n-_\b6_\b4 using _\bc_\bo_\bn_\bs_\bt_\b__\br_\be_\bf_\be_\br_\be_\bn_\bc_\be = typename allocator::value_type const&;\n-_\b6_\b5 using _\br_\be_\bf_\be_\br_\be_\bn_\bc_\be = typename allocator::value_type&;\n-_\b6_\b6 typedef typename allocator::size_type _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be;\n-_\b6_\b7 typedef typename list_type::iterator _\bi_\bt_\be_\br_\ba_\bt_\bo_\br;\n-_\b6_\b8 typedef typename list_type::const_iterator _\bc_\bo_\bn_\bs_\bt_\b__\bi_\bt_\be_\br_\ba_\bt_\bo_\br;\n-69\n-_\b7_\b4 _\br_\be_\bf_\be_\br_\be_\bn_\bc_\be _\bf_\br_\bo_\bn_\bt()\n-75 {\n-76 return _data.front().second;\n-77 }\n-78\n-_\b8_\b3 _\bc_\bo_\bn_\bs_\bt_\b__\br_\be_\bf_\be_\br_\be_\bn_\bc_\be _\bf_\br_\bo_\bn_\bt() const\n-84 {\n-85 return _data.front().second;\n-86 }\n-87\n-_\b9_\b2 _\br_\be_\bf_\be_\br_\be_\bn_\bc_\be _\bb_\ba_\bc_\bk()\n-93 {\n-94 return _data.back().second;\n-95 }\n+_\b6_\b0 typedef K _\bv_\ba_\bl_\bu_\be_\b__\bt_\by_\bp_\be;\n+_\b6_\b1 typedef _\bv_\ba_\bl_\bu_\be_\b__\bt_\by_\bp_\be _\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be;\n+62\n+_\b6_\b4 typedef K _\bb_\bl_\bo_\bc_\bk_\b__\bt_\by_\bp_\be;\n+65\n+_\b6_\b7 typedef std::size_t _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be;\n+68\n+_\b7_\b0 constexpr static int _\bb_\bl_\bo_\bc_\bk_\bl_\be_\bv_\be_\bl = 1;\n+71\n+_\b7_\b3 typedef _\bD_\bi_\ba_\bg_\bo_\bn_\ba_\bl_\bR_\bo_\bw_\bV_\be_\bc_\bt_\bo_\br_\b<_\bK_\b,_\bn_\b> _\br_\bo_\bw_\b__\bt_\by_\bp_\be;\n+_\b7_\b4 typedef _\br_\bo_\bw_\b__\bt_\by_\bp_\be _\br_\be_\bf_\be_\br_\be_\bn_\bc_\be;\n+_\b7_\b5 typedef _\br_\bo_\bw_\b__\bt_\by_\bp_\be _\br_\bo_\bw_\b__\br_\be_\bf_\be_\br_\be_\bn_\bc_\be;\n+_\b7_\b6 typedef _\bD_\bi_\ba_\bg_\bo_\bn_\ba_\bl_\bR_\bo_\bw_\bV_\be_\bc_\bt_\bo_\br_\bC_\bo_\bn_\bs_\bt_\b<_\bK_\b,_\bn_\b> _\bc_\bo_\bn_\bs_\bt_\b__\br_\bo_\bw_\b__\bt_\by_\bp_\be;\n+_\b7_\b7 typedef _\bc_\bo_\bn_\bs_\bt_\b__\br_\bo_\bw_\b__\bt_\by_\bp_\be _\bc_\bo_\bn_\bs_\bt_\b__\br_\be_\bf_\be_\br_\be_\bn_\bc_\be;\n+_\b7_\b8 typedef _\bc_\bo_\bn_\bs_\bt_\b__\br_\bo_\bw_\b__\bt_\by_\bp_\be _\bc_\bo_\bn_\bs_\bt_\b__\br_\bo_\bw_\b__\br_\be_\bf_\be_\br_\be_\bn_\bc_\be;\n+79\n+_\b8_\b1 constexpr static int _\br_\bo_\bw_\bs = n;\n+_\b8_\b3 constexpr static int _\bc_\bo_\bl_\bs = n;\n+84\n+85 //==== size\n+86\n+_\b8_\b7 static constexpr _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be _\bs_\bi_\bz_\be ()\n+88 {\n+89 return _\br_\bo_\bw_\bs;\n+90 }\n+91\n+92 //===== constructors\n+93\n+_\b9_\b5 constexpr _\bD_\bi_\ba_\bg_\bo_\bn_\ba_\bl_\bM_\ba_\bt_\br_\bi_\bx() = default;\n 96\n-_\b1_\b0_\b1 _\bc_\bo_\bn_\bs_\bt_\b__\br_\be_\bf_\be_\br_\be_\bn_\bc_\be _\bb_\ba_\bc_\bk ([[maybe_unused]] int i) const\n-102 {\n-103 return _data.back().second;\n-104 }\n-105\n+_\b9_\b8 _\bD_\bi_\ba_\bg_\bo_\bn_\ba_\bl_\bM_\ba_\bt_\br_\bi_\bx (const K& k)\n+99 : diag_(k)\n+100 {}\n+101\n+_\b1_\b0_\b3 _\bD_\bi_\ba_\bg_\bo_\bn_\ba_\bl_\bM_\ba_\bt_\br_\bi_\bx (const _\bF_\bi_\be_\bl_\bd_\bV_\be_\bc_\bt_\bo_\br_\b<_\bK_\b,_\bn_\b>& diag)\n+104 : diag_(diag)\n+105 {}\n 106\n-_\b1_\b1_\b0 void _\bp_\bo_\bp_\b__\bf_\br_\bo_\bn_\bt()\n-111 {\n-112 _\bk_\be_\by_\b__\bt_\by_\bp_\be k = _data.front().first;\n-113 _data.pop_front();\n-114 _index.erase(k);\n-115 }\n-_\b1_\b1_\b9 void _\bp_\bo_\bp_\b__\bb_\ba_\bc_\bk()\n-120 {\n-121 _\bk_\be_\by_\b__\bt_\by_\bp_\be k = _data.back().first;\n-122 _data.pop_back();\n-123 _index.erase(k);\n-124 }\n-125\n-_\b1_\b3_\b1 _\bi_\bt_\be_\br_\ba_\bt_\bo_\br _\bf_\bi_\bn_\bd (const _\bk_\be_\by_\b__\bt_\by_\bp_\be & key)\n-132 {\n-133 const map_iterator it = _index.find(key);\n-134 if (it == _index.end()) return _data.end();\n-135 return it->second;\n-136 }\n-137\n-_\b1_\b4_\b3 _\bc_\bo_\bn_\bs_\bt_\b__\bi_\bt_\be_\br_\ba_\bt_\bo_\br _\bf_\bi_\bn_\bd (const _\bk_\be_\by_\b__\bt_\by_\bp_\be & key) const\n-144 {\n-145 const map_iterator it = _index.find(key);\n-146 if (it == _index.end()) return _data.end();\n-147 return it->second;\n-148 }\n-149\n-_\b1_\b6_\b1 _\br_\be_\bf_\be_\br_\be_\bn_\bc_\be _\bi_\bn_\bs_\be_\br_\bt (const _\bk_\be_\by_\b__\bt_\by_\bp_\be & key, _\bc_\bo_\bn_\bs_\bt_\b__\br_\be_\bf_\be_\br_\be_\bn_\bc_\be data)\n-162 {\n-163 std::pair x(key, data);\n-164 /* insert item as mru */\n-165 _\bi_\bt_\be_\br_\ba_\bt_\bo_\br it = _data.insert(_data.begin(), x);\n-166 /* store index */\n-167 _index.insert(std::make_pair(key,it));\n-168\n-169 return it->second;\n-170 }\n-171\n-_\b1_\b7_\b5 _\br_\be_\bf_\be_\br_\be_\bn_\bc_\be _\bi_\bn_\bs_\be_\br_\bt (const _\bk_\be_\by_\b__\bt_\by_\bp_\be & key)\n-176 {\n-177 return _\bt_\bo_\bu_\bc_\bh (key);\n-178 }\n-179\n-_\b1_\b8_\b5 _\br_\be_\bf_\be_\br_\be_\bn_\bc_\be _\bt_\bo_\bu_\bc_\bh (const _\bk_\be_\by_\b__\bt_\by_\bp_\be & key)\n-186 {\n-187 /* query _index for iterator */\n-188 map_iterator it = _index.find(key);\n-189 if (it == _index.end())\n-190 _\bD_\bU_\bN_\bE_\b__\bT_\bH_\bR_\bO_\bW(_\bD_\bu_\bn_\be_\b:_\b:_\bR_\ba_\bn_\bg_\be_\bE_\br_\br_\bo_\br,\n-191 \"Failed to touch key \" << key << \", it is not in the lru container\");\n-192 /* update _data\n-193 move it to the front\n-194 */\n-195 _data.splice(_data.begin(), _data, it->second);\n-196 return it->second->second;\n+_\b1_\b1_\b5 _\bD_\bi_\ba_\bg_\bo_\bn_\ba_\bl_\bM_\ba_\bt_\br_\bi_\bx (std::initializer_list const &l)\n+116 {\n+117 std::copy_n(l.begin(), std::min(static_cast(_\br_\bo_\bw_\bs),\n+118 l.size()),\n+119 diag_._\bb_\be_\bg_\bi_\bn());\n+120 }\n+121\n+_\b1_\b2_\b3 _\bD_\bi_\ba_\bg_\bo_\bn_\ba_\bl_\bM_\ba_\bt_\br_\bi_\bx& _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b=_\b (const K& k)\n+124 {\n+125 diag_ = k;\n+126 return *this;\n+127 }\n+128\n+_\b1_\b3_\b0 bool _\bi_\bd_\be_\bn_\bt_\bi_\bc_\ba_\bl(const _\bD_\bi_\ba_\bg_\bo_\bn_\ba_\bl_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bK_\b,_\bn_\b>& other) const\n+131 {\n+132 return (this==&other);\n+133 }\n+134\n+_\b1_\b3_\b6 _\bD_\bi_\ba_\bg_\bo_\bn_\ba_\bl_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bK_\b,_\b _\bn_\b> _\bt_\br_\ba_\bn_\bs_\bp_\bo_\bs_\be_\bd() const\n+137 {\n+138 return *this;\n+139 }\n+140\n+141 //===== iterator interface to rows of the matrix\n+_\b1_\b4_\b3 typedef _\bC_\bo_\bn_\bt_\ba_\bi_\bn_\be_\br_\bW_\br_\ba_\bp_\bp_\be_\br_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b<_\bc_\bo_\bn_\bs_\bt_\b _\bW_\br_\ba_\bp_\bp_\be_\br_\bT_\by_\bp_\be_\b,_\b _\br_\be_\bf_\be_\br_\be_\bn_\bc_\be_\b,_\b _\br_\be_\bf_\be_\br_\be_\bn_\bc_\be_\b>\n+_\bI_\bt_\be_\br_\ba_\bt_\bo_\br;\n+_\b1_\b4_\b5 typedef _\bI_\bt_\be_\br_\ba_\bt_\bo_\br _\bi_\bt_\be_\br_\ba_\bt_\bo_\br;\n+_\b1_\b4_\b7 typedef _\bI_\bt_\be_\br_\ba_\bt_\bo_\br _\bR_\bo_\bw_\bI_\bt_\be_\br_\ba_\bt_\bo_\br;\n+_\b1_\b4_\b9 typedef typename _\br_\bo_\bw_\b__\bt_\by_\bp_\be_\b:_\b:_\bI_\bt_\be_\br_\ba_\bt_\bo_\br _\bC_\bo_\bl_\bI_\bt_\be_\br_\ba_\bt_\bo_\br;\n+150\n+_\b1_\b5_\b2 _\bI_\bt_\be_\br_\ba_\bt_\bo_\br _\bb_\be_\bg_\bi_\bn ()\n+153 {\n+154 return _\bI_\bt_\be_\br_\ba_\bt_\bo_\br(_\bW_\br_\ba_\bp_\bp_\be_\br_\bT_\by_\bp_\be(this),0);\n+155 }\n+156\n+_\b1_\b5_\b8 _\bI_\bt_\be_\br_\ba_\bt_\bo_\br _\be_\bn_\bd ()\n+159 {\n+160 return _\bI_\bt_\be_\br_\ba_\bt_\bo_\br(_\bW_\br_\ba_\bp_\bp_\be_\br_\bT_\by_\bp_\be(this),n);\n+161 }\n+162\n+_\b1_\b6_\b5 _\bI_\bt_\be_\br_\ba_\bt_\bo_\br _\bb_\be_\bf_\bo_\br_\be_\bE_\bn_\bd ()\n+166 {\n+167 return _\bI_\bt_\be_\br_\ba_\bt_\bo_\br(_\bW_\br_\ba_\bp_\bp_\be_\br_\bT_\by_\bp_\be(this),n-1);\n+168 }\n+169\n+_\b1_\b7_\b2 _\bI_\bt_\be_\br_\ba_\bt_\bo_\br _\bb_\be_\bf_\bo_\br_\be_\bB_\be_\bg_\bi_\bn ()\n+173 {\n+174 return _\bI_\bt_\be_\br_\ba_\bt_\bo_\br(_\bW_\br_\ba_\bp_\bp_\be_\br_\bT_\by_\bp_\be(this),-1);\n+175 }\n+176\n+177\n+_\b1_\b7_\b9 typedef _\bC_\bo_\bn_\bt_\ba_\bi_\bn_\be_\br_\bW_\br_\ba_\bp_\bp_\be_\br_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b<_\bc_\bo_\bn_\bs_\bt_\b _\bW_\br_\ba_\bp_\bp_\be_\br_\bT_\by_\bp_\be_\b,_\b _\bc_\bo_\bn_\bs_\bt_\b__\br_\be_\bf_\be_\br_\be_\bn_\bc_\be_\b,\n+_\bc_\bo_\bn_\bs_\bt_\b__\br_\be_\bf_\be_\br_\be_\bn_\bc_\be_\b> _\bC_\bo_\bn_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br;\n+_\b1_\b8_\b1 typedef _\bC_\bo_\bn_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br _\bc_\bo_\bn_\bs_\bt_\b__\bi_\bt_\be_\br_\ba_\bt_\bo_\br;\n+_\b1_\b8_\b3 typedef _\bC_\bo_\bn_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br _\bC_\bo_\bn_\bs_\bt_\bR_\bo_\bw_\bI_\bt_\be_\br_\ba_\bt_\bo_\br;\n+_\b1_\b8_\b5 typedef typename _\bc_\bo_\bn_\bs_\bt_\b__\br_\bo_\bw_\b__\bt_\by_\bp_\be_\b:_\b:_\bC_\bo_\bn_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br _\bC_\bo_\bn_\bs_\bt_\bC_\bo_\bl_\bI_\bt_\be_\br_\ba_\bt_\bo_\br;\n+186\n+_\b1_\b8_\b8 _\bC_\bo_\bn_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br _\bb_\be_\bg_\bi_\bn () const\n+189 {\n+190 return _\bC_\bo_\bn_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br(_\bW_\br_\ba_\bp_\bp_\be_\br_\bT_\by_\bp_\be(this),0);\n+191 }\n+192\n+_\b1_\b9_\b4 _\bC_\bo_\bn_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br _\be_\bn_\bd () const\n+195 {\n+196 return _\bC_\bo_\bn_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br(_\bW_\br_\ba_\bp_\bp_\be_\br_\bT_\by_\bp_\be(this),n);\n 197 }\n 198\n-_\b2_\b0_\b2 _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be _\bs_\bi_\bz_\be() const\n-203 {\n-204 return _data.size();\n-205 }\n-206\n-_\b2_\b1_\b3 void _\br_\be_\bs_\bi_\bz_\be(_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be new_size)\n-214 {\n-215 assert(new_size <= _\bs_\bi_\bz_\be());\n+_\b2_\b0_\b1 _\bC_\bo_\bn_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br _\bb_\be_\bf_\bo_\br_\be_\bE_\bn_\bd() const\n+202 {\n+203 return _\bC_\bo_\bn_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br(_\bW_\br_\ba_\bp_\bp_\be_\br_\bT_\by_\bp_\be(this),n-1);\n+204 }\n+205\n+_\b2_\b0_\b8 _\bC_\bo_\bn_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br _\bb_\be_\bf_\bo_\br_\be_\bB_\be_\bg_\bi_\bn () const\n+209 {\n+210 return _\bC_\bo_\bn_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br(_\bW_\br_\ba_\bp_\bp_\be_\br_\bT_\by_\bp_\be(this),-1);\n+211 }\n+212\n+213\n+214\n+215 //===== vector space arithmetic\n 216\n-217 while (new_size < _\bs_\bi_\bz_\be())\n-218 _\bp_\bo_\bp_\b__\bb_\ba_\bc_\bk();\n-219 }\n-220\n-_\b2_\b2_\b4 void _\bc_\bl_\be_\ba_\br()\n-225 {\n-226 _data.clear();\n-227 _index.clear();\n-228 }\n-229\n-230 private:\n-231 list_type _data;\n-232 map_type _index;\n-233\n-234 };\n-235\n-236} // namespace Dune\n+_\b2_\b1_\b8 _\bD_\bi_\ba_\bg_\bo_\bn_\ba_\bl_\bM_\ba_\bt_\br_\bi_\bx& _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b+_\b=_\b (const _\bD_\bi_\ba_\bg_\bo_\bn_\ba_\bl_\bM_\ba_\bt_\br_\bi_\bx& y)\n+219 {\n+220 diag_ += y.diag_;\n+221 return *this;\n+222 }\n+223\n+_\b2_\b2_\b5 _\bD_\bi_\ba_\bg_\bo_\bn_\ba_\bl_\bM_\ba_\bt_\br_\bi_\bx& _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b-_\b=_\b (const _\bD_\bi_\ba_\bg_\bo_\bn_\ba_\bl_\bM_\ba_\bt_\br_\bi_\bx& y)\n+226 {\n+227 diag_ -= y.diag_;\n+228 return *this;\n+229 }\n+230\n+_\b2_\b3_\b2 _\bD_\bi_\ba_\bg_\bo_\bn_\ba_\bl_\bM_\ba_\bt_\br_\bi_\bx& _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b+_\b=_\b (const K& k)\n+233 {\n+234 diag_ += k;\n+235 return *this;\n+236 }\n 237\n-238#endif // DUNE_COMMON_LRU_HH\n+_\b2_\b3_\b9 _\bD_\bi_\ba_\bg_\bo_\bn_\ba_\bl_\bM_\ba_\bt_\br_\bi_\bx& _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b-_\b=_\b (const K& k)\n+240 {\n+241 diag_ -= k;\n+242 return *this;\n+243 }\n+244\n+_\b2_\b4_\b6 _\bD_\bi_\ba_\bg_\bo_\bn_\ba_\bl_\bM_\ba_\bt_\br_\bi_\bx& _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b*_\b=_\b (const K& k)\n+247 {\n+248 diag_ *= k;\n+249 return *this;\n+250 }\n+251\n+_\b2_\b5_\b3 _\bD_\bi_\ba_\bg_\bo_\bn_\ba_\bl_\bM_\ba_\bt_\br_\bi_\bx& _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b/_\b=_\b (const K& k)\n+254 {\n+255 diag_ /= k;\n+256 return *this;\n+257 }\n+258\n+259 //===== comparison ops\n+260\n+_\b2_\b6_\b2 bool _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b=_\b=(const _\bD_\bi_\ba_\bg_\bo_\bn_\ba_\bl_\bM_\ba_\bt_\br_\bi_\bx& other) const\n+263 {\n+264 return diag_==other._\bd_\bi_\ba_\bg_\bo_\bn_\ba_\bl();\n+265 }\n+266\n+_\b2_\b6_\b8 bool _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b!_\b=(const _\bD_\bi_\ba_\bg_\bo_\bn_\ba_\bl_\bM_\ba_\bt_\br_\bi_\bx& other) const\n+269 {\n+270 return diag_!=other._\bd_\bi_\ba_\bg_\bo_\bn_\ba_\bl();\n+271 }\n+272\n+273\n+274 //===== linear maps\n+275\n+277 template\n+_\b2_\b7_\b8 void _\bm_\bv (const X& x, Y& y) const\n+279 {\n+280#ifdef DUNE_FMatrix_WITH_CHECKING\n+281 if (x.N()!=_\bM()) _\bD_\bU_\bN_\bE_\b__\bT_\bH_\bR_\bO_\bW(_\bF_\bM_\ba_\bt_\br_\bi_\bx_\bE_\br_\br_\bo_\br,\"index out of range\");\n+282 if (y.N()!=_\bN()) _\bD_\bU_\bN_\bE_\b__\bT_\bH_\bR_\bO_\bW(_\bF_\bM_\ba_\bt_\br_\bi_\bx_\bE_\br_\br_\bo_\br,\"index out of range\");\n+283#endif\n+284 for (_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be i=0; i\n+_\b2_\b9_\b0 void _\bm_\bt_\bv (const X& x, Y& y) const\n+291 {\n+292 _\bm_\bv(x, y);\n+293 }\n+294\n+296 template\n+_\b2_\b9_\b7 void _\bu_\bm_\bv (const X& x, Y& y) const\n+298 {\n+299#ifdef DUNE_FMatrix_WITH_CHECKING\n+300 if (x.N()!=_\bM()) _\bD_\bU_\bN_\bE_\b__\bT_\bH_\bR_\bO_\bW(_\bF_\bM_\ba_\bt_\br_\bi_\bx_\bE_\br_\br_\bo_\br,\"index out of range\");\n+301 if (y.N()!=_\bN()) _\bD_\bU_\bN_\bE_\b__\bT_\bH_\bR_\bO_\bW(_\bF_\bM_\ba_\bt_\br_\bi_\bx_\bE_\br_\br_\bo_\br,\"index out of range\");\n+302#endif\n+303 for (_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be i=0; i\n+_\b3_\b0_\b9 void _\bu_\bm_\bt_\bv (const X& x, Y& y) const\n+310 {\n+311#ifdef DUNE_FMatrix_WITH_CHECKING\n+312 if (x.N()!=_\bN()) _\bD_\bU_\bN_\bE_\b__\bT_\bH_\bR_\bO_\bW(_\bF_\bM_\ba_\bt_\br_\bi_\bx_\bE_\br_\br_\bo_\br,\"index out of range\");\n+313 if (y.N()!=_\bM()) _\bD_\bU_\bN_\bE_\b__\bT_\bH_\bR_\bO_\bW(_\bF_\bM_\ba_\bt_\br_\bi_\bx_\bE_\br_\br_\bo_\br,\"index out of range\");\n+314#endif\n+315 for (_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be i=0; i\n+_\b3_\b2_\b1 void _\bu_\bm_\bh_\bv (const X& x, Y& y) const\n+322 {\n+323#ifdef DUNE_FMatrix_WITH_CHECKING\n+324 if (x.N()!=_\bN()) _\bD_\bU_\bN_\bE_\b__\bT_\bH_\bR_\bO_\bW(_\bF_\bM_\ba_\bt_\br_\bi_\bx_\bE_\br_\br_\bo_\br,\"index out of range\");\n+325 if (y.N()!=_\bM()) _\bD_\bU_\bN_\bE_\b__\bT_\bH_\bR_\bO_\bW(_\bF_\bM_\ba_\bt_\br_\bi_\bx_\bE_\br_\br_\bo_\br,\"index out of range\");\n+326#endif\n+327 for (_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be i=0; i\n+_\b3_\b3_\b3 void _\bm_\bm_\bv (const X& x, Y& y) const\n+334 {\n+335#ifdef DUNE_FMatrix_WITH_CHECKING\n+336 if (x.N()!=_\bM()) _\bD_\bU_\bN_\bE_\b__\bT_\bH_\bR_\bO_\bW(_\bF_\bM_\ba_\bt_\br_\bi_\bx_\bE_\br_\br_\bo_\br,\"index out of range\");\n+337 if (y.N()!=_\bN()) _\bD_\bU_\bN_\bE_\b__\bT_\bH_\bR_\bO_\bW(_\bF_\bM_\ba_\bt_\br_\bi_\bx_\bE_\br_\br_\bo_\br,\"index out of range\");\n+338#endif\n+339 for (_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be i=0; i\n+_\b3_\b4_\b5 void _\bm_\bm_\bt_\bv (const X& x, Y& y) const\n+346 {\n+347#ifdef DUNE_FMatrix_WITH_CHECKING\n+348 if (x.N()!=_\bN()) _\bD_\bU_\bN_\bE_\b__\bT_\bH_\bR_\bO_\bW(_\bF_\bM_\ba_\bt_\br_\bi_\bx_\bE_\br_\br_\bo_\br,\"index out of range\");\n+349 if (y.N()!=_\bM()) _\bD_\bU_\bN_\bE_\b__\bT_\bH_\bR_\bO_\bW(_\bF_\bM_\ba_\bt_\br_\bi_\bx_\bE_\br_\br_\bo_\br,\"index out of range\");\n+350#endif\n+351 for (_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be i=0; i\n+_\b3_\b5_\b7 void _\bm_\bm_\bh_\bv (const X& x, Y& y) const\n+358 {\n+359#ifdef DUNE_FMatrix_WITH_CHECKING\n+360 if (x.N()!=_\bN()) _\bD_\bU_\bN_\bE_\b__\bT_\bH_\bR_\bO_\bW(_\bF_\bM_\ba_\bt_\br_\bi_\bx_\bE_\br_\br_\bo_\br,\"index out of range\");\n+361 if (y.N()!=_\bM()) _\bD_\bU_\bN_\bE_\b__\bT_\bH_\bR_\bO_\bW(_\bF_\bM_\ba_\bt_\br_\bi_\bx_\bE_\br_\br_\bo_\br,\"index out of range\");\n+362#endif\n+363 for (_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be i=0; i\n+_\b3_\b6_\b9 void _\bu_\bs_\bm_\bv (const typename _\bF_\bi_\be_\bl_\bd_\bT_\br_\ba_\bi_\bt_\bs_\b<_\bY_\b>_\b:_\b:_\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be & alpha,\n+370 const X& x, Y& y) const\n+371 {\n+372#ifdef DUNE_FMatrix_WITH_CHECKING\n+373 if (x.N()!=_\bM()) _\bD_\bU_\bN_\bE_\b__\bT_\bH_\bR_\bO_\bW(_\bF_\bM_\ba_\bt_\br_\bi_\bx_\bE_\br_\br_\bo_\br,\"index out of range\");\n+374 if (y.N()!=_\bN()) _\bD_\bU_\bN_\bE_\b__\bT_\bH_\bR_\bO_\bW(_\bF_\bM_\ba_\bt_\br_\bi_\bx_\bE_\br_\br_\bo_\br,\"index out of range\");\n+375#endif\n+376 for (_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be i=0; i\n+_\b3_\b8_\b2 void _\bu_\bs_\bm_\bt_\bv (const typename _\bF_\bi_\be_\bl_\bd_\bT_\br_\ba_\bi_\bt_\bs_\b<_\bY_\b>_\b:_\b:_\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be & alpha,\n+383 const X& x, Y& y) const\n+384 {\n+385#ifdef DUNE_FMatrix_WITH_CHECKING\n+386 if (x.N()!=_\bN()) _\bD_\bU_\bN_\bE_\b__\bT_\bH_\bR_\bO_\bW(_\bF_\bM_\ba_\bt_\br_\bi_\bx_\bE_\br_\br_\bo_\br,\"index out of range\");\n+387 if (y.N()!=_\bM()) _\bD_\bU_\bN_\bE_\b__\bT_\bH_\bR_\bO_\bW(_\bF_\bM_\ba_\bt_\br_\bi_\bx_\bE_\br_\br_\bo_\br,\"index out of range\");\n+388#endif\n+389 for (_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be i=0; i\n+_\b3_\b9_\b5 void _\bu_\bs_\bm_\bh_\bv (const typename _\bF_\bi_\be_\bl_\bd_\bT_\br_\ba_\bi_\bt_\bs_\b<_\bY_\b>_\b:_\b:_\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be & alpha,\n+396 const X& x, Y& y) const\n+397 {\n+398#ifdef DUNE_FMatrix_WITH_CHECKING\n+399 if (x.N()!=_\bN()) _\bD_\bU_\bN_\bE_\b__\bT_\bH_\bR_\bO_\bW(_\bF_\bM_\ba_\bt_\br_\bi_\bx_\bE_\br_\br_\bo_\br,\"index out of range\");\n+400 if (y.N()!=_\bM()) _\bD_\bU_\bN_\bE_\b__\bT_\bH_\bR_\bO_\bW(_\bF_\bM_\ba_\bt_\br_\bi_\bx_\bE_\br_\br_\bo_\br,\"index out of range\");\n+401#endif\n+402 for (_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be i=0; i\n+_\b4_\b3_\b8 void _\bs_\bo_\bl_\bv_\be (V& x, const V& b) const\n+439 {\n+440 for (int i=0; i_\b:_\b:_\br_\be_\ba_\bl_\b__\bt_\by_\bp_\be;\n+448 for (int i=0; i\n+_\b4_\b6_\b8 friend auto _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b*_\b ( const _\bD_\bi_\ba_\bg_\bo_\bn_\ba_\bl_\bM_\ba_\bt_\br_\bi_\bx& matrixA,\n+469 const _\bD_\bi_\ba_\bg_\bo_\bn_\ba_\bl_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bO_\bt_\bh_\be_\br_\bS_\bc_\ba_\bl_\ba_\br_\b,_\b _\bn_\b>& matrixB)\n+470 {\n+471 auto result = _\bD_\bi_\ba_\bg_\bo_\bn_\ba_\bl_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bt_\by_\bp_\be_\bn_\ba_\bm_\be_\b _\bP_\br_\bo_\bm_\bo_\bt_\bi_\bo_\bn_\bT_\br_\ba_\bi_\bt_\bs_\b<_\bK_\b,_\bO_\bt_\bh_\be_\br_\bS_\bc_\ba_\bl_\ba_\br_\b>_\b:_\b:\n+_\bP_\br_\bo_\bm_\bo_\bt_\be_\bd_\bT_\by_\bp_\be, n>{};\n+472 for(int i=0; i= 0 && i < n);\n+501 _\bD_\bU_\bN_\bE_\b__\bA_\bS_\bS_\bE_\bR_\bT_\b__\bB_\bO_\bU_\bN_\bD_\bS(j >= 0 && j < n);\n+502 return i==j;\n+503 }\n+504\n+505\n+506\n+_\b5_\b0_\b8 friend std::ostream& _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b<_\b<_\b (std::ostream& s, const\n+_\bD_\bi_\ba_\bg_\bo_\bn_\ba_\bl_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bK_\b,_\bn_\b>& a)\n+509 {\n+510 for (_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be i=0; i(&diag_[i]), i);\n+522 }\n+523\n+_\b5_\b2_\b5 _\bc_\bo_\bn_\bs_\bt_\b__\br_\be_\bf_\be_\br_\be_\bn_\bc_\be _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b[_\b](_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be i) const\n+526 {\n+527 return _\bc_\bo_\bn_\bs_\bt_\b__\br_\be_\bf_\be_\br_\be_\bn_\bc_\be(const_cast(&diag_[i]), i);\n+528 }\n+529\n+_\b5_\b3_\b1 const K& _\bd_\bi_\ba_\bg_\bo_\bn_\ba_\bl(_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be i) const\n+532 {\n+533 return diag_[i];\n+534 }\n+535\n+_\b5_\b3_\b7 K& _\bd_\bi_\ba_\bg_\bo_\bn_\ba_\bl(_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be i)\n+538 {\n+539 return diag_[i];\n+540 }\n+541\n+_\b5_\b4_\b3 const _\bF_\bi_\be_\bl_\bd_\bV_\be_\bc_\bt_\bo_\br_\b<_\bK_\b,_\bn_\b>& _\bd_\bi_\ba_\bg_\bo_\bn_\ba_\bl() const\n+544 {\n+545 return diag_;\n+546 }\n+547\n+_\b5_\b4_\b9 _\bF_\bi_\be_\bl_\bd_\bV_\be_\bc_\bt_\bo_\br_\b<_\bK_\b,_\bn_\b>& _\bd_\bi_\ba_\bg_\bo_\bn_\ba_\bl()\n+550 {\n+551 return diag_;\n+552 }\n+553\n+554 private:\n+555\n+556 // the data, a FieldVector storing the diagonal\n+557 _\bF_\bi_\be_\bl_\bd_\bV_\be_\bc_\bt_\bo_\br_\b<_\bK_\b,_\bn_\b> diag_;\n+558 };\n+559\n+560 template< class K, int n >\n+_\b5_\b6_\b1 struct _\bF_\bi_\be_\bl_\bd_\bT_\br_\ba_\bi_\bt_\bs< _\bD_\bi_\ba_\bg_\bo_\bn_\ba_\bl_\bM_\ba_\bt_\br_\bi_\bx >\n+562 {\n+_\b5_\b6_\b3 typedef typename _\bF_\bi_\be_\bl_\bd_\bT_\br_\ba_\bi_\bt_\bs_\b<_\bK_\b>_\b:_\b:_\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be _\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be;\n+_\b5_\b6_\b4 typedef typename _\bF_\bi_\be_\bl_\bd_\bT_\br_\ba_\bi_\bt_\bs_\b<_\bK_\b>_\b:_\b:_\br_\be_\ba_\bl_\b__\bt_\by_\bp_\be _\br_\be_\ba_\bl_\b__\bt_\by_\bp_\be;\n+565 };\n+566\n+567\n+568#ifndef DOXYGEN // hide specialization\n+571 template< class K >\n+572 class _\bD_\bi_\ba_\bg_\bo_\bn_\ba_\bl_\bM_\ba_\bt_\br_\bi_\bx : public _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx\n+573 {\n+574 typedef _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bK_\b,_\b1_\b,_\b1_\b> Base;\n+575 public:\n+577 typedef typename Base::size_type _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be;\n+578\n+581 constexpr static int _\bb_\bl_\bo_\bc_\bk_\bl_\be_\bv_\be_\bl = 1;\n+582\n+583 typedef typename Base::row_type _\br_\bo_\bw_\b__\bt_\by_\bp_\be;\n+584\n+585 typedef typename Base::row_reference _\br_\bo_\bw_\b__\br_\be_\bf_\be_\br_\be_\bn_\bc_\be;\n+586 typedef typename Base::const_row_reference _\bc_\bo_\bn_\bs_\bt_\b__\br_\bo_\bw_\b__\br_\be_\bf_\be_\br_\be_\bn_\bc_\be;\n+587\n+590 constexpr static int _\br_\bo_\bw_\bs = 1;\n+593 constexpr static int _\bc_\bo_\bl_\bs = 1;\n+594\n+595\n+597 constexpr _\bD_\bi_\ba_\bg_\bo_\bn_\ba_\bl_\bM_\ba_\bt_\br_\bi_\bx() = default;\n+598\n+600 _\bD_\bi_\ba_\bg_\bo_\bn_\ba_\bl_\bM_\ba_\bt_\br_\bi_\bx(const K& scalar)\n+601 {\n+602 (*this)[0][0] = scalar;\n+603 }\n+604\n+606 const K& _\bd_\bi_\ba_\bg_\bo_\bn_\ba_\bl(_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be) const\n+607 {\n+608 return (*this)[0][0];\n+609 }\n+610\n+612 K& _\bd_\bi_\ba_\bg_\bo_\bn_\ba_\bl(_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be)\n+613 {\n+614 return (*this)[0][0];\n+615 }\n+616\n+618 const FieldVector& _\bd_\bi_\ba_\bg_\bo_\bn_\ba_\bl() const\n+619 {\n+620 return (*this)[0];\n+621 }\n+622\n+624 FieldVector& _\bd_\bi_\ba_\bg_\bo_\bn_\ba_\bl()\n+625 {\n+626 return (*this)[0];\n+627 }\n+628\n+630 DiagonalMatrix _\bt_\br_\ba_\bn_\bs_\bp_\bo_\bs_\be_\bd() const\n+631 {\n+632 return *this;\n+633 }\n+634\n+637 template \n+638 friend auto _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b*_\b ( const _\bD_\bi_\ba_\bg_\bo_\bn_\ba_\bl_\bM_\ba_\bt_\br_\bi_\bx& matrixA,\n+639 const DiagonalMatrix& matrixB)\n+640 {\n+641 return DiagonalMatrix::\n+PromotedType, 1>{matrixA.diagonal(0)*matrixB.diagonal(0)};\n+642 }\n+643\n+644 };\n+645#endif\n+646\n+647\n+648 template\n+_\b6_\b4_\b9 class _\bD_\bi_\ba_\bg_\bo_\bn_\ba_\bl_\bM_\ba_\bt_\br_\bi_\bx_\bW_\br_\ba_\bp_\bp_\be_\br\n+650 {\n+651 typedef typename DiagonalMatrixType::reference reference;\n+652 typedef typename DiagonalMatrixType::const_reference const_reference;\n+653 typedef typename DiagonalMatrixType::field_type K;\n+654 typedef _\bD_\bi_\ba_\bg_\bo_\bn_\ba_\bl_\bR_\bo_\bw_\bV_\be_\bc_\bt_\bo_\br_\b<_\bK_\b,_\b _\bD_\bi_\ba_\bg_\bo_\bn_\ba_\bl_\bM_\ba_\bt_\br_\bi_\bx_\bT_\by_\bp_\be_\b:_\b:_\br_\bo_\bw_\bs_\b> _\br_\bo_\bw_\b__\bt_\by_\bp_\be;\n+655 typedef std::size_t size_type;\n+_\b6_\b5_\b6 typedef _\bD_\bi_\ba_\bg_\bo_\bn_\ba_\bl_\bM_\ba_\bt_\br_\bi_\bx_\bW_\br_\ba_\bp_\bp_\be_\br_\b<_\b _\bD_\bi_\ba_\bg_\bo_\bn_\ba_\bl_\bM_\ba_\bt_\br_\bi_\bx_\bT_\by_\bp_\be_\b> _\bM_\by_\bT_\by_\bp_\be;\n+657\n+658 friend class _\bC_\bo_\bn_\bt_\ba_\bi_\bn_\be_\br_\bW_\br_\ba_\bp_\bp_\be_\br_\bI_\bt_\be_\br_\ba_\bt_\bo_\br;\n+659 friend class _\bC_\bo_\bn_\bt_\ba_\bi_\bn_\be_\br_\bW_\br_\ba_\bp_\bp_\be_\br_\bI_\bt_\be_\br_\ba_\bt_\bo_\br;\n+660\n+661 public:\n+662\n+_\b6_\b6_\b3 _\bD_\bi_\ba_\bg_\bo_\bn_\ba_\bl_\bM_\ba_\bt_\br_\bi_\bx_\bW_\br_\ba_\bp_\bp_\be_\br() :\n+664 mat_(0)\n+665 {}\n+666\n+_\b6_\b6_\b7 _\bD_\bi_\ba_\bg_\bo_\bn_\ba_\bl_\bM_\ba_\bt_\br_\bi_\bx_\bW_\br_\ba_\bp_\bp_\be_\br(const DiagonalMatrixType* mat) :\n+668 mat_(const_cast(mat))\n+669 {}\n+670\n+_\b6_\b7_\b1 size_type _\br_\be_\ba_\bl_\bI_\bn_\bd_\be_\bx(int i) const\n+672 {\n+673 return i;\n+674 }\n+675\n+_\b6_\b7_\b6 _\br_\bo_\bw_\b__\bt_\by_\bp_\be* _\bp_\bo_\bi_\bn_\bt_\be_\br(int i) const\n+677 {\n+678 row_ = _\br_\bo_\bw_\b__\bt_\by_\bp_\be(&(mat_->diagonal(i)), i);\n+679 return &row_;\n+680 }\n+681\n+_\b6_\b8_\b2 bool _\bi_\bd_\be_\bn_\bt_\bi_\bc_\ba_\bl(const _\bD_\bi_\ba_\bg_\bo_\bn_\ba_\bl_\bM_\ba_\bt_\br_\bi_\bx_\bW_\br_\ba_\bp_\bp_\be_\br& other) const\n+683 {\n+684 return mat_==other.mat_;\n+685 }\n+686\n+687 private:\n+688\n+689 mutable DiagonalMatrixType* mat_;\n+690 mutable row_type row_;\n+691 };\n+692\n+696 template< class K, int n >\n+_\b6_\b9_\b7 class _\bD_\bi_\ba_\bg_\bo_\bn_\ba_\bl_\bR_\bo_\bw_\bV_\be_\bc_\bt_\bo_\br_\bC_\bo_\bn_\bs_\bt\n+698 {\n+699 template\n+_\b7_\b0_\b0 friend class _\bD_\bi_\ba_\bg_\bo_\bn_\ba_\bl_\bM_\ba_\bt_\br_\bi_\bx_\bW_\br_\ba_\bp_\bp_\be_\br;\n+701 friend class _\bC_\bo_\bn_\bt_\ba_\bi_\bn_\be_\br_\bW_\br_\ba_\bp_\bp_\be_\br_\bI_\bt_\be_\br_\ba_\bt_\bo_\br<_\bD_\bi_\ba_\bg_\bo_\bn_\ba_\bl_\bR_\bo_\bw_\bV_\be_\bc_\bt_\bo_\br_\bC_\bo_\bn_\bs_\bt, const K,\n+const K&>;\n+702\n+703 public:\n+704 // remember size of vector\n+_\b7_\b0_\b5 constexpr static int _\bd_\bi_\bm_\be_\bn_\bs_\bi_\bo_\bn = n;\n+706\n+707 // standard constructor and everything is sufficient ...\n+708\n+709 //===== type definitions and constants\n+710\n+_\b7_\b1_\b2 typedef K _\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be;\n+713\n+_\b7_\b1_\b5 typedef K _\bb_\bl_\bo_\bc_\bk_\b__\bt_\by_\bp_\be;\n+716\n+_\b7_\b1_\b8 typedef std::size_t _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be;\n+719\n+_\b7_\b2_\b1 constexpr static int _\bb_\bl_\bo_\bc_\bk_\bl_\be_\bv_\be_\bl = 1;\n+722\n+_\b7_\b2_\b4 constexpr static int _\bs_\bi_\bz_\be = n;\n+725\n+_\b7_\b2_\b7 _\bD_\bi_\ba_\bg_\bo_\bn_\ba_\bl_\bR_\bo_\bw_\bV_\be_\bc_\bt_\bo_\br_\bC_\bo_\bn_\bs_\bt() :\n+728 _\bp_\b_(0),\n+729 _\br_\bo_\bw_\b_(0)\n+730 {}\n+731\n+_\b7_\b3_\b3 explicit _\bD_\bi_\ba_\bg_\bo_\bn_\ba_\bl_\bR_\bo_\bw_\bV_\be_\bc_\bt_\bo_\br_\bC_\bo_\bn_\bs_\bt (K* p, int col) :\n+734 _\bp_\b_(p),\n+735 _\br_\bo_\bw_\b_(col)\n+736 {}\n+737\n+738 //===== access to components\n+739\n+_\b7_\b4_\b1 const K& _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b[_\b]_\b ([[maybe_unused]] _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be i) const\n+742 {\n+743 _\bD_\bU_\bN_\bE_\b__\bA_\bS_\bS_\bE_\bR_\bT_\b__\bB_\bO_\bU_\bN_\bD_\bS(i == _\br_\bo_\bw_\b_);\n+744 return *_\bp_\b_;\n+745 }\n+746\n+747 // check if row is identical to other row (not only identical values)\n+748 // since this is a proxy class we need to check equality of the stored\n+pointer\n+_\b7_\b4_\b9 bool _\bi_\bd_\be_\bn_\bt_\bi_\bc_\ba_\bl(const _\bD_\bi_\ba_\bg_\bo_\bn_\ba_\bl_\bR_\bo_\bw_\bV_\be_\bc_\bt_\bo_\br_\bC_\bo_\bn_\bs_\bt_\b<_\bK_\b,_\bn_\b>& other) const\n+750 {\n+751 return ((_\bp_\b_ == other._\bp_\b_)and (_\br_\bo_\bw_\b_ == other._\br_\bo_\bw_\b_));\n+752 }\n+753\n+_\b7_\b5_\b5 typedef _\bC_\bo_\bn_\bt_\ba_\bi_\bn_\be_\br_\bW_\br_\ba_\bp_\bp_\be_\br_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b<_\bD_\bi_\ba_\bg_\bo_\bn_\ba_\bl_\bR_\bo_\bw_\bV_\be_\bc_\bt_\bo_\br_\bC_\bo_\bn_\bs_\bt_\b<_\bK_\b,_\bn_\b>, const K,\n+const K&> _\bC_\bo_\bn_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br;\n+_\b7_\b5_\b7 typedef _\bC_\bo_\bn_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br _\bc_\bo_\bn_\bs_\bt_\b__\bi_\bt_\be_\br_\ba_\bt_\bo_\br;\n+758\n+_\b7_\b6_\b0 _\bC_\bo_\bn_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br _\bb_\be_\bg_\bi_\bn () const\n+761 {\n+762 return _\bC_\bo_\bn_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br(*this,0);\n+763 }\n+764\n+_\b7_\b6_\b6 _\bC_\bo_\bn_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br _\be_\bn_\bd () const\n+767 {\n+768 return _\bC_\bo_\bn_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br(*this,1);\n+769 }\n+770\n+_\b7_\b7_\b3 _\bC_\bo_\bn_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br _\bb_\be_\bf_\bo_\br_\be_\bE_\bn_\bd() const\n+774 {\n+775 return _\bC_\bo_\bn_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br(*this,0);\n+776 }\n+777\n+_\b7_\b8_\b0 _\bC_\bo_\bn_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br _\bb_\be_\bf_\bo_\br_\be_\bB_\be_\bg_\bi_\bn () const\n+781 {\n+782 return _\bC_\bo_\bn_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br(*this,-1);\n+783 }\n+784\n+_\b7_\b8_\b6 bool _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b=_\b=_\b (const _\bD_\bi_\ba_\bg_\bo_\bn_\ba_\bl_\bR_\bo_\bw_\bV_\be_\bc_\bt_\bo_\br_\bC_\bo_\bn_\bs_\bt& y) const\n+787 {\n+788 return ((_\bp_\b_==y._\bp_\b_)and (_\br_\bo_\bw_\b_==y._\br_\bo_\bw_\b_));\n+789 }\n+790\n+791 //===== sizes\n+792\n+_\b7_\b9_\b4 _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be _\bN () const\n+795 {\n+796 return n;\n+797 }\n+798\n+_\b8_\b0_\b0 _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be _\bd_\bi_\bm () const\n+801 {\n+802 return n;\n+803 }\n+804\n+_\b8_\b0_\b6 _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be _\br_\bo_\bw_\bI_\bn_\bd_\be_\bx() const\n+807 {\n+808 return _\br_\bo_\bw_\b_;\n+809 }\n+810\n+_\b8_\b1_\b2 const K& _\bd_\bi_\ba_\bg_\bo_\bn_\ba_\bl() const\n+813 {\n+814 return *_\bp_\b_;\n+815 }\n+816\n+817 protected:\n+818\n+_\b8_\b1_\b9 _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be _\br_\be_\ba_\bl_\bI_\bn_\bd_\be_\bx([[maybe_unused]] int i) const\n+820 {\n+821 return _\br_\bo_\bw_\bI_\bn_\bd_\be_\bx();\n+822 }\n+823\n+_\b8_\b2_\b4 K* _\bp_\bo_\bi_\bn_\bt_\be_\br([[maybe_unused]] _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be i) const\n+825 {\n+826 return const_cast(_\bp_\b_);\n+827 }\n+828\n+_\b8_\b2_\b9 _\bD_\bi_\ba_\bg_\bo_\bn_\ba_\bl_\bR_\bo_\bw_\bV_\be_\bc_\bt_\bo_\br_\bC_\bo_\bn_\bs_\bt* _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b&()\n+830 {\n+831 return this;\n+832 }\n+833\n+834 // the data, very simply a pointer to the diagonal value and the row number\n+_\b8_\b3_\b5 K* _\bp_\b_;\n+_\b8_\b3_\b6 _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be _\br_\bo_\bw_\b_;\n+837 };\n+838\n+839 template< class K, int n >\n+_\b8_\b4_\b0 class _\bD_\bi_\ba_\bg_\bo_\bn_\ba_\bl_\bR_\bo_\bw_\bV_\be_\bc_\bt_\bo_\br : public _\bD_\bi_\ba_\bg_\bo_\bn_\ba_\bl_\bR_\bo_\bw_\bV_\be_\bc_\bt_\bo_\br_\bC_\bo_\bn_\bs_\bt\n+841 {\n+842 template\n+_\b8_\b4_\b3 friend class _\bD_\bi_\ba_\bg_\bo_\bn_\ba_\bl_\bM_\ba_\bt_\br_\bi_\bx_\bW_\br_\ba_\bp_\bp_\be_\br;\n+844 friend class _\bC_\bo_\bn_\bt_\ba_\bi_\bn_\be_\br_\bW_\br_\ba_\bp_\bp_\be_\br_\bI_\bt_\be_\br_\ba_\bt_\bo_\br<_\bD_\bi_\ba_\bg_\bo_\bn_\ba_\bl_\bR_\bo_\bw_\bV_\be_\bc_\bt_\bo_\br, K, K&>;\n+845\n+846 public:\n+847 // standard constructor and everything is sufficient ...\n+848\n+849 //===== type definitions and constants\n+850\n+_\b8_\b5_\b2 typedef K _\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be;\n+853\n+_\b8_\b5_\b5 typedef K _\bb_\bl_\bo_\bc_\bk_\b__\bt_\by_\bp_\be;\n+856\n+_\b8_\b5_\b8 typedef std::size_t _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be;\n+859\n+_\b8_\b6_\b1 _\bD_\bi_\ba_\bg_\bo_\bn_\ba_\bl_\bR_\bo_\bw_\bV_\be_\bc_\bt_\bo_\br() : _\bD_\bi_\ba_\bg_\bo_\bn_\ba_\bl_\bR_\bo_\bw_\bV_\be_\bc_\bt_\bo_\br_\bC_\bo_\bn_\bs_\bt()\n+862 {}\n+863\n+_\b8_\b6_\b5 explicit _\bD_\bi_\ba_\bg_\bo_\bn_\ba_\bl_\bR_\bo_\bw_\bV_\be_\bc_\bt_\bo_\br (K* p, int col) : _\bD_\bi_\ba_\bg_\bo_\bn_\ba_\bl_\bR_\bo_\bw_\bV_\be_\bc_\bt_\bo_\br_\bC_\bo_\bn_\bs_\bt(p,\n+col)\n+866 {}\n+867\n+868 //===== assignment from scalar\n+_\b8_\b7_\b0 _\bD_\bi_\ba_\bg_\bo_\bn_\ba_\bl_\bR_\bo_\bw_\bV_\be_\bc_\bt_\bo_\br& _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b=_\b (const K& k)\n+871 {\n+872 *_\bp_\b_ = k;\n+873 return *this;\n+874 }\n+875\n+876 //===== access to components\n+877\n+_\b8_\b7_\b9 K& _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b[_\b]_\b ([[maybe_unused]] _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be i)\n+880 {\n+881 _\bD_\bU_\bN_\bE_\b__\bA_\bS_\bS_\bE_\bR_\bT_\b__\bB_\bO_\bU_\bN_\bD_\bS(i == _\br_\bo_\bw_\b_);\n+882 return *_\bp_\b_;\n+883 }\n+884\n+_\b8_\b8_\b6 typedef _\bC_\bo_\bn_\bt_\ba_\bi_\bn_\be_\br_\bW_\br_\ba_\bp_\bp_\be_\br_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b<_\bD_\bi_\ba_\bg_\bo_\bn_\ba_\bl_\bR_\bo_\bw_\bV_\be_\bc_\bt_\bo_\br_\b<_\bK_\b,_\bn_\b>, K, K&> _\bI_\bt_\be_\br_\ba_\bt_\bo_\br;\n+_\b8_\b8_\b8 typedef _\bI_\bt_\be_\br_\ba_\bt_\bo_\br _\bi_\bt_\be_\br_\ba_\bt_\bo_\br;\n+889\n+_\b8_\b9_\b1 _\bI_\bt_\be_\br_\ba_\bt_\bo_\br _\bb_\be_\bg_\bi_\bn ()\n+892 {\n+893 return _\bI_\bt_\be_\br_\ba_\bt_\bo_\br(*this, 0);\n+894 }\n+895\n+_\b8_\b9_\b7 _\bI_\bt_\be_\br_\ba_\bt_\bo_\br _\be_\bn_\bd ()\n+898 {\n+899 return _\bI_\bt_\be_\br_\ba_\bt_\bo_\br(*this, 1);\n+900 }\n+901\n+_\b9_\b0_\b4 _\bI_\bt_\be_\br_\ba_\bt_\bo_\br _\bb_\be_\bf_\bo_\br_\be_\bE_\bn_\bd ()\n+905 {\n+906 return _\bI_\bt_\be_\br_\ba_\bt_\bo_\br(*this, 0);\n+907 }\n+908\n+_\b9_\b1_\b1 _\bI_\bt_\be_\br_\ba_\bt_\bo_\br _\bb_\be_\bf_\bo_\br_\be_\bB_\be_\bg_\bi_\bn ()\n+912 {\n+913 return _\bI_\bt_\be_\br_\ba_\bt_\bo_\br(*this, -1);\n+914 }\n+915\n+_\b9_\b1_\b7 typedef _\bC_\bo_\bn_\bt_\ba_\bi_\bn_\be_\br_\bW_\br_\ba_\bp_\bp_\be_\br_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b<_\bD_\bi_\ba_\bg_\bo_\bn_\ba_\bl_\bR_\bo_\bw_\bV_\be_\bc_\bt_\bo_\br_\bC_\bo_\bn_\bs_\bt_\b<_\bK_\b,_\bn_\b>, const K,\n+const K&> _\bC_\bo_\bn_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br;\n+_\b9_\b1_\b9 typedef _\bC_\bo_\bn_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br _\bc_\bo_\bn_\bs_\bt_\b__\bi_\bt_\be_\br_\ba_\bt_\bo_\br;\n+920\n+921 using _\bD_\bi_\ba_\bg_\bo_\bn_\ba_\bl_\bR_\bo_\bw_\bV_\be_\bc_\bt_\bo_\br_\bC_\bo_\bn_\bs_\bt_\b:_\b:_\bi_\bd_\be_\bn_\bt_\bi_\bc_\ba_\bl;\n+922 using _\bD_\bi_\ba_\bg_\bo_\bn_\ba_\bl_\bR_\bo_\bw_\bV_\be_\bc_\bt_\bo_\br_\bC_\bo_\bn_\bs_\bt::operator[];\n+923 using _\bD_\bi_\ba_\bg_\bo_\bn_\ba_\bl_\bR_\bo_\bw_\bV_\be_\bc_\bt_\bo_\br_\bC_\bo_\bn_\bs_\bt::operator==;\n+924 using _\bD_\bi_\ba_\bg_\bo_\bn_\ba_\bl_\bR_\bo_\bw_\bV_\be_\bc_\bt_\bo_\br_\bC_\bo_\bn_\bs_\bt_\b:_\b:_\bb_\be_\bg_\bi_\bn;\n+925 using _\bD_\bi_\ba_\bg_\bo_\bn_\ba_\bl_\bR_\bo_\bw_\bV_\be_\bc_\bt_\bo_\br_\bC_\bo_\bn_\bs_\bt_\b:_\b:_\be_\bn_\bd;\n+926 using _\bD_\bi_\ba_\bg_\bo_\bn_\ba_\bl_\bR_\bo_\bw_\bV_\be_\bc_\bt_\bo_\br_\bC_\bo_\bn_\bs_\bt_\b:_\b:_\bb_\be_\bf_\bo_\br_\be_\bE_\bn_\bd;\n+927 using _\bD_\bi_\ba_\bg_\bo_\bn_\ba_\bl_\bR_\bo_\bw_\bV_\be_\bc_\bt_\bo_\br_\bC_\bo_\bn_\bs_\bt_\b:_\b:_\bb_\be_\bf_\bo_\br_\be_\bB_\be_\bg_\bi_\bn;\n+928 using _\bD_\bi_\ba_\bg_\bo_\bn_\ba_\bl_\bR_\bo_\bw_\bV_\be_\bc_\bt_\bo_\br_\bC_\bo_\bn_\bs_\bt_\b:_\b:_\bN;\n+929 using _\bD_\bi_\ba_\bg_\bo_\bn_\ba_\bl_\bR_\bo_\bw_\bV_\be_\bc_\bt_\bo_\br_\bC_\bo_\bn_\bs_\bt_\b:_\b:_\bd_\bi_\bm;\n+930 using _\bD_\bi_\ba_\bg_\bo_\bn_\ba_\bl_\bR_\bo_\bw_\bV_\be_\bc_\bt_\bo_\br_\bC_\bo_\bn_\bs_\bt_\b:_\b:_\br_\bo_\bw_\bI_\bn_\bd_\be_\bx;\n+931 using _\bD_\bi_\ba_\bg_\bo_\bn_\ba_\bl_\bR_\bo_\bw_\bV_\be_\bc_\bt_\bo_\br_\bC_\bo_\bn_\bs_\bt_\b:_\b:_\bd_\bi_\ba_\bg_\bo_\bn_\ba_\bl;\n+932\n+933 protected:\n+934\n+_\b9_\b3_\b5 _\bD_\bi_\ba_\bg_\bo_\bn_\ba_\bl_\bR_\bo_\bw_\bV_\be_\bc_\bt_\bo_\br* _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b&()\n+936 {\n+937 return this;\n+938 }\n+939\n+940 private:\n+941\n+942 using _\bD_\bi_\ba_\bg_\bo_\bn_\ba_\bl_\bR_\bo_\bw_\bV_\be_\bc_\bt_\bo_\br_\bC_\bo_\bn_\bs_\bt_\b:_\b:_\bp_\b_;\n+943 using _\bD_\bi_\ba_\bg_\bo_\bn_\ba_\bl_\bR_\bo_\bw_\bV_\be_\bc_\bt_\bo_\br_\bC_\bo_\bn_\bs_\bt_\b:_\b:_\br_\bo_\bw_\b_;\n+944 };\n+945\n+946\n+947 // implement type traits\n+948 template\n+_\b9_\b4_\b9 struct _\bc_\bo_\bn_\bs_\bt_\b__\br_\be_\bf_\be_\br_\be_\bn_\bc_\be< _\bD_\bi_\ba_\bg_\bo_\bn_\ba_\bl_\bR_\bo_\bw_\bV_\be_\bc_\bt_\bo_\br >\n+950 {\n+_\b9_\b5_\b1 typedef _\bD_\bi_\ba_\bg_\bo_\bn_\ba_\bl_\bR_\bo_\bw_\bV_\be_\bc_\bt_\bo_\br_\bC_\bo_\bn_\bs_\bt_\b<_\bK_\b,_\bn_\b> _\bt_\by_\bp_\be;\n+952 };\n+953\n+954 template\n+_\b9_\b5_\b5 struct _\bc_\bo_\bn_\bs_\bt_\b__\br_\be_\bf_\be_\br_\be_\bn_\bc_\be< _\bD_\bi_\ba_\bg_\bo_\bn_\ba_\bl_\bR_\bo_\bw_\bV_\be_\bc_\bt_\bo_\br_\bC_\bo_\bn_\bs_\bt >\n+956 {\n+_\b9_\b5_\b7 typedef _\bD_\bi_\ba_\bg_\bo_\bn_\ba_\bl_\bR_\bo_\bw_\bV_\be_\bc_\bt_\bo_\br_\bC_\bo_\bn_\bs_\bt_\b<_\bK_\b,_\bn_\b> _\bt_\by_\bp_\be;\n+958 };\n+959\n+960 template\n+_\b9_\b6_\b1 struct _\bm_\bu_\bt_\ba_\bb_\bl_\be_\b__\br_\be_\bf_\be_\br_\be_\bn_\bc_\be< _\bD_\bi_\ba_\bg_\bo_\bn_\ba_\bl_\bR_\bo_\bw_\bV_\be_\bc_\bt_\bo_\br >\n+962 {\n+_\b9_\b6_\b3 typedef _\bD_\bi_\ba_\bg_\bo_\bn_\ba_\bl_\bR_\bo_\bw_\bV_\be_\bc_\bt_\bo_\br_\b<_\bK_\b,_\bn_\b> _\bt_\by_\bp_\be;\n+964 };\n+965\n+966 template\n+_\b9_\b6_\b7 struct _\bm_\bu_\bt_\ba_\bb_\bl_\be_\b__\br_\be_\bf_\be_\br_\be_\bn_\bc_\be< _\bD_\bi_\ba_\bg_\bo_\bn_\ba_\bl_\bR_\bo_\bw_\bV_\be_\bc_\bt_\bo_\br_\bC_\bo_\bn_\bs_\bt >\n+968 {\n+_\b9_\b6_\b9 typedef _\bD_\bi_\ba_\bg_\bo_\bn_\ba_\bl_\bR_\bo_\bw_\bV_\be_\bc_\bt_\bo_\br_\b<_\bK_\b,_\bn_\b> _\bt_\by_\bp_\be;\n+970 };\n+971\n+972\n+973\n+996 template\n+_\b9_\b9_\b7 class _\bC_\bo_\bn_\bt_\ba_\bi_\bn_\be_\br_\bW_\br_\ba_\bp_\bp_\be_\br_\bI_\bt_\be_\br_\ba_\bt_\bo_\br : public\n+_\bB_\bi_\bd_\bi_\br_\be_\bc_\bt_\bi_\bo_\bn_\ba_\bl_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bF_\ba_\bc_\ba_\bd_\be,T, R, int>\n+998 {\n+_\b9_\b9_\b9 typedef typename std::remove_const::type NonConstCW;\n+1000\n+1001 friend class _\bC_\bo_\bn_\bt_\ba_\bi_\bn_\be_\br_\bW_\br_\ba_\bp_\bp_\be_\br_\bI_\bt_\be_\br_\ba_\bt_\bo_\br::\n+type, typename _\bm_\bu_\bt_\ba_\bb_\bl_\be_\b__\br_\be_\bf_\be_\br_\be_\bn_\bc_\be::type>;\n+1002 friend class _\bC_\bo_\bn_\bt_\ba_\bi_\bn_\be_\br_\bW_\br_\ba_\bp_\bp_\be_\br_\bI_\bt_\be_\br_\ba_\bt_\bo_\br::\n+type, typename const_reference::type>;\n+1003\n+1004 typedef _\bC_\bo_\bn_\bt_\ba_\bi_\bn_\be_\br_\bW_\br_\ba_\bp_\bp_\be_\br_\bI_\bt_\be_\br_\ba_\bt_\bo_\br::type,\n+typename mutable_reference::type> _\bM_\by_\bT_\by_\bp_\be;\n+1005 typedef _\bC_\bo_\bn_\bt_\ba_\bi_\bn_\be_\br_\bW_\br_\ba_\bp_\bp_\be_\br_\bI_\bt_\be_\br_\ba_\bt_\bo_\br::type,\n+typename const_reference::type> _\bM_\by_\bC_\bo_\bn_\bs_\bt_\bT_\by_\bp_\be;\n+1006\n+1007 public:\n+1008\n+1009 // Constructors needed by the facade iterators.\n+_\b1_\b0_\b1_\b0 _\bC_\bo_\bn_\bt_\ba_\bi_\bn_\be_\br_\bW_\br_\ba_\bp_\bp_\be_\br_\bI_\bt_\be_\br_\ba_\bt_\bo_\br() :\n+1011 containerWrapper_(),\n+1012 position_(0)\n+1013 {}\n+1014\n+_\b1_\b0_\b1_\b5 _\bC_\bo_\bn_\bt_\ba_\bi_\bn_\be_\br_\bW_\br_\ba_\bp_\bp_\be_\br_\bI_\bt_\be_\br_\ba_\bt_\bo_\br(CW containerWrapper, int position) :\n+1016 containerWrapper_(containerWrapper),\n+1017 position_(position)\n+1018 {}\n+1019\n+1020 template\n+_\b1_\b0_\b2_\b1 _\bC_\bo_\bn_\bt_\ba_\bi_\bn_\be_\br_\bW_\br_\ba_\bp_\bp_\be_\br_\bI_\bt_\be_\br_\ba_\bt_\bo_\br(OtherContainerWrapperIteratorType& other) :\n+1022 containerWrapper_(other.containerWrapper_),\n+1023 position_(other.position_)\n+1024 {}\n+1025\n+_\b1_\b0_\b2_\b6 _\bC_\bo_\bn_\bt_\ba_\bi_\bn_\be_\br_\bW_\br_\ba_\bp_\bp_\be_\br_\bI_\bt_\be_\br_\ba_\bt_\bo_\br(const _\bM_\by_\bT_\by_\bp_\be& other) :\n+1027 containerWrapper_(other.containerWrapper_),\n+1028 position_(other.position_)\n+1029 {}\n+1030\n+_\b1_\b0_\b3_\b1 _\bC_\bo_\bn_\bt_\ba_\bi_\bn_\be_\br_\bW_\br_\ba_\bp_\bp_\be_\br_\bI_\bt_\be_\br_\ba_\bt_\bo_\br(const _\bM_\by_\bC_\bo_\bn_\bs_\bt_\bT_\by_\bp_\be& other) :\n+1032 containerWrapper_(other.containerWrapper_),\n+1033 position_(other.position_)\n+1034 {}\n+1035\n+1036 template\n+_\b1_\b0_\b3_\b7 _\bC_\bo_\bn_\bt_\ba_\bi_\bn_\be_\br_\bW_\br_\ba_\bp_\bp_\be_\br_\bI_\bt_\be_\br_\ba_\bt_\bo_\br& _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b=(OtherContainerWrapperIteratorType&\n+other)\n+1038 {\n+1039 containerWrapper_ = other.containerWrapper_;\n+1040 position_ = other.position_;\n+1041 return *this;\n+1042 }\n+1043\n+1044 // This operator is needed since we can not get the address of the\n+1045 // temporary object returned by dereference\n+_\b1_\b0_\b4_\b6 T* _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b-_\b>() const\n+1047 {\n+1048 return containerWrapper_.pointer(position_);\n+1049 }\n+1050\n+1051 // Methods needed by the forward iterator\n+_\b1_\b0_\b5_\b2 bool _\be_\bq_\bu_\ba_\bl_\bs(const _\bM_\by_\bT_\by_\bp_\be& other) const\n+1053 {\n+1054 return position_ == other.position_ && containerWrapper_.identical\n+(other.containerWrapper_);\n+1055 }\n+1056\n+_\b1_\b0_\b5_\b7 bool _\be_\bq_\bu_\ba_\bl_\bs(const _\bM_\by_\bC_\bo_\bn_\bs_\bt_\bT_\by_\bp_\be& other) const\n+1058 {\n+1059 return position_ == other.position_ && containerWrapper_.identical\n+(other.containerWrapper_);\n+1060 }\n+1061\n+_\b1_\b0_\b6_\b2 R _\bd_\be_\br_\be_\bf_\be_\br_\be_\bn_\bc_\be() const\n+1063 {\n+1064 return *containerWrapper_.pointer(position_);\n+1065 }\n+1066\n+_\b1_\b0_\b6_\b7 void _\bi_\bn_\bc_\br_\be_\bm_\be_\bn_\bt()\n+1068 {\n+1069 ++position_;\n+1070 }\n+1071\n+1072 // Additional function needed by BidirectionalIterator\n+_\b1_\b0_\b7_\b3 void _\bd_\be_\bc_\br_\be_\bm_\be_\bn_\bt()\n+1074 {\n+1075 --position_;\n+1076 }\n+1077\n+1078 // Additional function needed by RandomAccessIterator\n+_\b1_\b0_\b7_\b9 R _\be_\bl_\be_\bm_\be_\bn_\bt_\bA_\bt(int i) const\n+1080 {\n+1081 return *containerWrapper_.pointer(position_+i);\n+1082 }\n+1083\n+_\b1_\b0_\b8_\b4 void _\ba_\bd_\bv_\ba_\bn_\bc_\be(int n)\n+1085 {\n+1086 position_=position_+n;\n+1087 }\n+1088\n+1089 template\n+_\b1_\b0_\b9_\b0 std::ptrdiff_t _\bd_\bi_\bs_\bt_\ba_\bn_\bc_\be_\bT_\bo(OtherContainerWrapperIteratorType& other) const\n+1091 {\n+1092 assert(containerWrapper_.identical(other));\n+1093 return other.position_ - position_;\n+1094 }\n+1095\n+_\b1_\b0_\b9_\b6 std::ptrdiff_t _\bi_\bn_\bd_\be_\bx() const\n+1097 {\n+1098 return containerWrapper_.realIndex(position_);\n+1099 }\n+1100\n+1101 private:\n+1102 NonConstCW containerWrapper_;\n+1103 size_t position_;\n+1104 };\n+1105\n+1106 template \n+_\b1_\b1_\b0_\b7 struct _\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\bA_\bs_\bs_\bi_\bg_\bn_\be_\br<_\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx, _\bD_\bi_\ba_\bg_\bo_\bn_\ba_\bl_\bM_\ba_\bt_\br_\bi_\bx> {\n+_\b1_\b1_\b0_\b8 static void _\ba_\bp_\bp_\bl_\by(_\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx& denseMatrix,\n+1109 _\bD_\bi_\ba_\bg_\bo_\bn_\ba_\bl_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bf_\bi_\be_\bl_\bd_\b,_\b _\bN_\b> const& rhs) {\n+1110 _\bD_\bU_\bN_\bE_\b__\bA_\bS_\bS_\bE_\bR_\bT_\b__\bB_\bO_\bU_\bN_\bD_\bS(denseMatrix._\bM() == N);\n+1111 _\bD_\bU_\bN_\bE_\b__\bA_\bS_\bS_\bE_\bR_\bT_\b__\bB_\bO_\bU_\bN_\bD_\bS(denseMatrix._\bN() == N);\n+1112 denseMatrix = field(0);\n+1113 for (int i = 0; i < N; ++i)\n+1114 denseMatrix[i][i] = rhs._\bd_\bi_\ba_\bg_\bo_\bn_\ba_\bl()[i];\n+1115 }\n+1116 };\n+1117 /* @} */\n+1118} // end namespace\n+1119#endif\n+_\bd_\be_\bn_\bs_\be_\bm_\ba_\bt_\br_\bi_\bx_\b._\bh_\bh\n+Implements a matrix constructed from a given type representing a field and a\n+compile-time given numbe...\n+_\bt_\by_\bp_\be_\bt_\br_\ba_\bi_\bt_\bs_\b._\bh_\bh\n+Traits for type conversions and type information.\n+_\bb_\bo_\bu_\bn_\bd_\bs_\bc_\bh_\be_\bc_\bk_\bi_\bn_\bg_\b._\bh_\bh\n+Macro for wrapping boundary checks.\n+_\bg_\be_\bn_\be_\br_\bi_\bc_\bi_\bt_\be_\br_\ba_\bt_\bo_\br_\b._\bh_\bh\n+Implements a generic iterator class for writing stl conformant iterators.\n+_\bf_\bm_\ba_\bt_\br_\bi_\bx_\b._\bh_\bh\n+Implements a matrix constructed from a given type representing a field and\n+compile-time given number ...\n _\be_\bx_\bc_\be_\bp_\bt_\bi_\bo_\bn_\bs_\b._\bh_\bh\n A few common exception classes.\n+_\bf_\bv_\be_\bc_\bt_\bo_\br_\b._\bh_\bh\n+Implements a vector constructed from a given type representing a field and a\n+compile-time given size.\n+_\bD_\bU_\bN_\bE_\b__\bA_\bS_\bS_\bE_\bR_\bT_\b__\bB_\bO_\bU_\bN_\bD_\bS\n+#define DUNE_ASSERT_BOUNDS(cond)\n+If DUNE_CHECK_BOUNDS is defined: check if condition cond holds; otherwise, do\n+nothing.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn boundschecking.hh:30\n+_\bD_\bu_\bn_\be_\b:_\b:_\bD_\bi_\ba_\bg_\bo_\bn_\ba_\bl_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bb_\be_\bf_\bo_\br_\be_\bB_\be_\bg_\bi_\bn\n+ConstIterator beforeBegin() const\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn diagonalmatrix.hh:208\n+_\bD_\bu_\bn_\be_\b:_\b:_\bD_\bi_\ba_\bg_\bo_\bn_\ba_\bl_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bt_\br_\ba_\bn_\bs_\bp_\bo_\bs_\be_\bd\n+DiagonalMatrix< K, n > transposed() const\n+Return transposed of the matrix as DiagonalMatrix.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn diagonalmatrix.hh:136\n+_\bD_\bu_\bn_\be_\b:_\b:_\bD_\bi_\ba_\bg_\bo_\bn_\ba_\bl_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bm_\bm_\bh_\bv\n+void mmhv(const X &x, Y &y) const\n+y -= A^H x\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn diagonalmatrix.hh:357\n+_\bD_\bu_\bn_\be_\b:_\b:_\bD_\bi_\ba_\bg_\bo_\bn_\ba_\bl_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b*_\b=\n+DiagonalMatrix & operator*=(const K &k)\n+vector space multiplication with scalar\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn diagonalmatrix.hh:246\n+_\bD_\bu_\bn_\be_\b:_\b:_\bF_\bi_\be_\bl_\bd_\bT_\br_\ba_\bi_\bt_\bs_\b<_\b _\bD_\bi_\ba_\bg_\bo_\bn_\ba_\bl_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bK_\b,_\b _\bn_\b _\b>_\b _\b>_\b:_\b:_\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be\n+FieldTraits< K >::field_type field_type\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn diagonalmatrix.hh:563\n+_\bD_\bu_\bn_\be_\b:_\b:_\bD_\bi_\ba_\bg_\bo_\bn_\ba_\bl_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be\n+std::size_t size_type\n+The type used for the index access and size operations.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn diagonalmatrix.hh:67\n+_\bD_\bu_\bn_\be_\b:_\b:_\bD_\bi_\ba_\bg_\bo_\bn_\ba_\bl_\bR_\bo_\bw_\bV_\be_\bc_\bt_\bo_\br_\bC_\bo_\bn_\bs_\bt_\b:_\b:_\bd_\bi_\bm\n+size_type dim() const\n+dimension of the vector space\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn diagonalmatrix.hh:800\n+_\bD_\bu_\bn_\be_\b:_\b:_\bD_\bi_\ba_\bg_\bo_\bn_\ba_\bl_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bC_\bo_\bn_\bs_\bt_\bR_\bo_\bw_\bI_\bt_\be_\br_\ba_\bt_\bo_\br\n+ConstIterator ConstRowIterator\n+rename the iterators for easier access\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn diagonalmatrix.hh:183\n+_\bD_\bu_\bn_\be_\b:_\b:_\bD_\bi_\ba_\bg_\bo_\bn_\ba_\bl_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\br_\bo_\bw_\b__\br_\be_\bf_\be_\br_\be_\bn_\bc_\be\n+row_type row_reference\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn diagonalmatrix.hh:75\n+_\bD_\bu_\bn_\be_\b:_\b:_\bD_\bi_\ba_\bg_\bo_\bn_\ba_\bl_\bR_\bo_\bw_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b[_\b]\n+K & operator[](size_type i)\n+random access\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn diagonalmatrix.hh:879\n+_\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bn_\bt_\ba_\bi_\bn_\be_\br_\bW_\br_\ba_\bp_\bp_\be_\br_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b=\n+ContainerWrapperIterator & operator=(OtherContainerWrapperIteratorType &other)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn diagonalmatrix.hh:1037\n+_\bD_\bu_\bn_\be_\b:_\b:_\bD_\bi_\ba_\bg_\bo_\bn_\ba_\bl_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\br_\bo_\bw_\bs\n+static constexpr int rows\n+The number of rows.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn diagonalmatrix.hh:81\n+_\bD_\bu_\bn_\be_\b:_\b:_\bD_\bi_\ba_\bg_\bo_\bn_\ba_\bl_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bM\n+static constexpr size_type M()\n+number of blocks in column direction\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn diagonalmatrix.hh:488\n+_\bD_\bu_\bn_\be_\b:_\b:_\bD_\bi_\ba_\bg_\bo_\bn_\ba_\bl_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bd_\bi_\ba_\bg_\bo_\bn_\ba_\bl\n+FieldVector< K, n > & diagonal()\n+Get reference to diagonal vector.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn diagonalmatrix.hh:549\n+_\bD_\bu_\bn_\be_\b:_\b:_\bD_\bi_\ba_\bg_\bo_\bn_\ba_\bl_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bu_\bs_\bm_\bh_\bv\n+void usmhv(const typename FieldTraits< Y >::field_type &alpha, const X &x, Y\n+&y) const\n+y += alpha A^H x\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn diagonalmatrix.hh:395\n+_\bD_\bu_\bn_\be_\b:_\b:_\bD_\bi_\ba_\bg_\bo_\bn_\ba_\bl_\bR_\bo_\bw_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\bi_\bt_\be_\br_\ba_\bt_\bo_\br\n+Iterator iterator\n+typedef for stl compliant access\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn diagonalmatrix.hh:888\n+_\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bn_\bt_\ba_\bi_\bn_\be_\br_\bW_\br_\ba_\bp_\bp_\be_\br_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\bi_\bn_\bc_\br_\be_\bm_\be_\bn_\bt\n+void increment()\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn diagonalmatrix.hh:1067\n+_\bD_\bu_\bn_\be_\b:_\b:_\bD_\bi_\ba_\bg_\bo_\bn_\ba_\bl_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bb_\bl_\bo_\bc_\bk_\bl_\be_\bv_\be_\bl\n+static constexpr int blocklevel\n+The number of block levels we contain. This is the leaf, that is, 1.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn diagonalmatrix.hh:70\n+_\bD_\bu_\bn_\be_\b:_\b:_\bc_\bo_\bn_\bs_\bt_\b__\br_\be_\bf_\be_\br_\be_\bn_\bc_\be_\b<_\b _\bD_\bi_\ba_\bg_\bo_\bn_\ba_\bl_\bR_\bo_\bw_\bV_\be_\bc_\bt_\bo_\br_\bC_\bo_\bn_\bs_\bt_\b<_\b _\bK_\b,_\b _\bn_\b _\b>_\b _\b>_\b:_\b:_\bt_\by_\bp_\be\n+DiagonalRowVectorConst< K, n > type\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn diagonalmatrix.hh:957\n+_\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bn_\bt_\ba_\bi_\bn_\be_\br_\bW_\br_\ba_\bp_\bp_\be_\br_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b-_\b>\n+T * operator->() const\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn diagonalmatrix.hh:1046\n+_\bD_\bu_\bn_\be_\b:_\b:_\bD_\bi_\ba_\bg_\bo_\bn_\ba_\bl_\bR_\bo_\bw_\bV_\be_\bc_\bt_\bo_\br_\bC_\bo_\bn_\bs_\bt_\b:_\b:_\bs_\bi_\bz_\be\n+static constexpr int size\n+The size of this vector.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn diagonalmatrix.hh:724\n+_\bD_\bu_\bn_\be_\b:_\b:_\bD_\bi_\ba_\bg_\bo_\bn_\ba_\bl_\bR_\bo_\bw_\bV_\be_\bc_\bt_\bo_\br_\bC_\bo_\bn_\bs_\bt_\b:_\b:_\bp_\bo_\bi_\bn_\bt_\be_\br\n+K * pointer(size_type i) const\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn diagonalmatrix.hh:824\n+_\bD_\bu_\bn_\be_\b:_\b:_\bD_\bi_\ba_\bg_\bo_\bn_\ba_\bl_\bR_\bo_\bw_\bV_\be_\bc_\bt_\bo_\br_\bC_\bo_\bn_\bs_\bt_\b:_\b:_\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be\n+K field_type\n+export the type representing the field\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn diagonalmatrix.hh:712\n+_\bD_\bu_\bn_\be_\b:_\b:_\bm_\bu_\bt_\ba_\bb_\bl_\be_\b__\br_\be_\bf_\be_\br_\be_\bn_\bc_\be_\b<_\b _\bD_\bi_\ba_\bg_\bo_\bn_\ba_\bl_\bR_\bo_\bw_\bV_\be_\bc_\bt_\bo_\br_\b<_\b _\bK_\b,_\b _\bn_\b _\b>_\b _\b>_\b:_\b:_\bt_\by_\bp_\be\n+DiagonalRowVector< K, n > type\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn diagonalmatrix.hh:963\n+_\bD_\bu_\bn_\be_\b:_\b:_\bD_\bi_\ba_\bg_\bo_\bn_\ba_\bl_\bR_\bo_\bw_\bV_\be_\bc_\bt_\bo_\br_\bC_\bo_\bn_\bs_\bt_\b:_\b:_\bb_\be_\bf_\bo_\br_\be_\bE_\bn_\bd\n+ConstIterator beforeEnd() const\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn diagonalmatrix.hh:773\n+_\bD_\bu_\bn_\be_\b:_\b:_\bD_\bi_\ba_\bg_\bo_\bn_\ba_\bl_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bC_\bo_\bn_\bs_\bt_\bC_\bo_\bl_\bI_\bt_\be_\br_\ba_\bt_\bo_\br\n+const_row_type::ConstIterator ConstColIterator\n+rename the iterators for easier access\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn diagonalmatrix.hh:185\n+_\bD_\bu_\bn_\be_\b:_\b:_\bD_\bi_\ba_\bg_\bo_\bn_\ba_\bl_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\be_\bx_\bi_\bs_\bt_\bs\n+bool exists(size_type i, size_type j) const\n+return true when (i,j) is in pattern\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn diagonalmatrix.hh:498\n+_\bD_\bu_\bn_\be_\b:_\b:_\bD_\bi_\ba_\bg_\bo_\bn_\ba_\bl_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bC_\bo_\bn_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br\n+ContainerWrapperIterator< const WrapperType, const_reference, const_reference >\n+ConstIterator\n+Iterator class for sequential access.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn diagonalmatrix.hh:179\n+_\bD_\bu_\bn_\be_\b:_\b:_\bD_\bi_\ba_\bg_\bo_\bn_\ba_\bl_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bc_\bo_\bn_\bs_\bt_\b__\br_\bo_\bw_\b__\br_\be_\bf_\be_\br_\be_\bn_\bc_\be\n+const_row_type const_row_reference\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn diagonalmatrix.hh:78\n+_\bD_\bu_\bn_\be_\b:_\b:_\bD_\bi_\ba_\bg_\bo_\bn_\ba_\bl_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bs_\bi_\bz_\be\n+static constexpr size_type size()\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn diagonalmatrix.hh:87\n+_\bD_\bu_\bn_\be_\b:_\b:_\bD_\bi_\ba_\bg_\bo_\bn_\ba_\bl_\bR_\bo_\bw_\bV_\be_\bc_\bt_\bo_\br_\bC_\bo_\bn_\bs_\bt_\b:_\b:_\br_\bo_\bw_\b_\n+size_type row_\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn diagonalmatrix.hh:836\n+_\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bn_\bt_\ba_\bi_\bn_\be_\br_\bW_\br_\ba_\bp_\bp_\be_\br_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\bC_\bo_\bn_\bt_\ba_\bi_\bn_\be_\br_\bW_\br_\ba_\bp_\bp_\be_\br_\bI_\bt_\be_\br_\ba_\bt_\bo_\br\n+ContainerWrapperIterator(CW containerWrapper, int position)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn diagonalmatrix.hh:1015\n+_\bD_\bu_\bn_\be_\b:_\b:_\bD_\bi_\ba_\bg_\bo_\bn_\ba_\bl_\bR_\bo_\bw_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\bD_\bi_\ba_\bg_\bo_\bn_\ba_\bl_\bR_\bo_\bw_\bV_\be_\bc_\bt_\bo_\br\n+DiagonalRowVector(K *p, int col)\n+Constructor making vector with identical coordinates.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn diagonalmatrix.hh:865\n+_\bD_\bu_\bn_\be_\b:_\b:_\bD_\bi_\ba_\bg_\bo_\bn_\ba_\bl_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bd_\bi_\ba_\bg_\bo_\bn_\ba_\bl\n+K & diagonal(size_type i)\n+Get reference to diagonal entry.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn diagonalmatrix.hh:537\n+_\bD_\bu_\bn_\be_\b:_\b:_\bD_\bi_\ba_\bg_\bo_\bn_\ba_\bl_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bs_\bo_\bl_\bv_\be\n+void solve(V &x, const V &b) const\n+Solve system A x = b.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn diagonalmatrix.hh:438\n+_\bD_\bu_\bn_\be_\b:_\b:_\bD_\bi_\ba_\bg_\bo_\bn_\ba_\bl_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bN\n+static constexpr size_type N()\n+number of blocks in row direction\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn diagonalmatrix.hh:482\n+_\bD_\bu_\bn_\be_\b:_\b:_\bD_\bi_\ba_\bg_\bo_\bn_\ba_\bl_\bR_\bo_\bw_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\bb_\be_\bf_\bo_\br_\be_\bB_\be_\bg_\bi_\bn\n+Iterator beforeBegin()\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn diagonalmatrix.hh:911\n+_\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bn_\bt_\ba_\bi_\bn_\be_\br_\bW_\br_\ba_\bp_\bp_\be_\br_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\bC_\bo_\bn_\bt_\ba_\bi_\bn_\be_\br_\bW_\br_\ba_\bp_\bp_\be_\br_\bI_\bt_\be_\br_\ba_\bt_\bo_\br\n+ContainerWrapperIterator(OtherContainerWrapperIteratorType &other)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn diagonalmatrix.hh:1021\n+_\bD_\bu_\bn_\be_\b:_\b:_\bD_\bi_\ba_\bg_\bo_\bn_\ba_\bl_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b[_\b]\n+const_reference operator[](size_type i) const\n+Return const_reference object as row replacement.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn diagonalmatrix.hh:525\n+_\bD_\bu_\bn_\be_\b:_\b:_\bD_\bi_\ba_\bg_\bo_\bn_\ba_\bl_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bi_\bt_\be_\br_\ba_\bt_\bo_\br\n+Iterator iterator\n+typedef for stl compliant access\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn diagonalmatrix.hh:145\n+_\bD_\bu_\bn_\be_\b:_\b:_\bD_\bi_\ba_\bg_\bo_\bn_\ba_\bl_\bR_\bo_\bw_\bV_\be_\bc_\bt_\bo_\br_\bC_\bo_\bn_\bs_\bt_\b:_\b:_\bb_\be_\bg_\bi_\bn\n+ConstIterator begin() const\n+begin ConstIterator\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn diagonalmatrix.hh:760\n+_\bD_\bu_\bn_\be_\b:_\b:_\bD_\bi_\ba_\bg_\bo_\bn_\ba_\bl_\bR_\bo_\bw_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\bc_\bo_\bn_\bs_\bt_\b__\bi_\bt_\be_\br_\ba_\bt_\bo_\br\n+ConstIterator const_iterator\n+typedef for stl compliant access\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn diagonalmatrix.hh:919\n+_\bD_\bu_\bn_\be_\b:_\b:_\bD_\bi_\ba_\bg_\bo_\bn_\ba_\bl_\bR_\bo_\bw_\bV_\be_\bc_\bt_\bo_\br_\bC_\bo_\bn_\bs_\bt_\b:_\b:_\bi_\bd_\be_\bn_\bt_\bi_\bc_\ba_\bl\n+bool identical(const DiagonalRowVectorConst< K, n > &other) const\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn diagonalmatrix.hh:749\n+_\bD_\bu_\bn_\be_\b:_\b:_\bD_\bi_\ba_\bg_\bo_\bn_\ba_\bl_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b-_\b=\n+DiagonalMatrix & operator-=(const DiagonalMatrix &y)\n+vector space subtraction\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn diagonalmatrix.hh:225\n+_\bD_\bu_\bn_\be_\b:_\b:_\bD_\bi_\ba_\bg_\bo_\bn_\ba_\bl_\bR_\bo_\bw_\bV_\be_\bc_\bt_\bo_\br_\bC_\bo_\bn_\bs_\bt_\b:_\b:_\bD_\bi_\ba_\bg_\bo_\bn_\ba_\bl_\bR_\bo_\bw_\bV_\be_\bc_\bt_\bo_\br_\bC_\bo_\bn_\bs_\bt\n+DiagonalRowVectorConst(K *p, int col)\n+Constructor making vector with identical coordinates.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn diagonalmatrix.hh:733\n+_\bD_\bu_\bn_\be_\b:_\b:_\bD_\bi_\ba_\bg_\bo_\bn_\ba_\bl_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bm_\bm_\bt_\bv\n+void mmtv(const X &x, Y &y) const\n+y -= A^T x\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn diagonalmatrix.hh:345\n+_\bD_\bu_\bn_\be_\b:_\b:_\bD_\bi_\ba_\bg_\bo_\bn_\ba_\bl_\bR_\bo_\bw_\bV_\be_\bc_\bt_\bo_\br_\bC_\bo_\bn_\bs_\bt_\b:_\b:_\bb_\bl_\bo_\bc_\bk_\bl_\be_\bv_\be_\bl\n+static constexpr int blocklevel\n+The number of block levels we contain.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn diagonalmatrix.hh:721\n+_\bD_\bu_\bn_\be_\b:_\b:_\bD_\bi_\ba_\bg_\bo_\bn_\ba_\bl_\bM_\ba_\bt_\br_\bi_\bx_\bW_\br_\ba_\bp_\bp_\be_\br_\b:_\b:_\bp_\bo_\bi_\bn_\bt_\be_\br\n+row_type * pointer(int i) const\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn diagonalmatrix.hh:676\n+_\bD_\bu_\bn_\be_\b:_\b:_\bD_\bi_\ba_\bg_\bo_\bn_\ba_\bl_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bD_\bi_\ba_\bg_\bo_\bn_\ba_\bl_\bM_\ba_\bt_\br_\bi_\bx\n+DiagonalMatrix(const K &k)\n+Constructor initializing the whole matrix with a scalar.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn diagonalmatrix.hh:98\n+_\bD_\bu_\bn_\be_\b:_\b:_\bD_\bi_\ba_\bg_\bo_\bn_\ba_\bl_\bR_\bo_\bw_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\bI_\bt_\be_\br_\ba_\bt_\bo_\br\n+ContainerWrapperIterator< DiagonalRowVector< K, n >, K, K & > Iterator\n+Iterator class for sequential access.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn diagonalmatrix.hh:886\n+_\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bn_\bt_\ba_\bi_\bn_\be_\br_\bW_\br_\ba_\bp_\bp_\be_\br_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\be_\bl_\be_\bm_\be_\bn_\bt_\bA_\bt\n+R elementAt(int i) const\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn diagonalmatrix.hh:1079\n+_\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bn_\bt_\ba_\bi_\bn_\be_\br_\bW_\br_\ba_\bp_\bp_\be_\br_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\bd_\bi_\bs_\bt_\ba_\bn_\bc_\be_\bT_\bo\n+std::ptrdiff_t distanceTo(OtherContainerWrapperIteratorType &other) const\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn diagonalmatrix.hh:1090\n+_\bD_\bu_\bn_\be_\b:_\b:_\bD_\bi_\ba_\bg_\bo_\bn_\ba_\bl_\bR_\bo_\bw_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\bb_\be_\bf_\bo_\br_\be_\bE_\bn_\bd\n+Iterator beforeEnd()\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn diagonalmatrix.hh:904\n+_\bD_\bu_\bn_\be_\b:_\b:_\bD_\bi_\ba_\bg_\bo_\bn_\ba_\bl_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bu_\bm_\bt_\bv\n+void umtv(const X &x, Y &y) const\n+y += A^T x\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn diagonalmatrix.hh:309\n+_\bD_\bu_\bn_\be_\b:_\b:_\bD_\bi_\ba_\bg_\bo_\bn_\ba_\bl_\bR_\bo_\bw_\bV_\be_\bc_\bt_\bo_\br_\bC_\bo_\bn_\bs_\bt_\b:_\b:_\bc_\bo_\bn_\bs_\bt_\b__\bi_\bt_\be_\br_\ba_\bt_\bo_\br\n+ConstIterator const_iterator\n+typedef for stl compliant access\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn diagonalmatrix.hh:757\n+_\bD_\bu_\bn_\be_\b:_\b:_\bD_\bi_\ba_\bg_\bo_\bn_\ba_\bl_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bi_\bn_\bf_\bi_\bn_\bi_\bt_\by_\b__\bn_\bo_\br_\bm_\b__\br_\be_\ba_\bl\n+double infinity_norm_real() const\n+simplified infinity norm (uses Manhattan norm for complex values)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn diagonalmatrix.hh:427\n+_\bD_\bu_\bn_\be_\b:_\b:_\bD_\bi_\ba_\bg_\bo_\bn_\ba_\bl_\bM_\ba_\bt_\br_\bi_\bx_\bW_\br_\ba_\bp_\bp_\be_\br_\b:_\b:_\bD_\bi_\ba_\bg_\bo_\bn_\ba_\bl_\bM_\ba_\bt_\br_\bi_\bx_\bW_\br_\ba_\bp_\bp_\be_\br\n+DiagonalMatrixWrapper(const DiagonalMatrixType *mat)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn diagonalmatrix.hh:667\n+_\bD_\bu_\bn_\be_\b:_\b:_\bD_\bi_\ba_\bg_\bo_\bn_\ba_\bl_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bu_\bm_\bv\n+void umv(const X &x, Y &y) const\n+y += A x\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn diagonalmatrix.hh:297\n+_\bD_\bu_\bn_\be_\b:_\b:_\bD_\bi_\ba_\bg_\bo_\bn_\ba_\bl_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bI_\bt_\be_\br_\ba_\bt_\bo_\br\n+ContainerWrapperIterator< const WrapperType, reference, reference > Iterator\n+Iterator class for sequential access.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn diagonalmatrix.hh:143\n+_\bD_\bu_\bn_\be_\b:_\b:_\bm_\bu_\bt_\ba_\bb_\bl_\be_\b__\br_\be_\bf_\be_\br_\be_\bn_\bc_\be_\b<_\b _\bD_\bi_\ba_\bg_\bo_\bn_\ba_\bl_\bR_\bo_\bw_\bV_\be_\bc_\bt_\bo_\br_\bC_\bo_\bn_\bs_\bt_\b<_\b _\bK_\b,_\b _\bn_\b _\b>_\b _\b>_\b:_\b:_\bt_\by_\bp_\be\n+DiagonalRowVector< K, n > type\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn diagonalmatrix.hh:969\n+_\bD_\bu_\bn_\be_\b:_\b:_\bD_\bi_\ba_\bg_\bo_\bn_\ba_\bl_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bm_\bv\n+void mv(const X &x, Y &y) const\n+y = A x\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn diagonalmatrix.hh:278\n+_\bD_\bu_\bn_\be_\b:_\b:_\bD_\bi_\ba_\bg_\bo_\bn_\ba_\bl_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bf_\br_\bo_\bb_\be_\bn_\bi_\bu_\bs_\b__\bn_\bo_\br_\bm\n+double frobenius_norm() const\n+frobenius norm: sqrt(sum over squared values of entries)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn diagonalmatrix.hh:409\n+_\bD_\bu_\bn_\be_\b:_\b:_\bD_\bi_\ba_\bg_\bo_\bn_\ba_\bl_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\be_\bn_\bd\n+ConstIterator end() const\n+end iterator\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn diagonalmatrix.hh:194\n+_\bD_\bu_\bn_\be_\b:_\b:_\bD_\bi_\ba_\bg_\bo_\bn_\ba_\bl_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bc_\bo_\bl_\bs\n+static constexpr int cols\n+The number of columns.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn diagonalmatrix.hh:83\n+_\bD_\bu_\bn_\be_\b:_\b:_\bD_\bi_\ba_\bg_\bo_\bn_\ba_\bl_\bR_\bo_\bw_\bV_\be_\bc_\bt_\bo_\br_\bC_\bo_\bn_\bs_\bt_\b:_\b:_\bd_\bi_\bm_\be_\bn_\bs_\bi_\bo_\bn\n+static constexpr int dimension\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn diagonalmatrix.hh:705\n+_\bD_\bu_\bn_\be_\b:_\b:_\bD_\bi_\ba_\bg_\bo_\bn_\ba_\bl_\bR_\bo_\bw_\bV_\be_\bc_\bt_\bo_\br_\bC_\bo_\bn_\bs_\bt_\b:_\b:_\bp_\b_\n+K * p_\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn diagonalmatrix.hh:835\n+_\bD_\bu_\bn_\be_\b:_\b:_\bD_\bi_\ba_\bg_\bo_\bn_\ba_\bl_\bR_\bo_\bw_\bV_\be_\bc_\bt_\bo_\br_\bC_\bo_\bn_\bs_\bt_\b:_\b:_\br_\bo_\bw_\bI_\bn_\bd_\be_\bx\n+size_type rowIndex() const\n+index of this row in surrounding matrix\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn diagonalmatrix.hh:806\n+_\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bn_\bt_\ba_\bi_\bn_\be_\br_\bW_\br_\ba_\bp_\bp_\be_\br_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\bd_\be_\br_\be_\bf_\be_\br_\be_\bn_\bc_\be\n+R dereference() const\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn diagonalmatrix.hh:1062\n+_\bD_\bu_\bn_\be_\b:_\b:_\bD_\bi_\ba_\bg_\bo_\bn_\ba_\bl_\bR_\bo_\bw_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b=\n+DiagonalRowVector & operator=(const K &k)\n+Assignment operator for scalar.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn diagonalmatrix.hh:870\n+_\bD_\bu_\bn_\be_\b:_\b:_\bD_\bi_\ba_\bg_\bo_\bn_\ba_\bl_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b!_\b=\n+bool operator!=(const DiagonalMatrix &other) const\n+incomparison operator\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn diagonalmatrix.hh:268\n+_\bD_\bu_\bn_\be_\b:_\b:_\bD_\bi_\ba_\bg_\bo_\bn_\ba_\bl_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be\n+value_type field_type\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn diagonalmatrix.hh:61\n+_\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bn_\bt_\ba_\bi_\bn_\be_\br_\bW_\br_\ba_\bp_\bp_\be_\br_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\ba_\bd_\bv_\ba_\bn_\bc_\be\n+void advance(int n)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn diagonalmatrix.hh:1084\n+_\bD_\bu_\bn_\be_\b:_\b:_\bD_\bi_\ba_\bg_\bo_\bn_\ba_\bl_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bb_\be_\bg_\bi_\bn\n+ConstIterator begin() const\n+begin iterator\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn diagonalmatrix.hh:188\n+_\bD_\bu_\bn_\be_\b:_\b:_\bD_\bi_\ba_\bg_\bo_\bn_\ba_\bl_\bR_\bo_\bw_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\bb_\be_\bg_\bi_\bn\n+Iterator begin()\n+begin iterator\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn diagonalmatrix.hh:891\n+_\bD_\bu_\bn_\be_\b:_\b:_\bD_\bi_\ba_\bg_\bo_\bn_\ba_\bl_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bm_\bm_\bv\n+void mmv(const X &x, Y &y) const\n+y -= A x\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn diagonalmatrix.hh:333\n+_\bD_\bu_\bn_\be_\b:_\b:_\bD_\bi_\ba_\bg_\bo_\bn_\ba_\bl_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b/_\b=\n+DiagonalMatrix & operator/=(const K &k)\n+vector space division by scalar\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn diagonalmatrix.hh:253\n+_\bD_\bu_\bn_\be_\b:_\b:_\bD_\bi_\ba_\bg_\bo_\bn_\ba_\bl_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bc_\bo_\bn_\bs_\bt_\b__\bi_\bt_\be_\br_\ba_\bt_\bo_\br\n+ConstIterator const_iterator\n+typedef for stl compliant access\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn diagonalmatrix.hh:181\n+_\bD_\bu_\bn_\be_\b:_\b:_\bD_\bi_\ba_\bg_\bo_\bn_\ba_\bl_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bc_\bo_\bn_\bs_\bt_\b__\br_\be_\bf_\be_\br_\be_\bn_\bc_\be\n+const_row_type const_reference\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn diagonalmatrix.hh:77\n+_\bD_\bu_\bn_\be_\b:_\b:_\bD_\bi_\ba_\bg_\bo_\bn_\ba_\bl_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bi_\bd_\be_\bn_\bt_\bi_\bc_\ba_\bl\n+bool identical(const DiagonalMatrix< K, n > &other) const\n+Check if matrix is the same object as the other matrix.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn diagonalmatrix.hh:130\n+_\bD_\bu_\bn_\be_\b:_\b:_\bD_\bi_\ba_\bg_\bo_\bn_\ba_\bl_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b*\n+friend auto operator*(const DiagonalMatrix &matrixA, const DiagonalMatrix<\n+OtherScalar, n > &matrixB)\n+Matrix-matrix multiplication.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn diagonalmatrix.hh:468\n+_\bD_\bu_\bn_\be_\b:_\b:_\bD_\bi_\ba_\bg_\bo_\bn_\ba_\bl_\bM_\ba_\bt_\br_\bi_\bx_\bW_\br_\ba_\bp_\bp_\be_\br_\b:_\b:_\br_\be_\ba_\bl_\bI_\bn_\bd_\be_\bx\n+size_type realIndex(int i) const\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn diagonalmatrix.hh:671\n+_\bD_\bu_\bn_\be_\b:_\b:_\bD_\bi_\ba_\bg_\bo_\bn_\ba_\bl_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\be_\bn_\bd\n+Iterator end()\n+end iterator\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn diagonalmatrix.hh:158\n+_\bD_\bu_\bn_\be_\b:_\b:_\bD_\bi_\ba_\bg_\bo_\bn_\ba_\bl_\bR_\bo_\bw_\bV_\be_\bc_\bt_\bo_\br_\bC_\bo_\bn_\bs_\bt_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b[_\b]\n+const K & operator[](size_type i) const\n+same for read only access\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn diagonalmatrix.hh:741\n+_\bD_\bu_\bn_\be_\b:_\b:_\bD_\bi_\ba_\bg_\bo_\bn_\ba_\bl_\bR_\bo_\bw_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\bD_\bi_\ba_\bg_\bo_\bn_\ba_\bl_\bR_\bo_\bw_\bV_\be_\bc_\bt_\bo_\br\n+DiagonalRowVector()\n+Constructor making uninitialized vector.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn diagonalmatrix.hh:861\n+_\bD_\bu_\bn_\be_\b:_\b:_\bD_\bi_\ba_\bg_\bo_\bn_\ba_\bl_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\br_\be_\bf_\be_\br_\be_\bn_\bc_\be\n+row_type reference\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn diagonalmatrix.hh:74\n+_\bD_\bu_\bn_\be_\b:_\b:_\bD_\bi_\ba_\bg_\bo_\bn_\ba_\bl_\bR_\bo_\bw_\bV_\be_\bc_\bt_\bo_\br_\bC_\bo_\bn_\bs_\bt_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b&\n+DiagonalRowVectorConst * operator&()\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn diagonalmatrix.hh:829\n+_\bD_\bu_\bn_\be_\b:_\b:_\bD_\bi_\ba_\bg_\bo_\bn_\ba_\bl_\bR_\bo_\bw_\bV_\be_\bc_\bt_\bo_\br_\bC_\bo_\bn_\bs_\bt_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b=_\b=\n+bool operator==(const DiagonalRowVectorConst &y) const\n+Binary vector comparison.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn diagonalmatrix.hh:786\n+_\bD_\bu_\bn_\be_\b:_\b:_\bD_\bi_\ba_\bg_\bo_\bn_\ba_\bl_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bf_\br_\bo_\bb_\be_\bn_\bi_\bu_\bs_\b__\bn_\bo_\br_\bm_\b2\n+double frobenius_norm2() const\n+square of frobenius norm, need for block recursion\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn diagonalmatrix.hh:415\n+_\bD_\bu_\bn_\be_\b:_\b:_\bD_\bi_\ba_\bg_\bo_\bn_\ba_\bl_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bD_\bi_\ba_\bg_\bo_\bn_\ba_\bl_\bM_\ba_\bt_\br_\bi_\bx\n+constexpr DiagonalMatrix()=default\n+Default constructor.\n+_\bD_\bu_\bn_\be_\b:_\b:_\bD_\bi_\ba_\bg_\bo_\bn_\ba_\bl_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bm_\bt_\bv\n+void mtv(const X &x, Y &y) const\n+y = A^T x\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn diagonalmatrix.hh:290\n+_\bD_\bu_\bn_\be_\b:_\b:_\bD_\bi_\ba_\bg_\bo_\bn_\ba_\bl_\bR_\bo_\bw_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\bC_\bo_\bn_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br\n+ContainerWrapperIterator< DiagonalRowVectorConst< K, n >, const K, const K & >\n+ConstIterator\n+ConstIterator class for sequential access.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn diagonalmatrix.hh:917\n+_\bD_\bu_\bn_\be_\b:_\b:_\bD_\bi_\ba_\bg_\bo_\bn_\ba_\bl_\bM_\ba_\bt_\br_\bi_\bx_\bW_\br_\ba_\bp_\bp_\be_\br_\b:_\b:_\bi_\bd_\be_\bn_\bt_\bi_\bc_\ba_\bl\n+bool identical(const DiagonalMatrixWrapper &other) const\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn diagonalmatrix.hh:682\n+_\bD_\bu_\bn_\be_\b:_\b:_\bD_\bi_\ba_\bg_\bo_\bn_\ba_\bl_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bu_\bs_\bm_\bt_\bv\n+void usmtv(const typename FieldTraits< Y >::field_type &alpha, const X &x, Y\n+&y) const\n+y += alpha A^T x\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn diagonalmatrix.hh:382\n+_\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bn_\bt_\ba_\bi_\bn_\be_\br_\bW_\br_\ba_\bp_\bp_\be_\br_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\bd_\be_\bc_\br_\be_\bm_\be_\bn_\bt\n+void decrement()\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn diagonalmatrix.hh:1073\n+_\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bn_\bt_\ba_\bi_\bn_\be_\br_\bW_\br_\ba_\bp_\bp_\be_\br_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\bi_\bn_\bd_\be_\bx\n+std::ptrdiff_t index() const\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn diagonalmatrix.hh:1096\n+_\bD_\bu_\bn_\be_\b:_\b:_\bD_\bi_\ba_\bg_\bo_\bn_\ba_\bl_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bd_\bi_\ba_\bg_\bo_\bn_\ba_\bl\n+const FieldVector< K, n > & diagonal() const\n+Get const reference to diagonal vector.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn diagonalmatrix.hh:543\n+_\bD_\bu_\bn_\be_\b:_\b:_\bD_\bi_\ba_\bg_\bo_\bn_\ba_\bl_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bi_\bn_\bv_\be_\br_\bt\n+void invert()\n+Compute inverse.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn diagonalmatrix.hh:445\n+_\bD_\bu_\bn_\be_\b:_\b:_\bD_\bi_\ba_\bg_\bo_\bn_\ba_\bl_\bR_\bo_\bw_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b&\n+DiagonalRowVector * operator&()\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn diagonalmatrix.hh:935\n+_\bD_\bu_\bn_\be_\b:_\b:_\bD_\bi_\ba_\bg_\bo_\bn_\ba_\bl_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bd_\bi_\ba_\bg_\bo_\bn_\ba_\bl\n+const K & diagonal(size_type i) const\n+Get const reference to diagonal entry.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn diagonalmatrix.hh:531\n+_\bD_\bu_\bn_\be_\b:_\b:_\bD_\bi_\ba_\bg_\bo_\bn_\ba_\bl_\bR_\bo_\bw_\bV_\be_\bc_\bt_\bo_\br_\bC_\bo_\bn_\bs_\bt_\b:_\b:_\bN\n+size_type N() const\n+number of blocks in the vector (are of size 1 here)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn diagonalmatrix.hh:794\n+_\bD_\bu_\bn_\be_\b:_\b:_\bD_\bi_\ba_\bg_\bo_\bn_\ba_\bl_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bD_\bi_\ba_\bg_\bo_\bn_\ba_\bl_\bM_\ba_\bt_\br_\bi_\bx\n+DiagonalMatrix(std::initializer_list< K > const &l)\n+Construct diagonal matrix from an initializer list.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn diagonalmatrix.hh:115\n+_\bD_\bu_\bn_\be_\b:_\b:_\bD_\bi_\ba_\bg_\bo_\bn_\ba_\bl_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bC_\bo_\bl_\bI_\bt_\be_\br_\ba_\bt_\bo_\br\n+row_type::Iterator ColIterator\n+rename the iterators for easier access\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn diagonalmatrix.hh:149\n+_\bD_\bu_\bn_\be_\b:_\b:_\bD_\bi_\ba_\bg_\bo_\bn_\ba_\bl_\bR_\bo_\bw_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be\n+K field_type\n+export the type representing the field\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn diagonalmatrix.hh:852\n+_\bD_\bu_\bn_\be_\b:_\b:_\bD_\bi_\ba_\bg_\bo_\bn_\ba_\bl_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b[_\b]\n+reference operator[](size_type i)\n+Return reference object as row replacement.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn diagonalmatrix.hh:519\n+_\bD_\bu_\bn_\be_\b:_\b:_\bc_\bo_\bn_\bs_\bt_\b__\br_\be_\bf_\be_\br_\be_\bn_\bc_\be_\b<_\b _\bD_\bi_\ba_\bg_\bo_\bn_\ba_\bl_\bR_\bo_\bw_\bV_\be_\bc_\bt_\bo_\br_\b<_\b _\bK_\b,_\b _\bn_\b _\b>_\b _\b>_\b:_\b:_\bt_\by_\bp_\be\n+DiagonalRowVectorConst< K, n > type\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn diagonalmatrix.hh:951\n+_\bD_\bu_\bn_\be_\b:_\b:_\bD_\bi_\ba_\bg_\bo_\bn_\ba_\bl_\bR_\bo_\bw_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\be_\bn_\bd\n+Iterator end()\n+end iterator\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn diagonalmatrix.hh:897\n+_\bD_\bu_\bn_\be_\b:_\b:_\bD_\bi_\ba_\bg_\bo_\bn_\ba_\bl_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bD_\bi_\ba_\bg_\bo_\bn_\ba_\bl_\bM_\ba_\bt_\br_\bi_\bx\n+DiagonalMatrix(const FieldVector< K, n > &diag)\n+Constructor initializing the diagonal with a vector.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn diagonalmatrix.hh:103\n+_\bD_\bu_\bn_\be_\b:_\b:_\bD_\bi_\ba_\bg_\bo_\bn_\ba_\bl_\bR_\bo_\bw_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be\n+std::size_t size_type\n+The type used for the index access and size operation.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn diagonalmatrix.hh:858\n+_\bD_\bu_\bn_\be_\b:_\b:_\bD_\bi_\ba_\bg_\bo_\bn_\ba_\bl_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bu_\bs_\bm_\bv\n+void usmv(const typename FieldTraits< Y >::field_type &alpha, const X &x, Y &y)\n+const\n+y += alpha A x\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn diagonalmatrix.hh:369\n+_\bD_\bu_\bn_\be_\b:_\b:_\bD_\bi_\ba_\bg_\bo_\bn_\ba_\bl_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bi_\bn_\bf_\bi_\bn_\bi_\bt_\by_\b__\bn_\bo_\br_\bm\n+double infinity_norm() const\n+infinity norm (row sum norm, how to generalize for blocks?)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn diagonalmatrix.hh:421\n+_\bD_\bu_\bn_\be_\b:_\b:_\bD_\bi_\ba_\bg_\bo_\bn_\ba_\bl_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b+_\b=\n+DiagonalMatrix & operator+=(const DiagonalMatrix &y)\n+vector space addition\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn diagonalmatrix.hh:218\n+_\bD_\bu_\bn_\be_\b:_\b:_\bD_\bi_\ba_\bg_\bo_\bn_\ba_\bl_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bb_\bl_\bo_\bc_\bk_\b__\bt_\by_\bp_\be\n+K block_type\n+export the type representing the components\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn diagonalmatrix.hh:64\n+_\bD_\bu_\bn_\be_\b:_\b:_\bD_\bi_\ba_\bg_\bo_\bn_\ba_\bl_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bu_\bm_\bh_\bv\n+void umhv(const X &x, Y &y) const\n+y += A^H x\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn diagonalmatrix.hh:321\n+_\bD_\bu_\bn_\be_\b:_\b:_\bD_\bi_\ba_\bg_\bo_\bn_\ba_\bl_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bb_\be_\bf_\bo_\br_\be_\bB_\be_\bg_\bi_\bn\n+Iterator beforeBegin()\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn diagonalmatrix.hh:172\n+_\bD_\bu_\bn_\be_\b:_\b:_\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\bA_\bs_\bs_\bi_\bg_\bn_\be_\br_\b<_\b _\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\b,_\b _\bD_\bi_\ba_\bg_\bo_\bn_\ba_\bl_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bf_\bi_\be_\bl_\bd_\b,_\b _\bN_\b _\b>_\b _\b>_\b:_\b:_\ba_\bp_\bp_\bl_\by\n+static void apply(DenseMatrix &denseMatrix, DiagonalMatrix< field, N > const\n+&rhs)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn diagonalmatrix.hh:1108\n+_\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bn_\bt_\ba_\bi_\bn_\be_\br_\bW_\br_\ba_\bp_\bp_\be_\br_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\bC_\bo_\bn_\bt_\ba_\bi_\bn_\be_\br_\bW_\br_\ba_\bp_\bp_\be_\br_\bI_\bt_\be_\br_\ba_\bt_\bo_\br\n+ContainerWrapperIterator(const MyType &other)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn diagonalmatrix.hh:1026\n+_\bD_\bu_\bn_\be_\b:_\b:_\bD_\bi_\ba_\bg_\bo_\bn_\ba_\bl_\bR_\bo_\bw_\bV_\be_\bc_\bt_\bo_\br_\bC_\bo_\bn_\bs_\bt_\b:_\b:_\be_\bn_\bd\n+ConstIterator end() const\n+end ConstIterator\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn diagonalmatrix.hh:766\n+_\bD_\bu_\bn_\be_\b:_\b:_\bD_\bi_\ba_\bg_\bo_\bn_\ba_\bl_\bR_\bo_\bw_\bV_\be_\bc_\bt_\bo_\br_\bC_\bo_\bn_\bs_\bt_\b:_\b:_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be\n+std::size_t size_type\n+The type used for the index access and size operation.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn diagonalmatrix.hh:718\n+_\bD_\bu_\bn_\be_\b:_\b:_\bD_\bi_\ba_\bg_\bo_\bn_\ba_\bl_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b=\n+DiagonalMatrix & operator=(const K &k)\n+Assignment from a scalar.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn diagonalmatrix.hh:123\n+_\bD_\bu_\bn_\be_\b:_\b:_\bD_\bi_\ba_\bg_\bo_\bn_\ba_\bl_\bR_\bo_\bw_\bV_\be_\bc_\bt_\bo_\br_\bC_\bo_\bn_\bs_\bt_\b:_\b:_\bD_\bi_\ba_\bg_\bo_\bn_\ba_\bl_\bR_\bo_\bw_\bV_\be_\bc_\bt_\bo_\br_\bC_\bo_\bn_\bs_\bt\n+DiagonalRowVectorConst()\n+Constructor making uninitialized vector.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn diagonalmatrix.hh:727\n+_\bD_\bu_\bn_\be_\b:_\b:_\bD_\bi_\ba_\bg_\bo_\bn_\ba_\bl_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bb_\be_\bf_\bo_\br_\be_\bE_\bn_\bd\n+Iterator beforeEnd()\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn diagonalmatrix.hh:165\n+_\bD_\bu_\bn_\be_\b:_\b:_\bD_\bi_\ba_\bg_\bo_\bn_\ba_\bl_\bR_\bo_\bw_\bV_\be_\bc_\bt_\bo_\br_\bC_\bo_\bn_\bs_\bt_\b:_\b:_\br_\be_\ba_\bl_\bI_\bn_\bd_\be_\bx\n+size_type realIndex(int i) const\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn diagonalmatrix.hh:819\n+_\bD_\bu_\bn_\be_\b:_\b:_\bD_\bi_\ba_\bg_\bo_\bn_\ba_\bl_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b<_\b<\n+friend std::ostream & operator<<(std::ostream &s, const DiagonalMatrix< K, n >\n+&a)\n+Sends the matrix to an output stream.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn diagonalmatrix.hh:508\n+_\bD_\bu_\bn_\be_\b:_\b:_\bD_\bi_\ba_\bg_\bo_\bn_\ba_\bl_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bv_\ba_\bl_\bu_\be_\b__\bt_\by_\bp_\be\n+K value_type\n+export the type representing the field\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn diagonalmatrix.hh:60\n+_\bD_\bu_\bn_\be_\b:_\b:_\bD_\bi_\ba_\bg_\bo_\bn_\ba_\bl_\bR_\bo_\bw_\bV_\be_\bc_\bt_\bo_\br_\bC_\bo_\bn_\bs_\bt_\b:_\b:_\bb_\bl_\bo_\bc_\bk_\b__\bt_\by_\bp_\be\n+K block_type\n+export the type representing the components\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn diagonalmatrix.hh:715\n+_\bD_\bu_\bn_\be_\b:_\b:_\bD_\bi_\ba_\bg_\bo_\bn_\ba_\bl_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bd_\be_\bt_\be_\br_\bm_\bi_\bn_\ba_\bn_\bt\n+K determinant() const\n+calculates the determinant of this matrix\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn diagonalmatrix.hh:453\n+_\bD_\bu_\bn_\be_\b:_\b:_\bF_\bi_\be_\bl_\bd_\bT_\br_\ba_\bi_\bt_\bs_\b<_\b _\bD_\bi_\ba_\bg_\bo_\bn_\ba_\bl_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bK_\b,_\b _\bn_\b _\b>_\b _\b>_\b:_\b:_\br_\be_\ba_\bl_\b__\bt_\by_\bp_\be\n+FieldTraits< K >::real_type real_type\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn diagonalmatrix.hh:564\n+_\bD_\bu_\bn_\be_\b:_\b:_\bD_\bi_\ba_\bg_\bo_\bn_\ba_\bl_\bR_\bo_\bw_\bV_\be_\bc_\bt_\bo_\br_\bC_\bo_\bn_\bs_\bt_\b:_\b:_\bb_\be_\bf_\bo_\br_\be_\bB_\be_\bg_\bi_\bn\n+ConstIterator beforeBegin() const\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn diagonalmatrix.hh:780\n+_\bD_\bu_\bn_\be_\b:_\b:_\bD_\bi_\ba_\bg_\bo_\bn_\ba_\bl_\bM_\ba_\bt_\br_\bi_\bx_\bW_\br_\ba_\bp_\bp_\be_\br_\b:_\b:_\bD_\bi_\ba_\bg_\bo_\bn_\ba_\bl_\bM_\ba_\bt_\br_\bi_\bx_\bW_\br_\ba_\bp_\bp_\be_\br\n+DiagonalMatrixWrapper()\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn diagonalmatrix.hh:663\n+_\bD_\bu_\bn_\be_\b:_\b:_\bD_\bi_\ba_\bg_\bo_\bn_\ba_\bl_\bR_\bo_\bw_\bV_\be_\bc_\bt_\bo_\br_\bC_\bo_\bn_\bs_\bt_\b:_\b:_\bC_\bo_\bn_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br\n+ContainerWrapperIterator< DiagonalRowVectorConst< K, n >, const K, const K & >\n+ConstIterator\n+ConstIterator class for sequential access.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn diagonalmatrix.hh:755\n+_\bD_\bu_\bn_\be_\b:_\b:_\bD_\bi_\ba_\bg_\bo_\bn_\ba_\bl_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bb_\be_\bg_\bi_\bn\n+Iterator begin()\n+begin iterator\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn diagonalmatrix.hh:152\n+_\bD_\bu_\bn_\be_\b:_\b:_\bD_\bi_\ba_\bg_\bo_\bn_\ba_\bl_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b=_\b=\n+bool operator==(const DiagonalMatrix &other) const\n+comparison operator\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn diagonalmatrix.hh:262\n+_\bD_\bu_\bn_\be_\b:_\b:_\bD_\bi_\ba_\bg_\bo_\bn_\ba_\bl_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bc_\bo_\bn_\bs_\bt_\b__\br_\bo_\bw_\b__\bt_\by_\bp_\be\n+DiagonalRowVectorConst< K, n > const_row_type\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn diagonalmatrix.hh:76\n+_\bD_\bu_\bn_\be_\b:_\b:_\bD_\bi_\ba_\bg_\bo_\bn_\ba_\bl_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\br_\bo_\bw_\b__\bt_\by_\bp_\be\n+DiagonalRowVector< K, n > row_type\n+Each row is implemented by a field vector.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn diagonalmatrix.hh:73\n+_\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bn_\bt_\ba_\bi_\bn_\be_\br_\bW_\br_\ba_\bp_\bp_\be_\br_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\be_\bq_\bu_\ba_\bl_\bs\n+bool equals(const MyType &other) const\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn diagonalmatrix.hh:1052\n+_\bD_\bu_\bn_\be_\b:_\b:_\bD_\bi_\ba_\bg_\bo_\bn_\ba_\bl_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bR_\bo_\bw_\bI_\bt_\be_\br_\ba_\bt_\bo_\br\n+Iterator RowIterator\n+rename the iterators for easier access\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn diagonalmatrix.hh:147\n+_\bD_\bu_\bn_\be_\b:_\b:_\bD_\bi_\ba_\bg_\bo_\bn_\ba_\bl_\bR_\bo_\bw_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\bb_\bl_\bo_\bc_\bk_\b__\bt_\by_\bp_\be\n+K block_type\n+export the type representing the components\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn diagonalmatrix.hh:855\n+_\bD_\bu_\bn_\be_\b:_\b:_\bD_\bi_\ba_\bg_\bo_\bn_\ba_\bl_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bb_\be_\bf_\bo_\br_\be_\bE_\bn_\bd\n+ConstIterator beforeEnd() const\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn diagonalmatrix.hh:201\n+_\bD_\bu_\bn_\be_\b:_\b:_\bD_\bi_\ba_\bg_\bo_\bn_\ba_\bl_\bR_\bo_\bw_\bV_\be_\bc_\bt_\bo_\br_\bC_\bo_\bn_\bs_\bt_\b:_\b:_\bd_\bi_\ba_\bg_\bo_\bn_\ba_\bl\n+const K & diagonal() const\n+the diagonal value\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn diagonalmatrix.hh:812\n _\bD_\bU_\bN_\bE_\b__\bT_\bH_\bR_\bO_\bW\n #define DUNE_THROW(E, m)\n D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn exceptions.hh:218\n _\bD_\bu_\bn_\be\n Dune namespace.\n D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn alignedallocator.hh:13\n-_\bD_\bu_\bn_\be_\b:_\b:_\bR_\ba_\bn_\bg_\be_\bE_\br_\br_\bo_\br\n-Default exception class for range errors.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn exceptions.hh:254\n-_\bD_\bu_\bn_\be_\b:_\b:_\bl_\br_\bu\n-LRU Cache Container.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn lru.hh:52\n-_\bD_\bu_\bn_\be_\b:_\b:_\bl_\br_\bu_\b:_\b:_\bp_\bo_\bp_\b__\bb_\ba_\bc_\bk\n-void pop_back()\n-Removes the last element.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn lru.hh:119\n-_\bD_\bu_\bn_\be_\b:_\b:_\bl_\br_\bu_\b:_\b:_\bf_\bi_\bn_\bd\n-iterator find(const key_type &key)\n-Finds the element whose key is k.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn lru.hh:131\n-_\bD_\bu_\bn_\be_\b:_\b:_\bl_\br_\bu_\b:_\b:_\bi_\bn_\bs_\be_\br_\bt\n-reference insert(const key_type &key)\n-mark data associated with key as most recent\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn lru.hh:175\n-_\bD_\bu_\bn_\be_\b:_\b:_\bl_\br_\bu_\b:_\b:_\bc_\bo_\bn_\bs_\bt_\b__\bi_\bt_\be_\br_\ba_\bt_\bo_\br\n-list_type::const_iterator const_iterator\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn lru.hh:68\n-_\bD_\bu_\bn_\be_\b:_\b:_\bl_\br_\bu_\b:_\b:_\br_\be_\bs_\bi_\bz_\be\n-void resize(size_type new_size)\n-ensure a maximum size of the container\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn lru.hh:213\n-_\bD_\bu_\bn_\be_\b:_\b:_\bl_\br_\bu_\b:_\b:_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be\n-allocator::size_type size_type\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn lru.hh:66\n-_\bD_\bu_\bn_\be_\b:_\b:_\bl_\br_\bu_\b:_\b:_\bi_\bt_\be_\br_\ba_\bt_\bo_\br\n-list_type::iterator iterator\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn lru.hh:67\n-_\bD_\bu_\bn_\be_\b:_\b:_\bl_\br_\bu_\b:_\b:_\bv_\ba_\bl_\bu_\be_\b__\bt_\by_\bp_\be\n-allocator::value_type value_type\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn lru.hh:61\n-_\bD_\bu_\bn_\be_\b:_\b:_\bl_\br_\bu_\b:_\b:_\bf_\br_\bo_\bn_\bt\n-const_reference front() const\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn lru.hh:83\n-_\bD_\bu_\bn_\be_\b:_\b:_\bl_\br_\bu_\b:_\b:_\bc_\bo_\bn_\bs_\bt_\b__\bp_\bo_\bi_\bn_\bt_\be_\br\n-typename allocator::value_type const * const_pointer\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn lru.hh:63\n-_\bD_\bu_\bn_\be_\b:_\b:_\bl_\br_\bu_\b:_\b:_\bs_\bi_\bz_\be\n-size_type size() const\n-Retrieve number of entries in the container.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn lru.hh:202\n-_\bD_\bu_\bn_\be_\b:_\b:_\bl_\br_\bu_\b:_\b:_\br_\be_\bf_\be_\br_\be_\bn_\bc_\be\n-typename allocator::value_type & reference\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn lru.hh:65\n-_\bD_\bu_\bn_\be_\b:_\b:_\bl_\br_\bu_\b:_\b:_\bb_\ba_\bc_\bk\n-reference back()\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn lru.hh:92\n-_\bD_\bu_\bn_\be_\b:_\b:_\bl_\br_\bu_\b:_\b:_\bp_\bo_\bp_\b__\bf_\br_\bo_\bn_\bt\n-void pop_front()\n-Removes the first element.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn lru.hh:110\n-_\bD_\bu_\bn_\be_\b:_\b:_\bl_\br_\bu_\b:_\b:_\bf_\br_\bo_\bn_\bt\n-reference front()\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn lru.hh:74\n-_\bD_\bu_\bn_\be_\b:_\b:_\bl_\br_\bu_\b:_\b:_\bc_\bl_\be_\ba_\br\n-void clear()\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn lru.hh:224\n-_\bD_\bu_\bn_\be_\b:_\b:_\bl_\br_\bu_\b:_\b:_\bt_\bo_\bu_\bc_\bh\n-reference touch(const key_type &key)\n-mark data associated with key as most recent\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn lru.hh:185\n-_\bD_\bu_\bn_\be_\b:_\b:_\bl_\br_\bu_\b:_\b:_\bi_\bn_\bs_\be_\br_\bt\n-reference insert(const key_type &key, const_reference data)\n-Insert a value into the container.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn lru.hh:161\n-_\bD_\bu_\bn_\be_\b:_\b:_\bl_\br_\bu_\b:_\b:_\bp_\bo_\bi_\bn_\bt_\be_\br\n-typename allocator::value_type * pointer\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn lru.hh:62\n-_\bD_\bu_\bn_\be_\b:_\b:_\bl_\br_\bu_\b:_\b:_\bf_\bi_\bn_\bd\n-const_iterator find(const key_type &key) const\n-Finds the element whose key is k.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn lru.hh:143\n-_\bD_\bu_\bn_\be_\b:_\b:_\bl_\br_\bu_\b:_\b:_\bc_\bo_\bn_\bs_\bt_\b__\br_\be_\bf_\be_\br_\be_\bn_\bc_\be\n-typename allocator::value_type const & const_reference\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn lru.hh:64\n-_\bD_\bu_\bn_\be_\b:_\b:_\bl_\br_\bu_\b:_\b:_\bk_\be_\by_\b__\bt_\by_\bp_\be\n-Traits::key_type key_type\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn lru.hh:60\n-_\bD_\bu_\bn_\be_\b:_\b:_\bl_\br_\bu_\b:_\b:_\bb_\ba_\bc_\bk\n-const_reference back(int i) const\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn lru.hh:101\n+_\bD_\bu_\bn_\be_\b:_\b:_\bc_\bo_\bn_\bj_\bu_\bg_\ba_\bt_\be_\bC_\bo_\bm_\bp_\bl_\be_\bx\n+K conjugateComplex(const K &x)\n+compute conjugate complex of x\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn math.hh:164\n+_\bD_\bu_\bn_\be_\b:_\b:_\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx\n+A dense n x m matrix.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn densematrix.hh:140\n+_\bD_\bu_\bn_\be_\b:_\b:_\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bM\n+constexpr size_type M() const\n+number of columns\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn densematrix.hh:703\n+_\bD_\bu_\bn_\be_\b:_\b:_\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bN\n+constexpr size_type N() const\n+number of rows\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn densematrix.hh:697\n+_\bD_\bu_\bn_\be_\b:_\b:_\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx\n+A dense n x m matrix.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn fmatrix.hh:117\n+_\bD_\bu_\bn_\be_\b:_\b:_\bF_\bi_\be_\bl_\bd_\bV_\be_\bc_\bt_\bo_\br\n+vector space out of a tensor product of fields.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn fvector.hh:91\n+_\bD_\bu_\bn_\be_\b:_\b:_\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\bA_\bs_\bs_\bi_\bg_\bn_\be_\br\n+you have to specialize this structure for any type that should be assignable to\n+a DenseMatrix\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn densematrix.hh:59\n+_\bD_\bu_\bn_\be_\b:_\b:_\bF_\bM_\ba_\bt_\br_\bi_\bx_\bE_\br_\br_\bo_\br\n+Error thrown if operations of a FieldMatrix fail.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn densematrix.hh:126\n+_\bD_\bu_\bn_\be_\b:_\b:_\bD_\be_\bn_\bs_\be_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\bt_\bw_\bo_\b__\bn_\bo_\br_\bm_\b2\n+FieldTraits< value_type >::real_type two_norm2() const\n+square of two norm (sum over squared values of entries), need for block\n+recursion\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn densevector.hh:650\n+_\bD_\bu_\bn_\be_\b:_\b:_\bD_\be_\bn_\bs_\be_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\bt_\bw_\bo_\b__\bn_\bo_\br_\bm\n+FieldTraits< value_type >::real_type two_norm() const\n+two norm sqrt(sum over squared values of entries)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn densevector.hh:641\n+_\bD_\bu_\bn_\be_\b:_\b:_\bD_\be_\bn_\bs_\be_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\bb_\be_\bg_\bi_\bn\n+Iterator begin()\n+begin iterator\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn densevector.hh:347\n+_\bD_\bu_\bn_\be_\b:_\b:_\bD_\be_\bn_\bs_\be_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\bi_\bn_\bf_\bi_\bn_\bi_\bt_\by_\b__\bn_\bo_\br_\bm\n+FieldTraits< vt >::real_type infinity_norm() const\n+infinity norm (maximum of absolute values of entries)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn densevector.hh:661\n+_\bD_\bu_\bn_\be_\b:_\b:_\bD_\be_\bn_\bs_\be_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\bi_\bn_\bf_\bi_\bn_\bi_\bt_\by_\b__\bn_\bo_\br_\bm_\b__\br_\be_\ba_\bl\n+FieldTraits< vt >::real_type infinity_norm_real() const\n+simplified infinity norm (uses Manhattan norm for complex values)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn densevector.hh:677\n+_\bD_\bu_\bn_\be_\b:_\b:_\bD_\bi_\ba_\bg_\bo_\bn_\ba_\bl_\bR_\bo_\bw_\bV_\be_\bc_\bt_\bo_\br_\bC_\bo_\bn_\bs_\bt\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn diagonalmatrix.hh:698\n+_\bD_\bu_\bn_\be_\b:_\b:_\bD_\bi_\ba_\bg_\bo_\bn_\ba_\bl_\bR_\bo_\bw_\bV_\be_\bc_\bt_\bo_\br\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn diagonalmatrix.hh:841\n+_\bD_\bu_\bn_\be_\b:_\b:_\bD_\bi_\ba_\bg_\bo_\bn_\ba_\bl_\bM_\ba_\bt_\br_\bi_\bx_\bW_\br_\ba_\bp_\bp_\be_\br\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn diagonalmatrix.hh:650\n+_\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bn_\bt_\ba_\bi_\bn_\be_\br_\bW_\br_\ba_\bp_\bp_\be_\br_\bI_\bt_\be_\br_\ba_\bt_\bo_\br\n+Iterator class for sparse vector-like containers.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn diagonalmatrix.hh:998\n+_\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bn_\bt_\ba_\bi_\bn_\be_\br_\bW_\br_\ba_\bp_\bp_\be_\br_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\bC_\bo_\bn_\bt_\ba_\bi_\bn_\be_\br_\bW_\br_\ba_\bp_\bp_\be_\br_\bI_\bt_\be_\br_\ba_\bt_\bo_\br\n+ContainerWrapperIterator(const MyConstType &other)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn diagonalmatrix.hh:1031\n+_\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bn_\bt_\ba_\bi_\bn_\be_\br_\bW_\br_\ba_\bp_\bp_\be_\br_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\be_\bq_\bu_\ba_\bl_\bs\n+bool equals(const MyConstType &other) const\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn diagonalmatrix.hh:1057\n+_\bD_\bu_\bn_\be_\b:_\b:_\bD_\bi_\ba_\bg_\bo_\bn_\ba_\bl_\bM_\ba_\bt_\br_\bi_\bx\n+A diagonal matrix of static size.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn diagonalmatrix.hh:53\n+_\bD_\bu_\bn_\be_\b:_\b:_\bF_\bi_\be_\bl_\bd_\bT_\br_\ba_\bi_\bt_\bs\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn ftraits.hh:26\n+_\bD_\bu_\bn_\be_\b:_\b:_\bF_\bi_\be_\bl_\bd_\bT_\br_\ba_\bi_\bt_\bs_\b:_\b:_\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be\n+T field_type\n+export the type representing the field\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn ftraits.hh:28\n+_\bD_\bu_\bn_\be_\b:_\b:_\bF_\bi_\be_\bl_\bd_\bT_\br_\ba_\bi_\bt_\bs_\b:_\b:_\br_\be_\ba_\bl_\b__\bt_\by_\bp_\be\n+T real_type\n+export the type representing the real type of the field\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn ftraits.hh:30\n+_\bD_\bu_\bn_\be_\b:_\b:_\bc_\bo_\bn_\bs_\bt_\b__\br_\be_\bf_\be_\br_\be_\bn_\bc_\be\n+Get the 'const' version of a reference to a mutable object.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn genericiterator.hh:87\n+_\bD_\bu_\bn_\be_\b:_\b:_\bm_\bu_\bt_\ba_\bb_\bl_\be_\b__\br_\be_\bf_\be_\br_\be_\bn_\bc_\be\n+get the 'mutable' version of a reference to a const object\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn genericiterator.hh:116\n+_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bi_\bd_\bi_\br_\be_\bc_\bt_\bi_\bo_\bn_\ba_\bl_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bF_\ba_\bc_\ba_\bd_\be\n+Facade class for stl conformant bidirectional iterators.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn iteratorfacades.hh:275\n ===============================================================================\n Generated by\u00a0_\b[_\bd_\bo_\bx_\by_\bg_\be_\bn_\b] 1.9.8\n"}]}, {"source1": "./usr/share/doc/libdune-common-doc/doxygen/a00122.html", "source2": "./usr/share/doc/libdune-common-doc/doxygen/a00122.html", "unified_diff": "@@ -1,15 +1,15 @@\n \n \n \n \n \n \n \n-dune-common: memory.hh File Reference\n+dune-common: interfaces.hh File Reference\n \n \n \n \n \n \n \n@@ -65,46 +65,45 @@\n
    \n
    \n
    \n
    \n \n \n \n
    \n \n-
    memory.hh File Reference
    \n+Classes |\n+Namespaces
    \n+
    interfaces.hh File Reference
    \n \n
    \n-
    #include <memory>
    \n-#include <type_traits>
    \n-#include <dune/common/typeutilities.hh>
    \n-
    \n+\n+

    Provides interfaces for detection of specific behavior. \n+More...

    \n+\n

    Go to the source code of this file.

    \n \n+\n+\n+\n+\n+

    \n+Classes

    struct  Dune::Cloneable
     An interface class for cloneable objects. More...
     
    \n \n \n \n \n-\n-\n-\n-

    \n Namespaces

    namespace  Dune
     Dune namespace.
     
    namespace  Dune::Std
     Namespace for features backported from new C++ standards.
     
    \n-\n-\n-\n-\n-\n

    \n-Functions

    template<class T >
    constexpr auto Dune::Std::to_address (T &&p) noexcept
     Obtain the address represented by p without forming a reference to the object pointed to by p.
     
    \n-
    \n+

    Detailed Description

    \n+

    Provides interfaces for detection of specific behavior.

    \n+
    Author
    Robert Kloefkorn
    \n+
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,28 +1,24 @@\n dune-common\u00a02.10\n Loading...\n Searching...\n No Matches\n * _\bd_\bu_\bn_\be\n * _\bc_\bo_\bm_\bm_\bo_\bn\n- * _\bs_\bt_\bd\n-_\bN_\ba_\bm_\be_\bs_\bp_\ba_\bc_\be_\bs | _\bF_\bu_\bn_\bc_\bt_\bi_\bo_\bn_\bs\n-memory.hh File Reference\n-#include \n-#include \n-#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bt_\by_\bp_\be_\bu_\bt_\bi_\bl_\bi_\bt_\bi_\be_\bs_\b._\bh_\bh>\n+_\bC_\bl_\ba_\bs_\bs_\be_\bs | _\bN_\ba_\bm_\be_\bs_\bp_\ba_\bc_\be_\bs\n+interfaces.hh File Reference\n+Provides interfaces for detection of specific behavior. _\bM_\bo_\br_\be_\b._\b._\b.\n _\bG_\bo_\b _\bt_\bo_\b _\bt_\bh_\be_\b _\bs_\bo_\bu_\br_\bc_\be_\b _\bc_\bo_\bd_\be_\b _\bo_\bf_\b _\bt_\bh_\bi_\bs_\b _\bf_\bi_\bl_\be_\b.\n+C\bCl\bla\bas\bss\bse\bes\bs\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bC_\bl_\bo_\bn_\be_\ba_\bb_\bl_\be\n+\u00a0 An interface class for cloneable objects. _\bM_\bo_\br_\be_\b._\b._\b.\n+\u00a0\n N\bNa\bam\bme\bes\bsp\bpa\bac\bce\bes\bs\n namespace \u00a0 _\bD_\bu_\bn_\be\n \u00a0 _\bD_\bu_\bn_\be namespace.\n \u00a0\n-namespace \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bS_\bt_\bd\n-\u00a0 Namespace for features backported from new C++ standards.\n-\u00a0\n-F\bFu\bun\bnc\bct\bti\bio\bon\bns\bs\n-template\n-constexpr auto\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bS_\bt_\bd_\b:_\b:_\bt_\bo_\b__\ba_\bd_\bd_\br_\be_\bs_\bs (T &&p) noexcept\n-\u00a0 Obtain the address represented by p without forming a reference\n- to the object pointed to by p.\n-\u00a0\n+*\b**\b**\b**\b**\b* D\bDe\bet\bta\bai\bil\ble\bed\bd D\bDe\bes\bsc\bcr\bri\bip\bpt\bti\bio\bon\bn *\b**\b**\b**\b**\b*\n+Provides interfaces for detection of specific behavior.\n+ Author\n+ Robert Kloefkorn\n ===============================================================================\n Generated by\u00a0_\b[_\bd_\bo_\bx_\by_\bg_\be_\bn_\b] 1.9.8\n"}]}, {"source1": "./usr/share/doc/libdune-common-doc/doxygen/a00122_source.html", "source2": "./usr/share/doc/libdune-common-doc/doxygen/a00122_source.html", "unified_diff": "@@ -1,15 +1,15 @@\n \n \n \n \n \n \n \n-dune-common: memory.hh Source File\n+dune-common: interfaces.hh Source File\n \n \n \n \n \n \n \n@@ -70,82 +70,46 @@\n \n \n \n \n \n \n \n
    \n-
    memory.hh
    \n+
    interfaces.hh
    \n
    \n
    \n Go to the documentation of this file.
    1// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
    \n
    2// vi: set et ts=4 sw=2 sts=2:
    \n
    3// SPDX-FileCopyrightInfo: Copyright \u00a9 DUNE Project contributors, see file LICENSE.md in module root
    \n
    4// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception
    \n-
    5#ifndef DUNE_COMMON_STD_MEMORY_HH
    \n-
    6#define DUNE_COMMON_STD_MEMORY_HH
    \n+
    5#ifndef DUNE_INTERFACES_HH
    \n+
    6#define DUNE_INTERFACES_HH
    \n
    7
    \n-
    8#include <memory>
    \n-
    9#include <type_traits>
    \n-
    10
    \n-\n-
    12
    \n-
    13namespace Dune::Std {
    \n+
    13namespace Dune {
    \n
    14
    \n-
    15#if __cpp_lib_to_address >= 201711L
    \n-
    16
    \n-
    17using std::to_address;
    \n-
    18
    \n-
    19#else
    \n-
    20
    \n-
    21namespace Impl {
    \n-
    22
    \n-
    23template <class T>
    \n-
    24constexpr T* toAddressImpl (T* p, Dune::PriorityTag<2>) noexcept
    \n-
    25{
    \n-
    26 static_assert(!std::is_function_v<T>);
    \n-
    27 return p;
    \n-
    28}
    \n+
    \n+
    16 struct Cloneable {
    \n+
    17
    \n+
    23 virtual Cloneable* clone() const = 0;
    \n+
    24
    \n+
    26 virtual ~Cloneable() = default;
    \n+
    27
    \n+
    28 };
    \n+
    \n
    29
    \n-
    30template <class T>
    \n-
    31constexpr auto toAddressImpl (const T& p, Dune::PriorityTag<1>) noexcept
    \n-
    32 -> decltype(std::pointer_traits<T>::to_address(p))
    \n-
    33{
    \n-
    34 return std::pointer_traits<T>::to_address(p);
    \n-
    35}
    \n-
    36
    \n-
    37template <class T>
    \n-
    38constexpr auto toAddressImpl (const T& p, Dune::PriorityTag<0>) noexcept
    \n-
    39{
    \n-
    40 return toAddressImpl(p.operator->(), Dune::PriorityTag<3>{});
    \n-
    41}
    \n-
    42
    \n-
    43} // end namespace Impl
    \n-
    44
    \n-
    46template <class T>
    \n-
    \n-
    47constexpr auto to_address(T&& p) noexcept
    \n-
    48{
    \n-
    49 return Impl::toAddressImpl(std::forward<T>(p), Dune::PriorityTag<3>{});
    \n-
    50}
    \n-
    \n-
    51
    \n-
    52#endif
    \n-
    53
    \n-
    54} // end namespace Dune::Std
    \n-
    55
    \n-
    56#endif // DUNE_COMMON_STD_MEMORY_HH
    \n-
    Utilities for type computations, constraining overloads, ...
    \n-
    Namespace for features backported from new C++ standards.
    Definition default_accessor.hh:10
    \n-
    constexpr auto to_address(T &&p) noexcept
    Obtain the address represented by p without forming a reference to the object pointed to by p.
    Definition memory.hh:47
    \n-
    Helper class for tagging priorities.
    Definition typeutilities.hh:73
    \n+
    30} // end namespace Dune
    \n+
    31#endif
    \n+
    Dune namespace.
    Definition alignedallocator.hh:13
    \n+
    An interface class for cloneable objects.
    Definition interfaces.hh:16
    \n+
    virtual ~Cloneable()=default
    Destructor.
    \n+
    virtual Cloneable * clone() const =0
    Clones the object clone needs to be redefined by an implementation class, with the return type covari...
    \n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,80 +1,43 @@\n dune-common\u00a02.10\n Loading...\n Searching...\n No Matches\n * _\bd_\bu_\bn_\be\n * _\bc_\bo_\bm_\bm_\bo_\bn\n- * _\bs_\bt_\bd\n-memory.hh\n+interfaces.hh\n _\bG_\bo_\b _\bt_\bo_\b _\bt_\bh_\be_\b _\bd_\bo_\bc_\bu_\bm_\be_\bn_\bt_\ba_\bt_\bi_\bo_\bn_\b _\bo_\bf_\b _\bt_\bh_\bi_\bs_\b _\bf_\bi_\bl_\be_\b.\n 1// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-\n 2// vi: set et ts=4 sw=2 sts=2:\n 3// SPDX-FileCopyrightInfo: Copyright \u00c2\u00a9 DUNE Project contributors, see file\n LICENSE.md in module root\n 4// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception\n-5#ifndef DUNE_COMMON_STD_MEMORY_HH\n-6#define DUNE_COMMON_STD_MEMORY_HH\n+5#ifndef DUNE_INTERFACES_HH\n+6#define DUNE_INTERFACES_HH\n 7\n-8#include \n-9#include \n-10\n-11#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bt_\by_\bp_\be_\bu_\bt_\bi_\bl_\bi_\bt_\bi_\be_\bs_\b._\bh_\bh>\n-12\n-13namespace _\bD_\bu_\bn_\be_\b:_\b:_\bS_\bt_\bd {\n+13namespace _\bD_\bu_\bn_\be {\n 14\n-15#if __cpp_lib_to_address >= 201711L\n-16\n-17using std::to_address;\n-18\n-19#else\n-20\n-21namespace Impl {\n-22\n-23template \n-24constexpr T* toAddressImpl (T* p, _\bD_\bu_\bn_\be_\b:_\b:_\bP_\br_\bi_\bo_\br_\bi_\bt_\by_\bT_\ba_\bg_\b<_\b2_\b>) noexcept\n-25{\n-26 static_assert(!std::is_function_v);\n-27 return p;\n-28}\n+_\b1_\b6 struct _\bC_\bl_\bo_\bn_\be_\ba_\bb_\bl_\be {\n+17\n+_\b2_\b3 virtual _\bC_\bl_\bo_\bn_\be_\ba_\bb_\bl_\be* _\bc_\bl_\bo_\bn_\be() const = 0;\n+24\n+_\b2_\b6 virtual _\b~_\bC_\bl_\bo_\bn_\be_\ba_\bb_\bl_\be() = default;\n+27\n+28 };\n 29\n-30template \n-31constexpr auto toAddressImpl (const T& p, _\bD_\bu_\bn_\be_\b:_\b:_\bP_\br_\bi_\bo_\br_\bi_\bt_\by_\bT_\ba_\bg_\b<_\b1_\b>) noexcept\n-32 -> decltype(std::pointer_traits::to_address(p))\n-33{\n-34 return std::pointer_traits::to_address(p);\n-35}\n-36\n-37template \n-38constexpr auto toAddressImpl (const T& p, _\bD_\bu_\bn_\be_\b:_\b:_\bP_\br_\bi_\bo_\br_\bi_\bt_\by_\bT_\ba_\bg_\b<_\b0_\b>) noexcept\n-39{\n-40 return toAddressImpl(p.operator->(), _\bD_\bu_\bn_\be_\b:_\b:_\bP_\br_\bi_\bo_\br_\bi_\bt_\by_\bT_\ba_\bg_\b<_\b3_\b>{});\n-41}\n-42\n-43} // end namespace Impl\n-44\n-46template \n-_\b4_\b7constexpr auto _\bt_\bo_\b__\ba_\bd_\bd_\br_\be_\bs_\bs(T&& p) noexcept\n-48{\n-49 return Impl::toAddressImpl(std::forward(p), _\bD_\bu_\bn_\be_\b:_\b:_\bP_\br_\bi_\bo_\br_\bi_\bt_\by_\bT_\ba_\bg_\b<_\b3_\b>{});\n-50}\n-51\n-52#endif\n-53\n-54} // end namespace Dune::Std\n-55\n-56#endif // DUNE_COMMON_STD_MEMORY_HH\n-_\bt_\by_\bp_\be_\bu_\bt_\bi_\bl_\bi_\bt_\bi_\be_\bs_\b._\bh_\bh\n-Utilities for type computations, constraining overloads, ...\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bt_\bd\n-Namespace for features backported from new C++ standards.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn default_accessor.hh:10\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bt_\bd_\b:_\b:_\bt_\bo_\b__\ba_\bd_\bd_\br_\be_\bs_\bs\n-constexpr auto to_address(T &&p) noexcept\n-Obtain the address represented by p without forming a reference to the object\n-pointed to by p.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn memory.hh:47\n-_\bD_\bu_\bn_\be_\b:_\b:_\bP_\br_\bi_\bo_\br_\bi_\bt_\by_\bT_\ba_\bg\n-Helper class for tagging priorities.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn typeutilities.hh:73\n+30} // end namespace Dune\n+31#endif\n+_\bD_\bu_\bn_\be\n+Dune namespace.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn alignedallocator.hh:13\n+_\bD_\bu_\bn_\be_\b:_\b:_\bC_\bl_\bo_\bn_\be_\ba_\bb_\bl_\be\n+An interface class for cloneable objects.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn interfaces.hh:16\n+_\bD_\bu_\bn_\be_\b:_\b:_\bC_\bl_\bo_\bn_\be_\ba_\bb_\bl_\be_\b:_\b:_\b~_\bC_\bl_\bo_\bn_\be_\ba_\bb_\bl_\be\n+virtual ~Cloneable()=default\n+Destructor.\n+_\bD_\bu_\bn_\be_\b:_\b:_\bC_\bl_\bo_\bn_\be_\ba_\bb_\bl_\be_\b:_\b:_\bc_\bl_\bo_\bn_\be\n+virtual Cloneable * clone() const =0\n+Clones the object clone needs to be redefined by an implementation class, with\n+the return type covari...\n ===============================================================================\n Generated by\u00a0_\b[_\bd_\bo_\bx_\by_\bg_\be_\bn_\b] 1.9.8\n"}]}, {"source1": "./usr/share/doc/libdune-common-doc/doxygen/a00125.html", "source2": "./usr/share/doc/libdune-common-doc/doxygen/a00125.html", "unified_diff": "@@ -1,15 +1,15 @@\n \n \n \n \n \n \n \n-dune-common: layout_right.hh File Reference\n+dune-common: dynmatrix.hh File Reference\n \n \n \n \n \n \n \n@@ -65,46 +65,57 @@\n \n \n \n \n \n \n \n
    \n \n-
    layout_right.hh File Reference
    \n+
    dynmatrix.hh File Reference
    \n
    \n
    \n-
    #include <array>
    \n-#include <type_traits>
    \n-#include <dune/common/indices.hh>
    \n-#include <dune/common/std/impl/fwd_layouts.hh>
    \n+\n+

    This file implements a dense matrix with dynamic numbers of rows and columns. \n+More...

    \n+
    #include <cmath>
    \n+#include <cstddef>
    \n+#include <iostream>
    \n+#include <initializer_list>
    \n+#include <dune/common/boundschecking.hh>
    \n+#include <dune/common/exceptions.hh>
    \n+#include <dune/common/dynvector.hh>
    \n+#include <dune/common/densematrix.hh>
    \n+#include <dune/common/typetraits.hh>
    \n
    \n

    Go to the source code of this file.

    \n \n \n-\n-\n+\n+\n+\n+\n+\n+\n \n

    \n Classes

    class  Dune::Std::layout_right::mapping< Extents >
     A layout mapping where the rightmost extent has stride 1. More...
    struct  Dune::DenseMatVecTraits< DynamicMatrix< K > >
     
    struct  Dune::FieldTraits< DynamicMatrix< K > >
     
    class  Dune::DynamicMatrix< K >
     Construct a matrix with a dynamic size. More...
     
    \n \n \n \n \n-\n-\n-\n

    \n Namespaces

    namespace  Dune
     Dune namespace.
     
    namespace  Dune::Std
     Namespace for features backported from new C++ standards.
     
    \n-
    \n+

    Detailed Description

    \n+

    This file implements a dense matrix with dynamic numbers of rows and columns.

    \n+
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,27 +1,37 @@\n dune-common\u00a02.10\n Loading...\n Searching...\n No Matches\n * _\bd_\bu_\bn_\be\n * _\bc_\bo_\bm_\bm_\bo_\bn\n- * _\bs_\bt_\bd\n _\bC_\bl_\ba_\bs_\bs_\be_\bs | _\bN_\ba_\bm_\be_\bs_\bp_\ba_\bc_\be_\bs\n-layout_right.hh File Reference\n-#include \n-#include \n-#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bi_\bn_\bd_\bi_\bc_\be_\bs_\b._\bh_\bh>\n-#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bs_\bt_\bd_\b/_\bi_\bm_\bp_\bl_\b/_\bf_\bw_\bd_\b__\bl_\ba_\by_\bo_\bu_\bt_\bs_\b._\bh_\bh>\n+dynmatrix.hh File Reference\n+_\bC_\bo_\bm_\bm_\bo_\bn \u00bb _\bD_\be_\bn_\bs_\be_\b _\bM_\ba_\bt_\br_\bi_\bx_\b _\ba_\bn_\bd_\b _\bV_\be_\bc_\bt_\bo_\br_\b _\bT_\be_\bm_\bp_\bl_\ba_\bt_\be_\b _\bL_\bi_\bb_\br_\ba_\br_\by\n+This file implements a dense matrix with dynamic numbers of rows and columns.\n+_\bM_\bo_\br_\be_\b._\b._\b.\n+#include \n+#include \n+#include \n+#include \n+#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bb_\bo_\bu_\bn_\bd_\bs_\bc_\bh_\be_\bc_\bk_\bi_\bn_\bg_\b._\bh_\bh>\n+#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\be_\bx_\bc_\be_\bp_\bt_\bi_\bo_\bn_\bs_\b._\bh_\bh>\n+#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bd_\by_\bn_\bv_\be_\bc_\bt_\bo_\br_\b._\bh_\bh>\n+#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bd_\be_\bn_\bs_\be_\bm_\ba_\bt_\br_\bi_\bx_\b._\bh_\bh>\n+#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bt_\by_\bp_\be_\bt_\br_\ba_\bi_\bt_\bs_\b._\bh_\bh>\n _\bG_\bo_\b _\bt_\bo_\b _\bt_\bh_\be_\b _\bs_\bo_\bu_\br_\bc_\be_\b _\bc_\bo_\bd_\be_\b _\bo_\bf_\b _\bt_\bh_\bi_\bs_\b _\bf_\bi_\bl_\be_\b.\n C\bCl\bla\bas\bss\bse\bes\bs\n-class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bS_\bt_\bd_\b:_\b:_\bl_\ba_\by_\bo_\bu_\bt_\b__\br_\bi_\bg_\bh_\bt_\b:_\b:_\bm_\ba_\bp_\bp_\bi_\bn_\bg_\b<_\b _\bE_\bx_\bt_\be_\bn_\bt_\bs_\b _\b>\n-\u00a0 A layout mapping where the rightmost extent has stride 1. _\bM_\bo_\br_\be_\b._\b._\b.\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\bV_\be_\bc_\bT_\br_\ba_\bi_\bt_\bs_\b<_\b _\bD_\by_\bn_\ba_\bm_\bi_\bc_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bK_\b _\b>_\b _\b>\n+\u00a0\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bF_\bi_\be_\bl_\bd_\bT_\br_\ba_\bi_\bt_\bs_\b<_\b _\bD_\by_\bn_\ba_\bm_\bi_\bc_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bK_\b _\b>_\b _\b>\n+\u00a0\n+ class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bD_\by_\bn_\ba_\bm_\bi_\bc_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bK_\b _\b>\n+\u00a0 Construct a matrix with a dynamic size. _\bM_\bo_\br_\be_\b._\b._\b.\n \u00a0\n N\bNa\bam\bme\bes\bsp\bpa\bac\bce\bes\bs\n namespace \u00a0 _\bD_\bu_\bn_\be\n \u00a0 _\bD_\bu_\bn_\be namespace.\n \u00a0\n-namespace \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bS_\bt_\bd\n-\u00a0 Namespace for features backported from new C++ standards.\n-\u00a0\n+*\b**\b**\b**\b**\b* D\bDe\bet\bta\bai\bil\ble\bed\bd D\bDe\bes\bsc\bcr\bri\bip\bpt\bti\bio\bon\bn *\b**\b**\b**\b**\b*\n+This file implements a dense matrix with dynamic numbers of rows and columns.\n ===============================================================================\n Generated by\u00a0_\b[_\bd_\bo_\bx_\by_\bg_\be_\bn_\b] 1.9.8\n"}]}, {"source1": "./usr/share/doc/libdune-common-doc/doxygen/a00125_source.html", "source2": "./usr/share/doc/libdune-common-doc/doxygen/a00125_source.html", "unified_diff": "@@ -1,15 +1,15 @@\n \n \n \n \n \n \n \n-dune-common: layout_right.hh Source File\n+dune-common: dynmatrix.hh Source File\n \n \n \n \n \n \n \n@@ -70,196 +70,219 @@\n \n \n \n \n \n \n \n
    \n-
    layout_right.hh
    \n+
    dynmatrix.hh
    \n
    \n
    \n Go to the documentation of this file.
    1// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
    \n
    2// vi: set et ts=4 sw=2 sts=2:
    \n
    3// SPDX-FileCopyrightInfo: Copyright \u00a9 DUNE Project contributors, see file LICENSE.md in module root
    \n
    4// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception
    \n-
    5#ifndef DUNE_COMMON_STD_LAYOUT_RIGHT_HH
    \n-
    6#define DUNE_COMMON_STD_LAYOUT_RIGHT_HH
    \n+
    5#ifndef DUNE_DYNMATRIX_HH
    \n+
    6#define DUNE_DYNMATRIX_HH
    \n
    7
    \n-
    8#include <array>
    \n-
    9#include <type_traits>
    \n-
    10
    \n-\n-\n-
    13
    \n-
    14namespace Dune::Std {
    \n-
    15
    \n-
    17template <class Extents>
    \n-
    \n-\n-
    19{
    \n-
    20 template <class> friend class mapping;
    \n+
    8#include <cmath>
    \n+
    9#include <cstddef>
    \n+
    10#include <iostream>
    \n+
    11#include <initializer_list>
    \n+
    12
    \n+\n+\n+\n+\n+\n+
    18
    \n+
    19namespace Dune
    \n+
    20{
    \n
    21
    \n-
    22public:
    \n-
    23 using extents_type = Extents;
    \n-
    24 using size_type = typename extents_type::size_type;
    \n-
    25 using rank_type = typename extents_type::rank_type;
    \n-
    26 using index_type = typename extents_type::index_type;
    \n-\n-
    28
    \n-
    30 constexpr mapping () noexcept = default;
    \n-
    31
    \n-
    33 constexpr mapping (const mapping&) noexcept = default;
    \n-
    34
    \n-
    \n-
    36 constexpr mapping (const extents_type& e) noexcept
    \n-
    37 : extents_(e)
    \n-
    38 {}
    \n-
    \n+
    31 template< class K > class DynamicMatrix;
    \n+
    32
    \n+
    33 template< class K >
    \n+
    \n+\n+
    35 {
    \n+\n+
    37
    \n+\n
    39
    \n-
    41 template <class OtherExtents,
    \n-
    42 std::enable_if_t<std::is_constructible_v<extents_type, OtherExtents>, int> = 0>
    \n-
    43 #if __cpp_conditional_explicit >= 201806L
    \n-
    44 explicit(!std::is_convertible_v<OtherExtents, extents_type>)
    \n-
    45 #endif
    \n-
    \n-
    46 constexpr mapping (const mapping<OtherExtents>& m) noexcept
    \n-
    47 : extents_(m.extents())
    \n-
    48 {}
    \n-
    \n-
    49
    \n-
    51 template <class OtherExtents, class E = extents_type,
    \n-
    52 std::enable_if_t<(E::rank() <= 1), int> = 0,
    \n-
    53 std::enable_if_t<std::is_constructible_v<extents_type, OtherExtents>, int> = 0>
    \n-
    54 #if __cpp_conditional_explicit >= 201806L
    \n-
    55 explicit(!std::is_convertible_v<OtherExtents, extents_type>)
    \n-
    56 #endif
    \n-
    \n-
    57 constexpr mapping (const layout_left::mapping<OtherExtents>& m) noexcept
    \n-
    58 : extents_(m.extents())
    \n-
    59 {}
    \n-
    \n-
    60
    \n-
    62 template <class OtherExtents,
    \n-
    63 std::enable_if_t<std::is_constructible_v<extents_type, OtherExtents>, int> = 0>
    \n-
    64 #if __cpp_conditional_explicit >= 201806L
    \n-
    65 explicit(extents_type::rank() > 0)
    \n-
    66 #endif
    \n-
    \n-\n-
    68 : extents_(m.extents())
    \n-
    69 {
    \n-
    70#ifndef NDEBUG
    \n-
    71 if constexpr(extents_type::rank() > 0) {
    \n-
    72 index_type prod = 1;
    \n-
    73 for (rank_type r = extents_type::rank()-1; r > 0; --r) {
    \n-
    74 assert(m.strides(r) == prod);
    \n-
    75 prod *= m.extents().extent(r);
    \n-
    76 }
    \n-
    77 assert(m.strides(0) == prod);
    \n-
    78 }
    \n-
    79#endif
    \n-
    80 }
    \n+\n+\n+
    42
    \n+
    43 typedef std::vector<K> container_type;
    \n+
    44 typedef K value_type;
    \n+
    45 typedef typename container_type::size_type size_type;
    \n+
    46 };
    \n+
    \n+
    47
    \n+
    48 template< class K >
    \n+
    \n+\n+
    50 {
    \n+\n+\n+
    53 };
    \n+
    \n+
    54
    \n+
    59 template<class K>
    \n+
    \n+
    60 class DynamicMatrix : public DenseMatrix< DynamicMatrix<K> >
    \n+
    61 {
    \n+
    62 std::vector< DynamicVector<K> > _data;
    \n+\n+
    64 public:
    \n+
    65 typedef typename Base::size_type size_type;
    \n+
    66 typedef typename Base::value_type value_type;
    \n+
    67 typedef typename Base::row_type row_type;
    \n+
    68
    \n+
    69 //===== constructors
    \n+\n+
    72
    \n+
    \n+\n+
    75 _data(r, row_type(c, v) )
    \n+
    76 {}
    \n+
    \n+
    77
    \n+
    \n+
    80 DynamicMatrix (std::initializer_list<DynamicVector<K>> const &ll)
    \n+
    81 : _data(ll)
    \n+
    82 {}
    \n
    \n-
    81
    \n-
    83 constexpr mapping& operator= (const mapping&) noexcept = default;
    \n+
    83
    \n
    84
    \n-
    85 constexpr const extents_type& extents () const noexcept { return extents_; }
    \n-
    86 constexpr index_type required_span_size () const noexcept { return extents_.product(); }
    \n-
    87
    \n-
    89 template <class... Indices,
    \n-
    90 std::enable_if_t<(sizeof...(Indices) == extents_type::rank()), int> = 0,
    \n-
    91 std::enable_if_t<(std::is_convertible_v<Indices, index_type> && ...), int> = 0,
    \n-
    92 std::enable_if_t<(std::is_nothrow_constructible_v<Indices, index_type> && ...), int> = 0>
    \n-
    \n-
    93 constexpr index_type operator() (Indices... ii) const noexcept
    \n-
    94 {
    \n-
    95 const std::array indices{index_type(std::move(ii))...};
    \n-
    96 index_type value = indices.front();
    \n-
    97 for (rank_type j = 0; j < extents_type::rank()-1; ++j) {
    \n-
    98 value = indices[j+1] + extents_.extent(j+1) * value;
    \n-
    99 }
    \n-
    100 return value;
    \n-
    101 }
    \n-
    \n-
    102
    \n-
    \n-
    104 constexpr index_type operator() () const noexcept
    \n-
    105 {
    \n-
    106 return 0;
    \n-
    107 }
    \n-
    \n-
    108
    \n-
    109 static constexpr bool is_always_unique () noexcept { return true; }
    \n-
    110 static constexpr bool is_always_exhaustive () noexcept { return true; }
    \n-
    111 static constexpr bool is_always_strided () noexcept { return true; }
    \n-
    112
    \n-
    113 static constexpr bool is_unique () noexcept { return true; }
    \n-
    114 static constexpr bool is_exhaustive () noexcept { return true; }
    \n-
    115 static constexpr bool is_strided () noexcept { return true; }
    \n-
    116
    \n-
    118 template <class E = extents_type,
    \n-
    119 std::enable_if_t<(E::rank() > 0), int> = 0>
    \n-
    \n-
    120 constexpr index_type stride (rank_type i) const noexcept
    \n-
    121 {
    \n-
    122 assert(i < extents_type::rank());
    \n-
    123 index_type prod = 1;
    \n-
    124 for (rank_type r = i+1; r < extents_type::rank(); ++r)
    \n-
    125 prod *= extents().extent(r);
    \n-
    126 return prod;
    \n-
    127 }
    \n-
    \n-
    128
    \n-
    129 template <class OtherExtents>
    \n-
    \n-
    130 friend constexpr bool operator== (const mapping& a, const mapping<OtherExtents>& b) noexcept
    \n-
    131 {
    \n-
    132 return a.extents_ == b.extents_;
    \n-
    133 }
    \n-
    \n-
    134
    \n-
    135private:
    \n-
    136 [[no_unique_address]] extents_type extents_;
    \n-
    137};
    \n+
    85 template <class T,
    \n+
    86 typename = std::enable_if_t<!Dune::IsNumber<T>::value && HasDenseMatrixAssigner<DynamicMatrix, T>::value>>
    \n+
    \n+
    87 DynamicMatrix(T const& rhs)
    \n+
    88 {
    \n+
    89 *this = rhs;
    \n+
    90 }
    \n+
    \n+
    91
    \n+
    92 //==== resize related methods
    \n+
    \n+\n+
    107 {
    \n+
    108 _data.resize(0);
    \n+
    109 _data.resize(r, row_type(c, v) );
    \n+
    110 }
    \n+
    \n+
    111
    \n+
    112 //===== assignment
    \n+
    113 // General assignment with resizing
    \n+
    114 template <typename T,
    \n+
    115 typename = std::enable_if_t<!Dune::IsNumber<T>::value>>
    \n+
    \n+
    116 DynamicMatrix& operator=(T const& rhs) {
    \n+
    117 _data.resize(rhs.N());
    \n+
    118 std::fill(_data.begin(), _data.end(), row_type(rhs.M(), K(0)));
    \n+
    119 Base::operator=(rhs);
    \n+
    120 return *this;
    \n+
    121 }
    \n+
    \n+
    122
    \n+
    123 // Specialisation: scalar assignment (no resizing)
    \n+
    124 template <typename T,
    \n+
    125 typename = std::enable_if_t<Dune::IsNumber<T>::value>>
    \n+
    \n+\n+
    127 std::fill(_data.begin(), _data.end(), scalar);
    \n+
    128 return *this;
    \n+
    129 }
    \n+
    \n+
    130
    \n+
    \n+\n+
    133 {
    \n+
    134 DynamicMatrix AT(this->M(), this->N());
    \n+
    135 for( size_type i = 0; i < this->N(); ++i )
    \n+
    136 for( size_type j = 0; j < this->M(); ++j )
    \n+
    137 AT[j][i] = (*this)[i][j];
    \n+
    138 return AT;
    \n+
    139 }
    \n
    \n-
    138
    \n-
    139} // end namespace Dune::Std
    \n
    140
    \n-
    141#endif // DUNE_COMMON_STD_LAYOUT_RIGHT_HH
    \n-\n-\n-
    Namespace for features backported from new C++ standards.
    Definition default_accessor.hh:10
    \n-
    A layout mapping where the leftmost extent has stride 1.
    Definition layout_left.hh:19
    \n-
    A layout where the rightmost extent has stride 1, and strides increase right-to-left as the product o...
    Definition fwd_layouts.hh:30
    \n-
    A layout mapping where the rightmost extent has stride 1.
    Definition layout_right.hh:19
    \n-
    constexpr const extents_type & extents() const noexcept
    Definition layout_right.hh:85
    \n-
    constexpr index_type operator()() const noexcept
    The default offset for rank-0 tensors is 0.
    Definition layout_right.hh:104
    \n-
    constexpr mapping & operator=(const mapping &) noexcept=default
    Copy-assignment for the mapping.
    \n-
    constexpr index_type required_span_size() const noexcept
    Definition layout_right.hh:86
    \n-
    constexpr mapping() noexcept=default
    The default construction is possible for default constructible extents.
    \n-
    typename extents_type::size_type size_type
    Definition layout_right.hh:24
    \n-
    Extents extents_type
    Definition layout_right.hh:23
    \n-
    static constexpr bool is_always_unique() noexcept
    Definition layout_right.hh:109
    \n-
    constexpr index_type stride(rank_type i) const noexcept
    The stride is the product of the extents E(n)*E(n-1)*...*E(i+1)
    Definition layout_right.hh:120
    \n-
    static constexpr bool is_exhaustive() noexcept
    Definition layout_right.hh:114
    \n-
    constexpr mapping(const layout_left::mapping< OtherExtents > &m) noexcept
    Construct the mapping from a layout_left.
    Definition layout_right.hh:57
    \n-
    static constexpr bool is_strided() noexcept
    Definition layout_right.hh:115
    \n-
    typename extents_type::rank_type rank_type
    Definition layout_right.hh:25
    \n-
    static constexpr bool is_always_strided() noexcept
    Definition layout_right.hh:111
    \n-
    static constexpr bool is_unique() noexcept
    Definition layout_right.hh:113
    \n-
    friend constexpr bool operator==(const mapping &a, const mapping< OtherExtents > &b) noexcept
    Definition layout_right.hh:130
    \n-
    static constexpr bool is_always_exhaustive() noexcept
    Definition layout_right.hh:110
    \n-
    typename extents_type::index_type index_type
    Definition layout_right.hh:26
    \n-
    A layout mapping where the strides are user-defined.
    Definition layout_stride.hh:19
    \n-
    constexpr const extents_type & extents() const noexcept
    Definition layout_stride.hh:85
    \n-
    constexpr const strides_type & strides() const noexcept
    Get the array of all strides.
    Definition layout_stride.hh:127
    \n+
    141 // make this thing a matrix
    \n+
    142 size_type mat_rows() const { return _data.size(); }
    \n+
    \n+\n+
    144 assert(this->rows());
    \n+
    145 return _data.front().size();
    \n+
    146 }
    \n+
    \n+
    \n+\n+
    148 DUNE_ASSERT_BOUNDS(i < _data.size());
    \n+
    149 return _data[i];
    \n+
    150 }
    \n+
    \n+
    \n+
    151 const row_type & mat_access(size_type i) const {
    \n+
    152 DUNE_ASSERT_BOUNDS(i < _data.size());
    \n+
    153 return _data[i];
    \n+
    154 }
    \n+
    \n+
    155 };
    \n+
    \n+
    156
    \n+
    159} // end namespace
    \n+
    160
    \n+
    161#endif
    \n+
    Implements a matrix constructed from a given type representing a field and a compile-time given numbe...
    \n+
    Traits for type conversions and type information.
    \n+
    Macro for wrapping boundary checks.
    \n+
    This file implements a dense vector with a dynamic size.
    \n+
    A few common exception classes.
    \n+
    #define DUNE_ASSERT_BOUNDS(cond)
    If DUNE_CHECK_BOUNDS is defined: check if condition cond holds; otherwise, do nothing.
    Definition boundschecking.hh:30
    \n+
    Dune namespace.
    Definition alignedallocator.hh:13
    \n+
    A dense n x m matrix.
    Definition densematrix.hh:140
    \n+
    derived_type & operator=(const RHS &rhs)
    Definition densematrix.hh:279
    \n+
    constexpr size_type M() const
    number of columns
    Definition densematrix.hh:703
    \n+
    Traits::value_type value_type
    export the type representing the field
    Definition densematrix.hh:157
    \n+
    constexpr size_type rows() const
    number of rows
    Definition densematrix.hh:709
    \n+
    constexpr size_type N() const
    number of rows
    Definition densematrix.hh:697
    \n+
    Traits::size_type size_type
    The type used for the index access and size operation.
    Definition densematrix.hh:166
    \n+
    Construct a matrix with a dynamic size.
    Definition dynmatrix.hh:61
    \n+
    size_type mat_cols() const
    Definition dynmatrix.hh:143
    \n+
    DynamicMatrix(std::initializer_list< DynamicVector< K > > const &ll)
    Constructor initializing the matrix from a list of vector.
    Definition dynmatrix.hh:80
    \n+
    Base::row_type row_type
    Definition dynmatrix.hh:67
    \n+
    DynamicMatrix transposed() const
    Return transposed of the matrix as DynamicMatrix.
    Definition dynmatrix.hh:132
    \n+
    Base::value_type value_type
    Definition dynmatrix.hh:66
    \n+
    row_type & mat_access(size_type i)
    Definition dynmatrix.hh:147
    \n+
    Base::size_type size_type
    Definition dynmatrix.hh:65
    \n+
    size_type mat_rows() const
    Definition dynmatrix.hh:142
    \n+
    DynamicMatrix(T const &rhs)
    Definition dynmatrix.hh:87
    \n+
    const row_type & mat_access(size_type i) const
    Definition dynmatrix.hh:151
    \n+
    void resize(size_type r, size_type c, value_type v=value_type())
    resize matrix to r \u00d7 c
    Definition dynmatrix.hh:106
    \n+
    DynamicMatrix & operator=(T const &rhs)
    Definition dynmatrix.hh:116
    \n+
    DynamicMatrix()
    Default constructor.
    Definition dynmatrix.hh:71
    \n+
    DynamicMatrix(size_type r, size_type c, value_type v=value_type())
    Constructor initializing the whole matrix with a scalar.
    Definition dynmatrix.hh:74
    \n+
    DynamicMatrix & operator=(T scalar)
    Definition dynmatrix.hh:126
    \n+
    container_type::size_type size_type
    Definition dynmatrix.hh:45
    \n+
    DynamicVector< K > row_type
    Definition dynmatrix.hh:38
    \n+
    row_type & row_reference
    Definition dynmatrix.hh:40
    \n+
    K value_type
    Definition dynmatrix.hh:44
    \n+
    DynamicMatrix< K > derived_type
    Definition dynmatrix.hh:36
    \n+
    const row_type & const_row_reference
    Definition dynmatrix.hh:41
    \n+
    std::vector< K > container_type
    Definition dynmatrix.hh:43
    \n+
    FieldTraits< K >::real_type real_type
    Definition dynmatrix.hh:52
    \n+
    FieldTraits< K >::field_type field_type
    Definition dynmatrix.hh:51
    \n+
    Construct a vector with a dynamic size.
    Definition dynvector.hh:59
    \n+
    Definition ftraits.hh:26
    \n+
    T field_type
    export the type representing the field
    Definition ftraits.hh:28
    \n+
    T real_type
    export the type representing the real type of the field
    Definition ftraits.hh:30
    \n+
    Definition matvectraits.hh:31
    \n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,232 +1,280 @@\n dune-common\u00a02.10\n Loading...\n Searching...\n No Matches\n * _\bd_\bu_\bn_\be\n * _\bc_\bo_\bm_\bm_\bo_\bn\n- * _\bs_\bt_\bd\n-layout_right.hh\n+dynmatrix.hh\n _\bG_\bo_\b _\bt_\bo_\b _\bt_\bh_\be_\b _\bd_\bo_\bc_\bu_\bm_\be_\bn_\bt_\ba_\bt_\bi_\bo_\bn_\b _\bo_\bf_\b _\bt_\bh_\bi_\bs_\b _\bf_\bi_\bl_\be_\b.\n 1// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-\n 2// vi: set et ts=4 sw=2 sts=2:\n 3// SPDX-FileCopyrightInfo: Copyright \u00c2\u00a9 DUNE Project contributors, see file\n LICENSE.md in module root\n 4// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception\n-5#ifndef DUNE_COMMON_STD_LAYOUT_RIGHT_HH\n-6#define DUNE_COMMON_STD_LAYOUT_RIGHT_HH\n+5#ifndef DUNE_DYNMATRIX_HH\n+6#define DUNE_DYNMATRIX_HH\n 7\n-8#include \n-9#include \n-10\n-11#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bi_\bn_\bd_\bi_\bc_\be_\bs_\b._\bh_\bh>\n-12#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bs_\bt_\bd_\b/_\bi_\bm_\bp_\bl_\b/_\bf_\bw_\bd_\b__\bl_\ba_\by_\bo_\bu_\bt_\bs_\b._\bh_\bh>\n-13\n-14namespace _\bD_\bu_\bn_\be_\b:_\b:_\bS_\bt_\bd {\n-15\n-17template \n-_\b1_\b8class _\bl_\ba_\by_\bo_\bu_\bt_\b__\br_\bi_\bg_\bh_\bt_\b:_\b:_\bm_\ba_\bp_\bp_\bi_\bn_\bg\n-19{\n-_\b2_\b0 template friend class _\bm_\ba_\bp_\bp_\bi_\bn_\bg;\n+8#include \n+9#include \n+10#include \n+11#include \n+12\n+13#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bb_\bo_\bu_\bn_\bd_\bs_\bc_\bh_\be_\bc_\bk_\bi_\bn_\bg_\b._\bh_\bh>\n+14#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\be_\bx_\bc_\be_\bp_\bt_\bi_\bo_\bn_\bs_\b._\bh_\bh>\n+15#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bd_\by_\bn_\bv_\be_\bc_\bt_\bo_\br_\b._\bh_\bh>\n+16#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bd_\be_\bn_\bs_\be_\bm_\ba_\bt_\br_\bi_\bx_\b._\bh_\bh>\n+17#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bt_\by_\bp_\be_\bt_\br_\ba_\bi_\bt_\bs_\b._\bh_\bh>\n+18\n+19namespace _\bD_\bu_\bn_\be\n+20{\n 21\n-22public:\n-_\b2_\b3 using _\be_\bx_\bt_\be_\bn_\bt_\bs_\b__\bt_\by_\bp_\be = Extents;\n-_\b2_\b4 using _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be = typename extents_type::size_type;\n-_\b2_\b5 using _\br_\ba_\bn_\bk_\b__\bt_\by_\bp_\be = typename extents_type::rank_type;\n-_\b2_\b6 using _\bi_\bn_\bd_\be_\bx_\b__\bt_\by_\bp_\be = typename extents_type::index_type;\n-_\b2_\b7 using _\bl_\ba_\by_\bo_\bu_\bt_\b__\bt_\by_\bp_\be = _\bl_\ba_\by_\bo_\bu_\bt_\b__\br_\bi_\bg_\bh_\bt;\n-28\n-_\b3_\b0 constexpr _\bm_\ba_\bp_\bp_\bi_\bn_\bg () noexcept = default;\n-31\n-_\b3_\b3 constexpr _\bm_\ba_\bp_\bp_\bi_\bn_\bg (const _\bm_\ba_\bp_\bp_\bi_\bn_\bg&) noexcept = default;\n-34\n-_\b3_\b6 constexpr _\bm_\ba_\bp_\bp_\bi_\bn_\bg (const _\be_\bx_\bt_\be_\bn_\bt_\bs_\b__\bt_\by_\bp_\be& e) noexcept\n-37 : extents_(e)\n-38 {}\n+31 template< class K > class DynamicMatrix;\n+32\n+33 template< class K >\n+_\b3_\b4 struct _\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\bV_\be_\bc_\bT_\br_\ba_\bi_\bt_\bs< _\bD_\by_\bn_\ba_\bm_\bi_\bc_\bM_\ba_\bt_\br_\bi_\bx >\n+35 {\n+_\b3_\b6 typedef _\bD_\by_\bn_\ba_\bm_\bi_\bc_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bK_\b> _\bd_\be_\br_\bi_\bv_\be_\bd_\b__\bt_\by_\bp_\be;\n+37\n+_\b3_\b8 typedef _\bD_\by_\bn_\ba_\bm_\bi_\bc_\bV_\be_\bc_\bt_\bo_\br_\b<_\bK_\b> _\br_\bo_\bw_\b__\bt_\by_\bp_\be;\n 39\n-41 template , int> =\n-0>\n-43 #if __cpp_conditional_explicit >= 201806L\n-44 explicit(!std::is_convertible_v)\n-45 #endif\n-_\b4_\b6 constexpr _\bm_\ba_\bp_\bp_\bi_\bn_\bg (const _\bm_\ba_\bp_\bp_\bi_\bn_\bg_\b<_\bO_\bt_\bh_\be_\br_\bE_\bx_\bt_\be_\bn_\bt_\bs_\b>& m) noexcept\n-47 : extents_(m._\be_\bx_\bt_\be_\bn_\bt_\bs())\n-48 {}\n-49\n-51 template = 0,\n-53 std::enable_if_t, int> =\n-0>\n-54 #if __cpp_conditional_explicit >= 201806L\n-55 explicit(!std::is_convertible_v)\n-56 #endif\n-_\b5_\b7 constexpr _\bm_\ba_\bp_\bp_\bi_\bn_\bg (const _\bl_\ba_\by_\bo_\bu_\bt_\b__\bl_\be_\bf_\bt_\b:_\b:_\bm_\ba_\bp_\bp_\bi_\bn_\bg_\b<_\bO_\bt_\bh_\be_\br_\bE_\bx_\bt_\be_\bn_\bt_\bs_\b>& m) noexcept\n-58 : extents_(m._\be_\bx_\bt_\be_\bn_\bt_\bs())\n-59 {}\n-60\n-62 template , int> =\n-0>\n-64 #if __cpp_conditional_explicit >= 201806L\n-65 explicit(extents_type::rank() > 0)\n-66 #endif\n-_\b6_\b7 constexpr _\bm_\ba_\bp_\bp_\bi_\bn_\bg (const _\bl_\ba_\by_\bo_\bu_\bt_\b__\bs_\bt_\br_\bi_\bd_\be_\b:_\b:_\bm_\ba_\bp_\bp_\bi_\bn_\bg_\b<_\bO_\bt_\bh_\be_\br_\bE_\bx_\bt_\be_\bn_\bt_\bs_\b>& m)\n-68 : extents_(m._\be_\bx_\bt_\be_\bn_\bt_\bs())\n-69 {\n-70#ifndef NDEBUG\n-71 if constexpr(extents_type::rank() > 0) {\n-72 _\bi_\bn_\bd_\be_\bx_\b__\bt_\by_\bp_\be prod = 1;\n-73 for (_\br_\ba_\bn_\bk_\b__\bt_\by_\bp_\be r = extents_type::rank()-1; r > 0; --r) {\n-74 assert(m._\bs_\bt_\br_\bi_\bd_\be_\bs(r) == prod);\n-75 prod *= m._\be_\bx_\bt_\be_\bn_\bt_\bs().extent(r);\n-76 }\n-77 assert(m._\bs_\bt_\br_\bi_\bd_\be_\bs(0) == prod);\n-78 }\n-79#endif\n-80 }\n-81\n-_\b8_\b3 constexpr _\bm_\ba_\bp_\bp_\bi_\bn_\bg& _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b=_\b (const _\bm_\ba_\bp_\bp_\bi_\bn_\bg&) noexcept = default;\n+_\b4_\b0 typedef _\br_\bo_\bw_\b__\bt_\by_\bp_\be &_\br_\bo_\bw_\b__\br_\be_\bf_\be_\br_\be_\bn_\bc_\be;\n+_\b4_\b1 typedef const _\br_\bo_\bw_\b__\bt_\by_\bp_\be &_\bc_\bo_\bn_\bs_\bt_\b__\br_\bo_\bw_\b__\br_\be_\bf_\be_\br_\be_\bn_\bc_\be;\n+42\n+_\b4_\b3 typedef std::vector _\bc_\bo_\bn_\bt_\ba_\bi_\bn_\be_\br_\b__\bt_\by_\bp_\be;\n+_\b4_\b4 typedef K _\bv_\ba_\bl_\bu_\be_\b__\bt_\by_\bp_\be;\n+_\b4_\b5 typedef typename container_type::size_type _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be;\n+46 };\n+47\n+48 template< class K >\n+_\b4_\b9 struct _\bF_\bi_\be_\bl_\bd_\bT_\br_\ba_\bi_\bt_\bs< _\bD_\by_\bn_\ba_\bm_\bi_\bc_\bM_\ba_\bt_\br_\bi_\bx >\n+50 {\n+_\b5_\b1 typedef typename _\bF_\bi_\be_\bl_\bd_\bT_\br_\ba_\bi_\bt_\bs_\b<_\bK_\b>_\b:_\b:_\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be _\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be;\n+_\b5_\b2 typedef typename _\bF_\bi_\be_\bl_\bd_\bT_\br_\ba_\bi_\bt_\bs_\b<_\bK_\b>_\b:_\b:_\br_\be_\ba_\bl_\b__\bt_\by_\bp_\be _\br_\be_\ba_\bl_\b__\bt_\by_\bp_\be;\n+53 };\n+54\n+59 template\n+_\b6_\b0 class _\bD_\by_\bn_\ba_\bm_\bi_\bc_\bM_\ba_\bt_\br_\bi_\bx : public _\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx< DynamicMatrix >\n+61 {\n+62 std::vector< DynamicVector > _data;\n+63 typedef _\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bD_\by_\bn_\ba_\bm_\bi_\bc_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bK_\b> > _\bB_\ba_\bs_\be;\n+64 public:\n+_\b6_\b5 typedef typename _\bB_\ba_\bs_\be_\b:_\b:_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be;\n+_\b6_\b6 typedef typename _\bB_\ba_\bs_\be_\b:_\b:_\bv_\ba_\bl_\bu_\be_\b__\bt_\by_\bp_\be _\bv_\ba_\bl_\bu_\be_\b__\bt_\by_\bp_\be;\n+_\b6_\b7 typedef typename _\bB_\ba_\bs_\be_\b:_\b:_\br_\bo_\bw_\b__\bt_\by_\bp_\be _\br_\bo_\bw_\b__\bt_\by_\bp_\be;\n+68\n+69 //===== constructors\n+_\b7_\b1 _\bD_\by_\bn_\ba_\bm_\bi_\bc_\bM_\ba_\bt_\br_\bi_\bx () {}\n+72\n+_\b7_\b4 _\bD_\by_\bn_\ba_\bm_\bi_\bc_\bM_\ba_\bt_\br_\bi_\bx (_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be r, _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be c, _\bv_\ba_\bl_\bu_\be_\b__\bt_\by_\bp_\be v = _\bv_\ba_\bl_\bu_\be_\b__\bt_\by_\bp_\be() ) :\n+75 _data(r, _\br_\bo_\bw_\b__\bt_\by_\bp_\be(c, v) )\n+76 {}\n+77\n+_\b8_\b0 _\bD_\by_\bn_\ba_\bm_\bi_\bc_\bM_\ba_\bt_\br_\bi_\bx (std::initializer_list<_\bD_\by_\bn_\ba_\bm_\bi_\bc_\bV_\be_\bc_\bt_\bo_\br_\b<_\bK_\b>> const &ll)\n+81 : _data(ll)\n+82 {}\n+83\n 84\n-_\b8_\b5 constexpr const _\be_\bx_\bt_\be_\bn_\bt_\bs_\b__\bt_\by_\bp_\be& _\be_\bx_\bt_\be_\bn_\bt_\bs () const noexcept { return extents_; }\n-_\b8_\b6 constexpr _\bi_\bn_\bd_\be_\bx_\b__\bt_\by_\bp_\be _\br_\be_\bq_\bu_\bi_\br_\be_\bd_\b__\bs_\bp_\ba_\bn_\b__\bs_\bi_\bz_\be () const noexcept { return\n-extents_.product(); }\n-87\n-89 template = 0,\n-91 std::enable_if_t<(std::is_convertible_v && ...), int> =\n-0,\n-92 std::enable_if_t<(std::is_nothrow_constructible_v &&\n-...), int> = 0>\n-_\b9_\b3 constexpr _\bi_\bn_\bd_\be_\bx_\b__\bt_\by_\bp_\be _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b(_\b)_\b (Indices... ii) const noexcept\n-94 {\n-95 const std::array indices{_\bi_\bn_\bd_\be_\bx_\b__\bt_\by_\bp_\be(std::move(ii))...};\n-96 _\bi_\bn_\bd_\be_\bx_\b__\bt_\by_\bp_\be value = indices.front();\n-97 for (_\br_\ba_\bn_\bk_\b__\bt_\by_\bp_\be j = 0; j < extents_type::rank()-1; ++j) {\n-98 value = indices[j+1] + extents_.extent(j+1) * value;\n-99 }\n-100 return value;\n-101 }\n-102\n-_\b1_\b0_\b4 constexpr _\bi_\bn_\bd_\be_\bx_\b__\bt_\by_\bp_\be _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b(_\b)_\b () const noexcept\n-105 {\n-106 return 0;\n-107 }\n-108\n-_\b1_\b0_\b9 static constexpr bool _\bi_\bs_\b__\ba_\bl_\bw_\ba_\by_\bs_\b__\bu_\bn_\bi_\bq_\bu_\be () noexcept { return true; }\n-_\b1_\b1_\b0 static constexpr bool _\bi_\bs_\b__\ba_\bl_\bw_\ba_\by_\bs_\b__\be_\bx_\bh_\ba_\bu_\bs_\bt_\bi_\bv_\be () noexcept { return true; }\n-_\b1_\b1_\b1 static constexpr bool _\bi_\bs_\b__\ba_\bl_\bw_\ba_\by_\bs_\b__\bs_\bt_\br_\bi_\bd_\be_\bd () noexcept { return true; }\n-112\n-_\b1_\b1_\b3 static constexpr bool _\bi_\bs_\b__\bu_\bn_\bi_\bq_\bu_\be () noexcept { return true; }\n-_\b1_\b1_\b4 static constexpr bool _\bi_\bs_\b__\be_\bx_\bh_\ba_\bu_\bs_\bt_\bi_\bv_\be () noexcept { return true; }\n-_\b1_\b1_\b5 static constexpr bool _\bi_\bs_\b__\bs_\bt_\br_\bi_\bd_\be_\bd () noexcept { return true; }\n-116\n-118 template 0), int> = 0>\n-_\b1_\b2_\b0 constexpr _\bi_\bn_\bd_\be_\bx_\b__\bt_\by_\bp_\be _\bs_\bt_\br_\bi_\bd_\be (_\br_\ba_\bn_\bk_\b__\bt_\by_\bp_\be i) const noexcept\n-121 {\n-122 assert(i < extents_type::rank());\n-123 _\bi_\bn_\bd_\be_\bx_\b__\bt_\by_\bp_\be prod = 1;\n-124 for (_\br_\ba_\bn_\bk_\b__\bt_\by_\bp_\be r = i+1; r < extents_type::rank(); ++r)\n-125 prod *= _\be_\bx_\bt_\be_\bn_\bt_\bs().extent(r);\n-126 return prod;\n-127 }\n-128\n-129 template \n-_\b1_\b3_\b0 friend constexpr bool _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b=_\b=_\b (const _\bm_\ba_\bp_\bp_\bi_\bn_\bg& a, const\n-_\bm_\ba_\bp_\bp_\bi_\bn_\bg_\b<_\bO_\bt_\bh_\be_\br_\bE_\bx_\bt_\be_\bn_\bt_\bs_\b>& b) noexcept\n-131 {\n-132 return a.extents_ == b.extents_;\n-133 }\n-134\n-135private:\n-136 [[no_unique_address]] _\be_\bx_\bt_\be_\bn_\bt_\bs_\b__\bt_\by_\bp_\be extents_;\n-137};\n-138\n-139} // end namespace Dune::Std\n+85 template ::value &&\n+HasDenseMatrixAssigner::value>>\n+_\b8_\b7 _\bD_\by_\bn_\ba_\bm_\bi_\bc_\bM_\ba_\bt_\br_\bi_\bx(T const& rhs)\n+88 {\n+89 *this = rhs;\n+90 }\n+91\n+92 //==== resize related methods\n+_\b1_\b0_\b6 void _\br_\be_\bs_\bi_\bz_\be (_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be r, _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be c, _\bv_\ba_\bl_\bu_\be_\b__\bt_\by_\bp_\be v = _\bv_\ba_\bl_\bu_\be_\b__\bt_\by_\bp_\be() )\n+107 {\n+108 _data.resize(0);\n+109 _data.resize(r, _\br_\bo_\bw_\b__\bt_\by_\bp_\be(c, v) );\n+110 }\n+111\n+112 //===== assignment\n+113 // General assignment with resizing\n+114 template ::value>>\n+_\b1_\b1_\b6 _\bD_\by_\bn_\ba_\bm_\bi_\bc_\bM_\ba_\bt_\br_\bi_\bx& _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b=(T const& rhs) {\n+117 _data._\br_\be_\bs_\bi_\bz_\be(rhs.N());\n+118 std::fill(_data.begin(), _data.end(), _\br_\bo_\bw_\b__\bt_\by_\bp_\be(rhs.M(), K(0)));\n+119 _\bB_\ba_\bs_\be_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b=(rhs);\n+120 return *this;\n+121 }\n+122\n+123 // Specialisation: scalar assignment (no resizing)\n+124 template ::value>>\n+_\b1_\b2_\b6 _\bD_\by_\bn_\ba_\bm_\bi_\bc_\bM_\ba_\bt_\br_\bi_\bx& _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b=(T scalar) {\n+127 std::fill(_data.begin(), _data.end(), scalar);\n+128 return *this;\n+129 }\n+130\n+_\b1_\b3_\b2 _\bD_\by_\bn_\ba_\bm_\bi_\bc_\bM_\ba_\bt_\br_\bi_\bx _\bt_\br_\ba_\bn_\bs_\bp_\bo_\bs_\be_\bd() const\n+133 {\n+134 _\bD_\by_\bn_\ba_\bm_\bi_\bc_\bM_\ba_\bt_\br_\bi_\bx AT(this->_\bM(), this->_\bN());\n+135 for( size_type i = 0; i < this->_\bN(); ++i )\n+136 for( _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be j = 0; j < this->_\bM(); ++j )\n+137 AT[j][i] = (*this)[i][j];\n+138 return AT;\n+139 }\n 140\n-141#endif // DUNE_COMMON_STD_LAYOUT_RIGHT_HH\n-_\bf_\bw_\bd_\b__\bl_\ba_\by_\bo_\bu_\bt_\bs_\b._\bh_\bh\n-_\bi_\bn_\bd_\bi_\bc_\be_\bs_\b._\bh_\bh\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bt_\bd\n-Namespace for features backported from new C++ standards.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn default_accessor.hh:10\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bt_\bd_\b:_\b:_\bl_\ba_\by_\bo_\bu_\bt_\b__\bl_\be_\bf_\bt_\b:_\b:_\bm_\ba_\bp_\bp_\bi_\bn_\bg\n-A layout mapping where the leftmost extent has stride 1.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn layout_left.hh:19\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bt_\bd_\b:_\b:_\bl_\ba_\by_\bo_\bu_\bt_\b__\br_\bi_\bg_\bh_\bt\n-A layout where the rightmost extent has stride 1, and strides increase right-\n-to-left as the product o...\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn fwd_layouts.hh:30\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bt_\bd_\b:_\b:_\bl_\ba_\by_\bo_\bu_\bt_\b__\br_\bi_\bg_\bh_\bt_\b:_\b:_\bm_\ba_\bp_\bp_\bi_\bn_\bg\n-A layout mapping where the rightmost extent has stride 1.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn layout_right.hh:19\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bt_\bd_\b:_\b:_\bl_\ba_\by_\bo_\bu_\bt_\b__\br_\bi_\bg_\bh_\bt_\b:_\b:_\bm_\ba_\bp_\bp_\bi_\bn_\bg_\b:_\b:_\be_\bx_\bt_\be_\bn_\bt_\bs\n-constexpr const extents_type & extents() const noexcept\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn layout_right.hh:85\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bt_\bd_\b:_\b:_\bl_\ba_\by_\bo_\bu_\bt_\b__\br_\bi_\bg_\bh_\bt_\b:_\b:_\bm_\ba_\bp_\bp_\bi_\bn_\bg_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b(_\b)\n-constexpr index_type operator()() const noexcept\n-The default offset for rank-0 tensors is 0.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn layout_right.hh:104\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bt_\bd_\b:_\b:_\bl_\ba_\by_\bo_\bu_\bt_\b__\br_\bi_\bg_\bh_\bt_\b:_\b:_\bm_\ba_\bp_\bp_\bi_\bn_\bg_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b=\n-constexpr mapping & operator=(const mapping &) noexcept=default\n-Copy-assignment for the mapping.\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bt_\bd_\b:_\b:_\bl_\ba_\by_\bo_\bu_\bt_\b__\br_\bi_\bg_\bh_\bt_\b:_\b:_\bm_\ba_\bp_\bp_\bi_\bn_\bg_\b:_\b:_\br_\be_\bq_\bu_\bi_\br_\be_\bd_\b__\bs_\bp_\ba_\bn_\b__\bs_\bi_\bz_\be\n-constexpr index_type required_span_size() const noexcept\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn layout_right.hh:86\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bt_\bd_\b:_\b:_\bl_\ba_\by_\bo_\bu_\bt_\b__\br_\bi_\bg_\bh_\bt_\b:_\b:_\bm_\ba_\bp_\bp_\bi_\bn_\bg_\b:_\b:_\bm_\ba_\bp_\bp_\bi_\bn_\bg\n-constexpr mapping() noexcept=default\n-The default construction is possible for default constructible extents.\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bt_\bd_\b:_\b:_\bl_\ba_\by_\bo_\bu_\bt_\b__\br_\bi_\bg_\bh_\bt_\b:_\b:_\bm_\ba_\bp_\bp_\bi_\bn_\bg_\b:_\b:_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be\n-typename extents_type::size_type size_type\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn layout_right.hh:24\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bt_\bd_\b:_\b:_\bl_\ba_\by_\bo_\bu_\bt_\b__\br_\bi_\bg_\bh_\bt_\b:_\b:_\bm_\ba_\bp_\bp_\bi_\bn_\bg_\b:_\b:_\be_\bx_\bt_\be_\bn_\bt_\bs_\b__\bt_\by_\bp_\be\n-Extents extents_type\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn layout_right.hh:23\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bt_\bd_\b:_\b:_\bl_\ba_\by_\bo_\bu_\bt_\b__\br_\bi_\bg_\bh_\bt_\b:_\b:_\bm_\ba_\bp_\bp_\bi_\bn_\bg_\b:_\b:_\bi_\bs_\b__\ba_\bl_\bw_\ba_\by_\bs_\b__\bu_\bn_\bi_\bq_\bu_\be\n-static constexpr bool is_always_unique() noexcept\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn layout_right.hh:109\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bt_\bd_\b:_\b:_\bl_\ba_\by_\bo_\bu_\bt_\b__\br_\bi_\bg_\bh_\bt_\b:_\b:_\bm_\ba_\bp_\bp_\bi_\bn_\bg_\b:_\b:_\bs_\bt_\br_\bi_\bd_\be\n-constexpr index_type stride(rank_type i) const noexcept\n-The stride is the product of the extents E(n)*E(n-1)*...*E(i+1)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn layout_right.hh:120\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bt_\bd_\b:_\b:_\bl_\ba_\by_\bo_\bu_\bt_\b__\br_\bi_\bg_\bh_\bt_\b:_\b:_\bm_\ba_\bp_\bp_\bi_\bn_\bg_\b:_\b:_\bi_\bs_\b__\be_\bx_\bh_\ba_\bu_\bs_\bt_\bi_\bv_\be\n-static constexpr bool is_exhaustive() noexcept\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn layout_right.hh:114\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bt_\bd_\b:_\b:_\bl_\ba_\by_\bo_\bu_\bt_\b__\br_\bi_\bg_\bh_\bt_\b:_\b:_\bm_\ba_\bp_\bp_\bi_\bn_\bg_\b:_\b:_\bm_\ba_\bp_\bp_\bi_\bn_\bg\n-constexpr mapping(const layout_left::mapping< OtherExtents > &m) noexcept\n-Construct the mapping from a layout_left.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn layout_right.hh:57\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bt_\bd_\b:_\b:_\bl_\ba_\by_\bo_\bu_\bt_\b__\br_\bi_\bg_\bh_\bt_\b:_\b:_\bm_\ba_\bp_\bp_\bi_\bn_\bg_\b:_\b:_\bi_\bs_\b__\bs_\bt_\br_\bi_\bd_\be_\bd\n-static constexpr bool is_strided() noexcept\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn layout_right.hh:115\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bt_\bd_\b:_\b:_\bl_\ba_\by_\bo_\bu_\bt_\b__\br_\bi_\bg_\bh_\bt_\b:_\b:_\bm_\ba_\bp_\bp_\bi_\bn_\bg_\b:_\b:_\br_\ba_\bn_\bk_\b__\bt_\by_\bp_\be\n-typename extents_type::rank_type rank_type\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn layout_right.hh:25\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bt_\bd_\b:_\b:_\bl_\ba_\by_\bo_\bu_\bt_\b__\br_\bi_\bg_\bh_\bt_\b:_\b:_\bm_\ba_\bp_\bp_\bi_\bn_\bg_\b:_\b:_\bi_\bs_\b__\ba_\bl_\bw_\ba_\by_\bs_\b__\bs_\bt_\br_\bi_\bd_\be_\bd\n-static constexpr bool is_always_strided() noexcept\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn layout_right.hh:111\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bt_\bd_\b:_\b:_\bl_\ba_\by_\bo_\bu_\bt_\b__\br_\bi_\bg_\bh_\bt_\b:_\b:_\bm_\ba_\bp_\bp_\bi_\bn_\bg_\b:_\b:_\bi_\bs_\b__\bu_\bn_\bi_\bq_\bu_\be\n-static constexpr bool is_unique() noexcept\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn layout_right.hh:113\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bt_\bd_\b:_\b:_\bl_\ba_\by_\bo_\bu_\bt_\b__\br_\bi_\bg_\bh_\bt_\b:_\b:_\bm_\ba_\bp_\bp_\bi_\bn_\bg_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b=_\b=\n-friend constexpr bool operator==(const mapping &a, const mapping< OtherExtents\n-> &b) noexcept\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn layout_right.hh:130\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bt_\bd_\b:_\b:_\bl_\ba_\by_\bo_\bu_\bt_\b__\br_\bi_\bg_\bh_\bt_\b:_\b:_\bm_\ba_\bp_\bp_\bi_\bn_\bg_\b:_\b:_\bi_\bs_\b__\ba_\bl_\bw_\ba_\by_\bs_\b__\be_\bx_\bh_\ba_\bu_\bs_\bt_\bi_\bv_\be\n-static constexpr bool is_always_exhaustive() noexcept\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn layout_right.hh:110\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bt_\bd_\b:_\b:_\bl_\ba_\by_\bo_\bu_\bt_\b__\br_\bi_\bg_\bh_\bt_\b:_\b:_\bm_\ba_\bp_\bp_\bi_\bn_\bg_\b:_\b:_\bi_\bn_\bd_\be_\bx_\b__\bt_\by_\bp_\be\n-typename extents_type::index_type index_type\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn layout_right.hh:26\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bt_\bd_\b:_\b:_\bl_\ba_\by_\bo_\bu_\bt_\b__\bs_\bt_\br_\bi_\bd_\be_\b:_\b:_\bm_\ba_\bp_\bp_\bi_\bn_\bg\n-A layout mapping where the strides are user-defined.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn layout_stride.hh:19\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bt_\bd_\b:_\b:_\bl_\ba_\by_\bo_\bu_\bt_\b__\bs_\bt_\br_\bi_\bd_\be_\b:_\b:_\bm_\ba_\bp_\bp_\bi_\bn_\bg_\b:_\b:_\be_\bx_\bt_\be_\bn_\bt_\bs\n-constexpr const extents_type & extents() const noexcept\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn layout_stride.hh:85\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bt_\bd_\b:_\b:_\bl_\ba_\by_\bo_\bu_\bt_\b__\bs_\bt_\br_\bi_\bd_\be_\b:_\b:_\bm_\ba_\bp_\bp_\bi_\bn_\bg_\b:_\b:_\bs_\bt_\br_\bi_\bd_\be_\bs\n-constexpr const strides_type & strides() const noexcept\n-Get the array of all strides.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn layout_stride.hh:127\n+141 // make this thing a matrix\n+_\b1_\b4_\b2 _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be _\bm_\ba_\bt_\b__\br_\bo_\bw_\bs() const { return _data.size(); }\n+_\b1_\b4_\b3 _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be _\bm_\ba_\bt_\b__\bc_\bo_\bl_\bs() const {\n+144 assert(this->_\br_\bo_\bw_\bs());\n+145 return _data.front().size();\n+146 }\n+_\b1_\b4_\b7 _\br_\bo_\bw_\b__\bt_\by_\bp_\be & _\bm_\ba_\bt_\b__\ba_\bc_\bc_\be_\bs_\bs(_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be i) {\n+148 _\bD_\bU_\bN_\bE_\b__\bA_\bS_\bS_\bE_\bR_\bT_\b__\bB_\bO_\bU_\bN_\bD_\bS(i < _data.size());\n+149 return _data[i];\n+150 }\n+_\b1_\b5_\b1 const _\br_\bo_\bw_\b__\bt_\by_\bp_\be & _\bm_\ba_\bt_\b__\ba_\bc_\bc_\be_\bs_\bs(_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be i) const {\n+152 _\bD_\bU_\bN_\bE_\b__\bA_\bS_\bS_\bE_\bR_\bT_\b__\bB_\bO_\bU_\bN_\bD_\bS(i < _data.size());\n+153 return _data[i];\n+154 }\n+155 };\n+156\n+159} // end namespace\n+160\n+161#endif\n+_\bd_\be_\bn_\bs_\be_\bm_\ba_\bt_\br_\bi_\bx_\b._\bh_\bh\n+Implements a matrix constructed from a given type representing a field and a\n+compile-time given numbe...\n+_\bt_\by_\bp_\be_\bt_\br_\ba_\bi_\bt_\bs_\b._\bh_\bh\n+Traits for type conversions and type information.\n+_\bb_\bo_\bu_\bn_\bd_\bs_\bc_\bh_\be_\bc_\bk_\bi_\bn_\bg_\b._\bh_\bh\n+Macro for wrapping boundary checks.\n+_\bd_\by_\bn_\bv_\be_\bc_\bt_\bo_\br_\b._\bh_\bh\n+This file implements a dense vector with a dynamic size.\n+_\be_\bx_\bc_\be_\bp_\bt_\bi_\bo_\bn_\bs_\b._\bh_\bh\n+A few common exception classes.\n+_\bD_\bU_\bN_\bE_\b__\bA_\bS_\bS_\bE_\bR_\bT_\b__\bB_\bO_\bU_\bN_\bD_\bS\n+#define DUNE_ASSERT_BOUNDS(cond)\n+If DUNE_CHECK_BOUNDS is defined: check if condition cond holds; otherwise, do\n+nothing.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn boundschecking.hh:30\n+_\bD_\bu_\bn_\be\n+Dune namespace.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn alignedallocator.hh:13\n+_\bD_\bu_\bn_\be_\b:_\b:_\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx\n+A dense n x m matrix.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn densematrix.hh:140\n+_\bD_\bu_\bn_\be_\b:_\b:_\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bD_\by_\bn_\ba_\bm_\bi_\bc_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bK_\b _\b>_\b _\b>_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b=\n+derived_type & operator=(const RHS &rhs)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn densematrix.hh:279\n+_\bD_\bu_\bn_\be_\b:_\b:_\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bD_\by_\bn_\ba_\bm_\bi_\bc_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bK_\b _\b>_\b _\b>_\b:_\b:_\bM\n+constexpr size_type M() const\n+number of columns\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn densematrix.hh:703\n+_\bD_\bu_\bn_\be_\b:_\b:_\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bD_\by_\bn_\ba_\bm_\bi_\bc_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bK_\b _\b>_\b _\b>_\b:_\b:_\bv_\ba_\bl_\bu_\be_\b__\bt_\by_\bp_\be\n+Traits::value_type value_type\n+export the type representing the field\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn densematrix.hh:157\n+_\bD_\bu_\bn_\be_\b:_\b:_\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bD_\by_\bn_\ba_\bm_\bi_\bc_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bK_\b _\b>_\b _\b>_\b:_\b:_\br_\bo_\bw_\bs\n+constexpr size_type rows() const\n+number of rows\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn densematrix.hh:709\n+_\bD_\bu_\bn_\be_\b:_\b:_\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bD_\by_\bn_\ba_\bm_\bi_\bc_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bK_\b _\b>_\b _\b>_\b:_\b:_\bN\n+constexpr size_type N() const\n+number of rows\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn densematrix.hh:697\n+_\bD_\bu_\bn_\be_\b:_\b:_\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bD_\by_\bn_\ba_\bm_\bi_\bc_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bK_\b _\b>_\b _\b>_\b:_\b:_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be\n+Traits::size_type size_type\n+The type used for the index access and size operation.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn densematrix.hh:166\n+_\bD_\bu_\bn_\be_\b:_\b:_\bD_\by_\bn_\ba_\bm_\bi_\bc_\bM_\ba_\bt_\br_\bi_\bx\n+Construct a matrix with a dynamic size.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn dynmatrix.hh:61\n+_\bD_\bu_\bn_\be_\b:_\b:_\bD_\by_\bn_\ba_\bm_\bi_\bc_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bm_\ba_\bt_\b__\bc_\bo_\bl_\bs\n+size_type mat_cols() const\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn dynmatrix.hh:143\n+_\bD_\bu_\bn_\be_\b:_\b:_\bD_\by_\bn_\ba_\bm_\bi_\bc_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bD_\by_\bn_\ba_\bm_\bi_\bc_\bM_\ba_\bt_\br_\bi_\bx\n+DynamicMatrix(std::initializer_list< DynamicVector< K > > const &ll)\n+Constructor initializing the matrix from a list of vector.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn dynmatrix.hh:80\n+_\bD_\bu_\bn_\be_\b:_\b:_\bD_\by_\bn_\ba_\bm_\bi_\bc_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\br_\bo_\bw_\b__\bt_\by_\bp_\be\n+Base::row_type row_type\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn dynmatrix.hh:67\n+_\bD_\bu_\bn_\be_\b:_\b:_\bD_\by_\bn_\ba_\bm_\bi_\bc_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bt_\br_\ba_\bn_\bs_\bp_\bo_\bs_\be_\bd\n+DynamicMatrix transposed() const\n+Return transposed of the matrix as DynamicMatrix.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn dynmatrix.hh:132\n+_\bD_\bu_\bn_\be_\b:_\b:_\bD_\by_\bn_\ba_\bm_\bi_\bc_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bv_\ba_\bl_\bu_\be_\b__\bt_\by_\bp_\be\n+Base::value_type value_type\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn dynmatrix.hh:66\n+_\bD_\bu_\bn_\be_\b:_\b:_\bD_\by_\bn_\ba_\bm_\bi_\bc_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bm_\ba_\bt_\b__\ba_\bc_\bc_\be_\bs_\bs\n+row_type & mat_access(size_type i)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn dynmatrix.hh:147\n+_\bD_\bu_\bn_\be_\b:_\b:_\bD_\by_\bn_\ba_\bm_\bi_\bc_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be\n+Base::size_type size_type\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn dynmatrix.hh:65\n+_\bD_\bu_\bn_\be_\b:_\b:_\bD_\by_\bn_\ba_\bm_\bi_\bc_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bm_\ba_\bt_\b__\br_\bo_\bw_\bs\n+size_type mat_rows() const\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn dynmatrix.hh:142\n+_\bD_\bu_\bn_\be_\b:_\b:_\bD_\by_\bn_\ba_\bm_\bi_\bc_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bD_\by_\bn_\ba_\bm_\bi_\bc_\bM_\ba_\bt_\br_\bi_\bx\n+DynamicMatrix(T const &rhs)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn dynmatrix.hh:87\n+_\bD_\bu_\bn_\be_\b:_\b:_\bD_\by_\bn_\ba_\bm_\bi_\bc_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bm_\ba_\bt_\b__\ba_\bc_\bc_\be_\bs_\bs\n+const row_type & mat_access(size_type i) const\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn dynmatrix.hh:151\n+_\bD_\bu_\bn_\be_\b:_\b:_\bD_\by_\bn_\ba_\bm_\bi_\bc_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\br_\be_\bs_\bi_\bz_\be\n+void resize(size_type r, size_type c, value_type v=value_type())\n+resize matrix to r \u00c3\u0097 c\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn dynmatrix.hh:106\n+_\bD_\bu_\bn_\be_\b:_\b:_\bD_\by_\bn_\ba_\bm_\bi_\bc_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b=\n+DynamicMatrix & operator=(T const &rhs)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn dynmatrix.hh:116\n+_\bD_\bu_\bn_\be_\b:_\b:_\bD_\by_\bn_\ba_\bm_\bi_\bc_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bD_\by_\bn_\ba_\bm_\bi_\bc_\bM_\ba_\bt_\br_\bi_\bx\n+DynamicMatrix()\n+Default constructor.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn dynmatrix.hh:71\n+_\bD_\bu_\bn_\be_\b:_\b:_\bD_\by_\bn_\ba_\bm_\bi_\bc_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bD_\by_\bn_\ba_\bm_\bi_\bc_\bM_\ba_\bt_\br_\bi_\bx\n+DynamicMatrix(size_type r, size_type c, value_type v=value_type())\n+Constructor initializing the whole matrix with a scalar.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn dynmatrix.hh:74\n+_\bD_\bu_\bn_\be_\b:_\b:_\bD_\by_\bn_\ba_\bm_\bi_\bc_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b=\n+DynamicMatrix & operator=(T scalar)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn dynmatrix.hh:126\n+_\bD_\bu_\bn_\be_\b:_\b:_\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\bV_\be_\bc_\bT_\br_\ba_\bi_\bt_\bs_\b<_\b _\bD_\by_\bn_\ba_\bm_\bi_\bc_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bK_\b _\b>_\b _\b>_\b:_\b:_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be\n+container_type::size_type size_type\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn dynmatrix.hh:45\n+_\bD_\bu_\bn_\be_\b:_\b:_\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\bV_\be_\bc_\bT_\br_\ba_\bi_\bt_\bs_\b<_\b _\bD_\by_\bn_\ba_\bm_\bi_\bc_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bK_\b _\b>_\b _\b>_\b:_\b:_\br_\bo_\bw_\b__\bt_\by_\bp_\be\n+DynamicVector< K > row_type\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn dynmatrix.hh:38\n+_\bD_\bu_\bn_\be_\b:_\b:_\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\bV_\be_\bc_\bT_\br_\ba_\bi_\bt_\bs_\b<_\b _\bD_\by_\bn_\ba_\bm_\bi_\bc_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bK_\b _\b>_\b _\b>_\b:_\b:_\br_\bo_\bw_\b__\br_\be_\bf_\be_\br_\be_\bn_\bc_\be\n+row_type & row_reference\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn dynmatrix.hh:40\n+_\bD_\bu_\bn_\be_\b:_\b:_\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\bV_\be_\bc_\bT_\br_\ba_\bi_\bt_\bs_\b<_\b _\bD_\by_\bn_\ba_\bm_\bi_\bc_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bK_\b _\b>_\b _\b>_\b:_\b:_\bv_\ba_\bl_\bu_\be_\b__\bt_\by_\bp_\be\n+K value_type\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn dynmatrix.hh:44\n+_\bD_\bu_\bn_\be_\b:_\b:_\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\bV_\be_\bc_\bT_\br_\ba_\bi_\bt_\bs_\b<_\b _\bD_\by_\bn_\ba_\bm_\bi_\bc_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bK_\b _\b>_\b _\b>_\b:_\b:_\bd_\be_\br_\bi_\bv_\be_\bd_\b__\bt_\by_\bp_\be\n+DynamicMatrix< K > derived_type\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn dynmatrix.hh:36\n+_\bD_\bu_\bn_\be_\b:_\b:_\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\bV_\be_\bc_\bT_\br_\ba_\bi_\bt_\bs_\b<_\b _\bD_\by_\bn_\ba_\bm_\bi_\bc_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bK_\b _\b>_\b _\b>_\b:_\b:_\bc_\bo_\bn_\bs_\bt_\b__\br_\bo_\bw_\b__\br_\be_\bf_\be_\br_\be_\bn_\bc_\be\n+const row_type & const_row_reference\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn dynmatrix.hh:41\n+_\bD_\bu_\bn_\be_\b:_\b:_\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\bV_\be_\bc_\bT_\br_\ba_\bi_\bt_\bs_\b<_\b _\bD_\by_\bn_\ba_\bm_\bi_\bc_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bK_\b _\b>_\b _\b>_\b:_\b:_\bc_\bo_\bn_\bt_\ba_\bi_\bn_\be_\br_\b__\bt_\by_\bp_\be\n+std::vector< K > container_type\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn dynmatrix.hh:43\n+_\bD_\bu_\bn_\be_\b:_\b:_\bF_\bi_\be_\bl_\bd_\bT_\br_\ba_\bi_\bt_\bs_\b<_\b _\bD_\by_\bn_\ba_\bm_\bi_\bc_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bK_\b _\b>_\b _\b>_\b:_\b:_\br_\be_\ba_\bl_\b__\bt_\by_\bp_\be\n+FieldTraits< K >::real_type real_type\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn dynmatrix.hh:52\n+_\bD_\bu_\bn_\be_\b:_\b:_\bF_\bi_\be_\bl_\bd_\bT_\br_\ba_\bi_\bt_\bs_\b<_\b _\bD_\by_\bn_\ba_\bm_\bi_\bc_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bK_\b _\b>_\b _\b>_\b:_\b:_\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be\n+FieldTraits< K >::field_type field_type\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn dynmatrix.hh:51\n+_\bD_\bu_\bn_\be_\b:_\b:_\bD_\by_\bn_\ba_\bm_\bi_\bc_\bV_\be_\bc_\bt_\bo_\br\n+Construct a vector with a dynamic size.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn dynvector.hh:59\n+_\bD_\bu_\bn_\be_\b:_\b:_\bF_\bi_\be_\bl_\bd_\bT_\br_\ba_\bi_\bt_\bs\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn ftraits.hh:26\n+_\bD_\bu_\bn_\be_\b:_\b:_\bF_\bi_\be_\bl_\bd_\bT_\br_\ba_\bi_\bt_\bs_\b:_\b:_\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be\n+T field_type\n+export the type representing the field\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn ftraits.hh:28\n+_\bD_\bu_\bn_\be_\b:_\b:_\bF_\bi_\be_\bl_\bd_\bT_\br_\ba_\bi_\bt_\bs_\b:_\b:_\br_\be_\ba_\bl_\b__\bt_\by_\bp_\be\n+T real_type\n+export the type representing the real type of the field\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn ftraits.hh:30\n+_\bD_\bu_\bn_\be_\b:_\b:_\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\bV_\be_\bc_\bT_\br_\ba_\bi_\bt_\bs\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matvectraits.hh:31\n ===============================================================================\n Generated by\u00a0_\b[_\bd_\bo_\bx_\by_\bg_\be_\bn_\b] 1.9.8\n"}]}, {"source1": "./usr/share/doc/libdune-common-doc/doxygen/a00128.html", "source2": "./usr/share/doc/libdune-common-doc/doxygen/a00128.html", "unified_diff": "@@ -1,15 +1,15 @@\n \n \n \n \n \n \n \n-dune-common: layout_stride.hh File Reference\n+dune-common: stringutility.hh File Reference\n \n \n \n \n \n \n \n@@ -65,46 +65,62 @@\n
    \n
    \n \n \n \n \n \n
    \n \n-
    layout_stride.hh File Reference
    \n+Namespaces |\n+Functions
    \n+
    stringutility.hh File Reference
    \n \n
    \n-
    #include <array>
    \n-#include <type_traits>
    \n-#include <dune/common/indices.hh>
    \n-#include <dune/common/std/impl/fwd_layouts.hh>
    \n+\n+

    Miscellaneous helper stuff. \n+More...

    \n+
    #include <cstddef>
    \n+#include <cstring>
    \n+#include <algorithm>
    \n+#include <cassert>
    \n+#include <cstdio>
    \n+#include <memory>
    \n+#include <string>
    \n+#include <new>
    \n+#include <dune/common/exceptions.hh>
    \n
    \n

    Go to the source code of this file.

    \n \n-\n-\n-\n-\n-

    \n-Classes

    class  Dune::Std::layout_stride::mapping< Extents >
     A layout mapping where the strides are user-defined. More...
     
    \n \n \n \n \n-\n-\n-\n+

    \n Namespaces

    namespace  Dune
     Dune namespace.
     
    namespace  Dune::Std
     Namespace for features backported from new C++ standards.
     
    \n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n

    \n+Functions

    template<typename C >
    bool Dune::hasPrefix (const C &c, const char *prefix)
     Check whether a character container has a given prefix.
     
    template<typename C >
    bool Dune::hasSuffix (const C &c, const char *suffix)
     Check whether a character container has a given suffix.
     
    template<class... T>
    static std::string Dune::formatString (const std::string &s, const T &... args)
     Format values according to printf format string.
     
    \n-
    \n+

    Detailed Description

    \n+

    Miscellaneous helper stuff.

    \n+
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,27 +1,41 @@\n dune-common\u00a02.10\n Loading...\n Searching...\n No Matches\n * _\bd_\bu_\bn_\be\n * _\bc_\bo_\bm_\bm_\bo_\bn\n- * _\bs_\bt_\bd\n-_\bC_\bl_\ba_\bs_\bs_\be_\bs | _\bN_\ba_\bm_\be_\bs_\bp_\ba_\bc_\be_\bs\n-layout_stride.hh File Reference\n-#include \n-#include \n-#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bi_\bn_\bd_\bi_\bc_\be_\bs_\b._\bh_\bh>\n-#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bs_\bt_\bd_\b/_\bi_\bm_\bp_\bl_\b/_\bf_\bw_\bd_\b__\bl_\ba_\by_\bo_\bu_\bt_\bs_\b._\bh_\bh>\n+_\bN_\ba_\bm_\be_\bs_\bp_\ba_\bc_\be_\bs | _\bF_\bu_\bn_\bc_\bt_\bi_\bo_\bn_\bs\n+stringutility.hh File Reference\n+Miscellaneous helper stuff. _\bM_\bo_\br_\be_\b._\b._\b.\n+#include \n+#include \n+#include \n+#include \n+#include \n+#include \n+#include \n+#include \n+#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\be_\bx_\bc_\be_\bp_\bt_\bi_\bo_\bn_\bs_\b._\bh_\bh>\n _\bG_\bo_\b _\bt_\bo_\b _\bt_\bh_\be_\b _\bs_\bo_\bu_\br_\bc_\be_\b _\bc_\bo_\bd_\be_\b _\bo_\bf_\b _\bt_\bh_\bi_\bs_\b _\bf_\bi_\bl_\be_\b.\n-C\bCl\bla\bas\bss\bse\bes\bs\n-class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bS_\bt_\bd_\b:_\b:_\bl_\ba_\by_\bo_\bu_\bt_\b__\bs_\bt_\br_\bi_\bd_\be_\b:_\b:_\bm_\ba_\bp_\bp_\bi_\bn_\bg_\b<_\b _\bE_\bx_\bt_\be_\bn_\bt_\bs_\b _\b>\n-\u00a0 A layout mapping where the strides are user-defined. _\bM_\bo_\br_\be_\b._\b._\b.\n-\u00a0\n N\bNa\bam\bme\bes\bsp\bpa\bac\bce\bes\bs\n namespace \u00a0 _\bD_\bu_\bn_\be\n \u00a0 _\bD_\bu_\bn_\be namespace.\n \u00a0\n-namespace \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bS_\bt_\bd\n-\u00a0 Namespace for features backported from new C++ standards.\n+F\bFu\bun\bnc\bct\bti\bio\bon\bns\bs\n+template\n+ bool\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bh_\ba_\bs_\bP_\br_\be_\bf_\bi_\bx (const C &c, const char *prefix)\n+\u00a0 Check whether a character container has a given prefix.\n+\u00a0\n+template\n+ bool\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bh_\ba_\bs_\bS_\bu_\bf_\bf_\bi_\bx (const C &c, const char *suffix)\n+\u00a0 Check whether a character container has a given suffix.\n+\u00a0\n+template\n+static std::string\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bf_\bo_\br_\bm_\ba_\bt_\bS_\bt_\br_\bi_\bn_\bg (const std::string &s, const T &...\n+ args)\n+\u00a0 Format values according to printf format string.\n \u00a0\n+*\b**\b**\b**\b**\b* D\bDe\bet\bta\bai\bil\ble\bed\bd D\bDe\bes\bsc\bcr\bri\bip\bpt\bti\bio\bon\bn *\b**\b**\b**\b**\b*\n+Miscellaneous helper stuff.\n ===============================================================================\n Generated by\u00a0_\b[_\bd_\bo_\bx_\by_\bg_\be_\bn_\b] 1.9.8\n"}]}, {"source1": "./usr/share/doc/libdune-common-doc/doxygen/a00128_source.html", "source2": "./usr/share/doc/libdune-common-doc/doxygen/a00128_source.html", "unified_diff": "@@ -1,15 +1,15 @@\n \n \n \n \n \n \n \n-dune-common: layout_stride.hh Source File\n+dune-common: stringutility.hh Source File\n \n \n \n \n \n \n \n@@ -70,256 +70,113 @@\n \n \n \n \n \n \n \n
    \n-
    layout_stride.hh
    \n+
    stringutility.hh
    \n
    \n
    \n Go to the documentation of this file.
    1// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
    \n
    2// vi: set et ts=4 sw=2 sts=2:
    \n
    3// SPDX-FileCopyrightInfo: Copyright \u00a9 DUNE Project contributors, see file LICENSE.md in module root
    \n
    4// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception
    \n-
    5#ifndef DUNE_COMMON_STD_LAYOUT_STRIDE_HH
    \n-
    6#define DUNE_COMMON_STD_LAYOUT_STRIDE_HH
    \n+
    5#ifndef DUNE_COMMON_STRINGUTILITY_HH
    \n+
    6#define DUNE_COMMON_STRINGUTILITY_HH
    \n
    7
    \n-
    8#include <array>
    \n-
    9#include <type_traits>
    \n-
    10
    \n-\n-\n-
    13
    \n-
    14namespace Dune::Std {
    \n-
    15
    \n-
    17template <class Extents>
    \n-
    \n-\n-
    19{
    \n-
    20 template <class> friend class mapping;
    \n-
    21 static constexpr typename Extents::rank_type rank_ = Extents::rank();
    \n+
    12#include <cstddef>
    \n+
    13#include <cstring>
    \n+
    14#include <algorithm>
    \n+
    15#include <cassert>
    \n+
    16#include <cstdio>
    \n+
    17#include <memory>
    \n+
    18#include <string>
    \n+
    19#include <new>
    \n+
    20
    \n+\n
    22
    \n-
    23public:
    \n-
    24 using extents_type = Extents;
    \n-
    25 using index_type = typename extents_type::index_type;
    \n-
    26 using size_type = typename extents_type::size_type;
    \n-
    27 using rank_type = typename extents_type::rank_type;
    \n-\n-
    29
    \n-
    30private:
    \n-
    31 using strides_type = std::array<index_type,rank_>;
    \n-
    32
    \n-
    33public:
    \n-
    34
    \n-
    \n-
    36 constexpr mapping () noexcept
    \n-\n-
    38 {}
    \n+
    23
    \n+
    24namespace Dune {
    \n+
    25
    \n+
    36 template<typename C>
    \n+
    \n+
    37 bool hasPrefix(const C& c, const char* prefix) {
    \n+
    38 std::size_t len = std::strlen(prefix);
    \n+
    39 return c.size() >= len &&
    \n+
    40 std::equal(prefix, prefix+len, c.begin());
    \n+
    41 }
    \n
    \n-
    39
    \n-
    41 constexpr mapping (const mapping&) noexcept = default;
    \n
    42
    \n-
    44 template <class OtherIndexType,
    \n-
    45 std::enable_if_t<std::is_convertible_v<const OtherIndexType&, index_type>, int> = 0,
    \n-
    46 std::enable_if_t<std::is_nothrow_constructible_v<index_type, const OtherIndexType&>, int> = 0>
    \n-
    \n-
    47 constexpr mapping (const extents_type& e, const std::array<OtherIndexType,rank_>& s) noexcept
    \n-
    48 : extents_(e)
    \n-
    49 , strides_{}
    \n-
    50 {
    \n-
    51 for (rank_type r = 0; r < rank_; ++r)
    \n-
    52 strides_[r] = s[r];
    \n-
    53 }
    \n-
    \n-
    54
    \n-
    56 template <class OtherIndexType,
    \n-
    57 std::enable_if_t<std::is_convertible_v<const OtherIndexType&, index_type>, int> = 0,
    \n-
    58 std::enable_if_t<std::is_nothrow_constructible_v<index_type, const OtherIndexType&>, int> = 0>
    \n-
    \n-
    59 constexpr mapping (const extents_type& e, const span<OtherIndexType,rank_>& s) noexcept
    \n-
    60 : extents_(e)
    \n-
    61 , strides_{}
    \n-
    62 {
    \n-
    63 for (rank_type r = 0; r < rank_; ++r)
    \n-
    64 strides_[r] = s[r];
    \n-
    65 }
    \n-
    \n-
    66
    \n-
    68 template <class M,
    \n-
    69 std::enable_if_t<(M::extents_type::rank() == extents_type::rank()), int> = 0,
    \n-
    70 std::enable_if_t<(M::is_always_unique()), int> = 0,
    \n-
    71 std::enable_if_t<(M::is_always_strided()), int> = 0,
    \n-
    72 decltype(std::declval<M>().extents(), bool{}) = true,
    \n-
    73 decltype(std::declval<M>().stride(std::declval<rank_type>()), bool{}) = true>
    \n-
    \n-
    74 constexpr mapping (const M& m) noexcept
    \n-
    75 : extents_(m.extents())
    \n-
    76 , strides_{}
    \n-
    77 {
    \n-
    78 for (rank_type r = 0; r < rank_; ++r)
    \n-
    79 strides_[r] = m.stride(r);
    \n-
    80 }
    \n-
    \n-
    81
    \n-
    83 constexpr mapping& operator= (const mapping&) noexcept = default;
    \n+
    52 template<typename C>
    \n+
    \n+
    53 bool hasSuffix(const C& c, const char* suffix) {
    \n+
    54 std::size_t len = std::strlen(suffix);
    \n+
    55 if(c.size() < len) return false;
    \n+
    56 typename C::const_iterator it = c.begin();
    \n+
    57 std::advance(it, c.size() - len);
    \n+
    58 return std::equal(suffix, suffix+len, it);
    \n+
    59 }
    \n+
    \n+
    60
    \n+
    72 template<class... T>
    \n+
    \n+
    73 static std::string formatString(const std::string& s, const T&... args)
    \n+
    74 {
    \n+
    75 static const int bufferSize=1000;
    \n+
    76 char buffer[bufferSize];
    \n+
    77
    \n+
    78 // try to format with static buffer
    \n+
    79 int r = std::snprintf(buffer, bufferSize, s.c_str(), args...);
    \n+
    80
    \n+
    81 // negative return values correspond to errors
    \n+
    82 if (r<0)
    \n+
    83 DUNE_THROW(Dune::Exception,"Could not convert format string using given arguments.");
    \n
    84
    \n-
    85 constexpr const extents_type& extents () const noexcept { return extents_; }
    \n-
    86
    \n-
    \n-
    88 constexpr index_type required_span_size () const noexcept
    \n-
    89 {
    \n-
    90 return size(extents_,strides_);
    \n-
    91 }
    \n-
    \n+
    85 // if buffer was large enough return result as string
    \n+
    86 if (r<bufferSize)
    \n+
    87 return std::string(buffer);
    \n+
    88
    \n+
    89 // if buffer was to small allocate a larger buffer using
    \n+
    90 // the predicted size hint (+1 for the terminating 0-byte).
    \n+
    91 int dynamicBufferSize = r+1;
    \n
    92
    \n-
    94 template <class... Indices,
    \n-
    95 std::enable_if_t<(sizeof...(Indices) == rank_), int> = 0,
    \n-
    96 std::enable_if_t<(std::is_convertible_v<Indices, index_type> && ...), int> = 0,
    \n-
    97 std::enable_if_t<(std::is_nothrow_constructible_v<index_type, Indices> && ...), int> = 0>
    \n-
    \n-
    98 constexpr index_type operator() (Indices... ii) const noexcept
    \n-
    99 {
    \n-
    100 return unpackIntegerSequence([&](auto... r) {
    \n-
    101 return ((static_cast<index_type>(ii)*strides_[r]) + ... + 0); },
    \n-
    102 std::make_index_sequence<rank_>{});
    \n-
    103 }
    \n-
    \n-
    104
    \n-
    \n-
    106 constexpr index_type operator() () const noexcept
    \n-
    107 {
    \n-
    108 return 0;
    \n-
    109 }
    \n+
    93 std::unique_ptr<char[]> dynamicBuffer;
    \n+
    94 try {
    \n+
    95 dynamicBuffer = std::make_unique<char[]>(dynamicBufferSize);
    \n+
    96 }
    \n+
    97 catch (const std::bad_alloc&) {
    \n+
    98 DUNE_THROW(Dune::Exception,"Could allocate large enough dynamic buffer in formatString.");
    \n+
    99 }
    \n+
    100
    \n+
    101 // convert and check for errors again
    \n+
    102 r = std::snprintf(dynamicBuffer.get(), dynamicBufferSize, s.c_str(), args...);
    \n+
    103 if (r<0)
    \n+
    104 DUNE_THROW(Dune::Exception,"Could not convert format string using given arguments.");
    \n+
    105
    \n+
    106 // the new buffer should always be large enough
    \n+
    107 assert(r<dynamicBufferSize);
    \n+
    108
    \n+
    109 return std::string(dynamicBuffer.get());
    \n+
    110 }
    \n
    \n-
    110
    \n-
    111 static constexpr bool is_always_unique () noexcept { return true; }
    \n-
    112 static constexpr bool is_always_exhaustive () noexcept { return false; }
    \n-
    113 static constexpr bool is_always_strided () noexcept { return true; }
    \n+
    113}
    \n
    114
    \n-
    115 static constexpr bool is_unique () noexcept { return true; }
    \n-
    116 static constexpr bool is_strided () noexcept { return true; }
    \n-
    117
    \n-
    \n-
    118 constexpr bool is_exhaustive () const noexcept
    \n-
    119 {
    \n-
    120 // Actually this could be improved. A strided layout can still be exhaustive.
    \n-
    121 // This test is more complicated to implement, though. See \u00a724.7.3.4.7.4 line (5.2)
    \n-
    122 // in the C++ standard document N4971
    \n-
    123 return extents_type::rank() == 0 || (required_span_size() > 0 && required_span_size() == extents().product());
    \n-
    124 }
    \n-
    \n-
    125
    \n-
    \n-
    127 constexpr const strides_type& strides () const noexcept
    \n-
    128 {
    \n-
    129 return strides_;
    \n-
    130 }
    \n-
    \n-
    131
    \n-
    133 template <class E = extents_type,
    \n-
    134 std::enable_if_t<(E::rank() > 0), int> = 0>
    \n-
    \n-
    135 constexpr index_type stride (rank_type i) const noexcept
    \n-
    136 {
    \n-
    137 return strides_[i];
    \n-
    138 }
    \n-
    \n-
    139
    \n-
    140 template <class OtherMapping,
    \n-
    141 std::enable_if_t<(OtherMapping::extents_type::rank() == extents_type::rank()), int> = 0,
    \n-
    142 std::enable_if_t<(OtherMapping::is_always_strided()), int> = 0>
    \n-
    \n-
    143 friend constexpr bool operator== (const mapping& a, const OtherMapping& b) noexcept
    \n-
    144 {
    \n-
    145 if (offset(b))
    \n-
    146 return false;
    \n-
    147 if constexpr(extents_type::rank() == 0)
    \n-
    148 return true;
    \n-
    149 return a.extents_ == b.extents_ && a.strides_ == b.strides_;
    \n-
    150 }
    \n-
    \n-
    151
    \n-
    152private:
    \n-
    153 template <class E, class S>
    \n-
    154 static constexpr index_type size (const E& extents, const S& strides) noexcept
    \n-
    155 {
    \n-
    156 if constexpr (E::rank() == 0)
    \n-
    157 return 1;
    \n-
    158 else {
    \n-
    159 if (extents.product() == 0)
    \n-
    160 return 0;
    \n-
    161 else {
    \n-
    162 index_type result = 1;
    \n-
    163 for (rank_type r = 0; r < E::rank(); ++r)
    \n-
    164 result += (extents.extent(r)-1) * strides[r];
    \n-
    165 return result;
    \n-
    166 }
    \n-
    167 }
    \n-
    168 }
    \n-
    169
    \n-
    170 template <class M>
    \n-
    171 static constexpr size_type offset (const M& m) noexcept
    \n-
    172 {
    \n-
    173 if constexpr (M::extents_type::rank() == 0)
    \n-
    174 return m();
    \n-
    175 else {
    \n-
    176 if (m.required_span_size() == 0)
    \n-
    177 return 0;
    \n-
    178 else {
    \n-
    179 return unpackIntegerSequence([&](auto... r) {
    \n-
    180 return m((r,0)...); }, // map the index tuple (0,0...)
    \n-
    181 std::make_index_sequence<M::extents_type::rank()>{});
    \n-
    182 }
    \n-
    183 }
    \n-
    184 }
    \n-
    185
    \n-
    186private:
    \n-
    187 [[no_unique_address]] extents_type extents_;
    \n-
    188 strides_type strides_;
    \n-
    189};
    \n-
    \n-
    190
    \n-
    191} // end namespace Dune::Std
    \n-
    192
    \n-
    193#endif // DUNE_COMMON_STD_LAYOUT_STRIDE_HH
    \n-\n-\n-
    decltype(auto) constexpr unpackIntegerSequence(F &&f, std::integer_sequence< I, i... > sequence)
    Unpack an std::integer_sequence<I,i...> to std::integral_constant<I,i>...
    Definition indices.hh:124
    \n-
    Namespace for features backported from new C++ standards.
    Definition default_accessor.hh:10
    \n-
    Multidimensional index space with dynamic and static extents.
    Definition extents.hh:54
    \n-
    constexpr index_type extent(rank_type r) const noexcept
    Return the extent of dimension i
    Definition extents.hh:100
    \n-
    A layout where the rightmost extent has stride 1, and strides increase right-to-left as the product o...
    Definition fwd_layouts.hh:30
    \n-
    A layout mapping where the strides are user-defined.
    Definition fwd_layouts.hh:40
    \n-
    A layout mapping where the strides are user-defined.
    Definition layout_stride.hh:19
    \n-
    constexpr mapping(const extents_type &e, const span< OtherIndexType, rank_ > &s) noexcept
    Construct the mapping from given extents and strides.
    Definition layout_stride.hh:59
    \n-
    Extents extents_type
    Definition layout_stride.hh:24
    \n-
    constexpr mapping & operator=(const mapping &) noexcept=default
    Copy-assignment for the mapping.
    \n-
    constexpr bool is_exhaustive() const noexcept
    Definition layout_stride.hh:118
    \n-
    constexpr mapping() noexcept
    The default construction initializes the strides from layout_right.
    Definition layout_stride.hh:36
    \n-
    constexpr mapping(const extents_type &e, const std::array< OtherIndexType, rank_ > &s) noexcept
    Construct the mapping from given extents and strides.
    Definition layout_stride.hh:47
    \n-
    constexpr index_type stride(rank_type i) const noexcept
    Get the single stride i
    Definition layout_stride.hh:135
    \n-
    typename extents_type::index_type index_type
    Definition layout_stride.hh:25
    \n-
    static constexpr bool is_always_exhaustive() noexcept
    Definition layout_stride.hh:112
    \n-
    constexpr const extents_type & extents() const noexcept
    Definition layout_stride.hh:85
    \n-
    static constexpr bool is_strided() noexcept
    Definition layout_stride.hh:116
    \n-
    static constexpr bool is_always_strided() noexcept
    Definition layout_stride.hh:113
    \n-
    constexpr index_type required_span_size() const noexcept
    Return the sum 1 + (E(0)-1)*S(0) + (E(1)-1)*S(1) + ...
    Definition layout_stride.hh:88
    \n-
    constexpr const strides_type & strides() const noexcept
    Get the array of all strides.
    Definition layout_stride.hh:127
    \n-
    constexpr mapping(const mapping &) noexcept=default
    Copy constructor for the mapping.
    \n-
    typename extents_type::rank_type rank_type
    Definition layout_stride.hh:27
    \n-
    static constexpr bool is_unique() noexcept
    Definition layout_stride.hh:115
    \n-
    constexpr index_type operator()() const noexcept
    The default offset for rank-0 tensors is 0.
    Definition layout_stride.hh:106
    \n-
    typename extents_type::size_type size_type
    Definition layout_stride.hh:26
    \n-
    static constexpr bool is_always_unique() noexcept
    Definition layout_stride.hh:111
    \n-
    A contiguous sequence of elements with static or dynamic extent.
    Definition span.hh:126
    \n+
    115#endif // DUNE_COMMON_STRINGUTILITY_HH
    \n+
    A few common exception classes.
    \n+
    bool hasSuffix(const C &c, const char *suffix)
    Check whether a character container has a given suffix.
    Definition stringutility.hh:53
    \n+
    static std::string formatString(const std::string &s, const T &... args)
    Format values according to printf format string.
    Definition stringutility.hh:73
    \n+
    bool hasPrefix(const C &c, const char *prefix)
    Check whether a character container has a given prefix.
    Definition stringutility.hh:37
    \n+
    #define DUNE_THROW(E, m)
    Definition exceptions.hh:218
    \n+
    Dune namespace.
    Definition alignedallocator.hh:13
    \n+
    Base class for Dune-Exceptions.
    Definition exceptions.hh:96
    \n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,308 +1,117 @@\n dune-common\u00a02.10\n Loading...\n Searching...\n No Matches\n * _\bd_\bu_\bn_\be\n * _\bc_\bo_\bm_\bm_\bo_\bn\n- * _\bs_\bt_\bd\n-layout_stride.hh\n+stringutility.hh\n _\bG_\bo_\b _\bt_\bo_\b _\bt_\bh_\be_\b _\bd_\bo_\bc_\bu_\bm_\be_\bn_\bt_\ba_\bt_\bi_\bo_\bn_\b _\bo_\bf_\b _\bt_\bh_\bi_\bs_\b _\bf_\bi_\bl_\be_\b.\n 1// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-\n 2// vi: set et ts=4 sw=2 sts=2:\n 3// SPDX-FileCopyrightInfo: Copyright \u00c2\u00a9 DUNE Project contributors, see file\n LICENSE.md in module root\n 4// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception\n-5#ifndef DUNE_COMMON_STD_LAYOUT_STRIDE_HH\n-6#define DUNE_COMMON_STD_LAYOUT_STRIDE_HH\n+5#ifndef DUNE_COMMON_STRINGUTILITY_HH\n+6#define DUNE_COMMON_STRINGUTILITY_HH\n 7\n-8#include \n-9#include \n-10\n-11#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bi_\bn_\bd_\bi_\bc_\be_\bs_\b._\bh_\bh>\n-12#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bs_\bt_\bd_\b/_\bi_\bm_\bp_\bl_\b/_\bf_\bw_\bd_\b__\bl_\ba_\by_\bo_\bu_\bt_\bs_\b._\bh_\bh>\n-13\n-14namespace _\bD_\bu_\bn_\be_\b:_\b:_\bS_\bt_\bd {\n-15\n-17template \n-_\b1_\b8class _\bl_\ba_\by_\bo_\bu_\bt_\b__\bs_\bt_\br_\bi_\bd_\be_\b:_\b:_\bm_\ba_\bp_\bp_\bi_\bn_\bg\n-19{\n-_\b2_\b0 template friend class _\bm_\ba_\bp_\bp_\bi_\bn_\bg;\n-21 static constexpr typename Extents::rank_type rank_ = Extents::rank();\n+12#include \n+13#include \n+14#include \n+15#include \n+16#include \n+17#include \n+18#include \n+19#include \n+20\n+21#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\be_\bx_\bc_\be_\bp_\bt_\bi_\bo_\bn_\bs_\b._\bh_\bh>\n 22\n-23public:\n-_\b2_\b4 using _\be_\bx_\bt_\be_\bn_\bt_\bs_\b__\bt_\by_\bp_\be = Extents;\n-_\b2_\b5 using _\bi_\bn_\bd_\be_\bx_\b__\bt_\by_\bp_\be = typename extents_type::index_type;\n-_\b2_\b6 using _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be = typename extents_type::size_type;\n-_\b2_\b7 using _\br_\ba_\bn_\bk_\b__\bt_\by_\bp_\be = typename extents_type::rank_type;\n-_\b2_\b8 using _\bl_\ba_\by_\bo_\bu_\bt_\b__\bt_\by_\bp_\be = _\bl_\ba_\by_\bo_\bu_\bt_\b__\bs_\bt_\br_\bi_\bd_\be;\n-29\n-30private:\n-31 using strides_type = std::array;\n-32\n-33public:\n-34\n-_\b3_\b6 constexpr _\bm_\ba_\bp_\bp_\bi_\bn_\bg () noexcept\n-37 : _\bm_\ba_\bp_\bp_\bi_\bn_\bg(_\bl_\ba_\by_\bo_\bu_\bt_\b__\br_\bi_\bg_\bh_\bt::template _\bm_\ba_\bp_\bp_\bi_\bn_\bg<_\be_\bx_\bt_\be_\bn_\bt_\bs_\b__\bt_\by_\bp_\be>{})\n-38 {}\n-39\n-_\b4_\b1 constexpr _\bm_\ba_\bp_\bp_\bi_\bn_\bg (const _\bm_\ba_\bp_\bp_\bi_\bn_\bg&) noexcept = default;\n+23\n+24namespace _\bD_\bu_\bn_\be {\n+25\n+36 template\n+_\b3_\b7 bool _\bh_\ba_\bs_\bP_\br_\be_\bf_\bi_\bx(const C& c, const char* prefix) {\n+38 std::size_t len = std::strlen(prefix);\n+39 return c.size() >= len &&\n+40 std::equal(prefix, prefix+len, c.begin());\n+41 }\n 42\n-44 template ,\n-int> = 0,\n-46 std::enable_if_t, int> = 0>\n-_\b4_\b7 constexpr _\bm_\ba_\bp_\bp_\bi_\bn_\bg (const _\be_\bx_\bt_\be_\bn_\bt_\bs_\b__\bt_\by_\bp_\be& e, const std::\n-array& s) noexcept\n-48 : extents_(e)\n-49 , strides_{}\n-50 {\n-51 for (_\br_\ba_\bn_\bk_\b__\bt_\by_\bp_\be r = 0; r < rank_; ++r)\n-52 strides_[r] = s[r];\n-53 }\n-54\n-56 template ,\n-int> = 0,\n-58 std::enable_if_t, int> = 0>\n-_\b5_\b9 constexpr _\bm_\ba_\bp_\bp_\bi_\bn_\bg (const _\be_\bx_\bt_\be_\bn_\bt_\bs_\b__\bt_\by_\bp_\be& e, const _\bs_\bp_\ba_\bn_\b<_\bO_\bt_\bh_\be_\br_\bI_\bn_\bd_\be_\bx_\bT_\by_\bp_\be_\b,_\br_\ba_\bn_\bk_\b__\b>&\n-s) noexcept\n-60 : extents_(e)\n-61 , strides_{}\n-62 {\n-63 for (_\br_\ba_\bn_\bk_\b__\bt_\by_\bp_\be r = 0; r < rank_; ++r)\n-64 strides_[r] = s[r];\n-65 }\n-66\n-68 template =\n-0,\n-70 std::enable_if_t<(M::is_always_unique()), int> = 0,\n-71 std::enable_if_t<(M::is_always_strided()), int> = 0,\n-72 decltype(std::declval().extents(), bool{}) = true,\n-73 decltype(std::declval().stride(std::declval()), bool{}) =\n-true>\n-_\b7_\b4 constexpr _\bm_\ba_\bp_\bp_\bi_\bn_\bg (const M& m) noexcept\n-75 : extents_(m.extents())\n-76 , strides_{}\n-77 {\n-78 for (_\br_\ba_\bn_\bk_\b__\bt_\by_\bp_\be r = 0; r < rank_; ++r)\n-79 strides_[r] = m._\bs_\bt_\br_\bi_\bd_\be(r);\n-80 }\n-81\n-_\b8_\b3 constexpr _\bm_\ba_\bp_\bp_\bi_\bn_\bg& _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b=_\b (const _\bm_\ba_\bp_\bp_\bi_\bn_\bg&) noexcept = default;\n+52 template\n+_\b5_\b3 bool _\bh_\ba_\bs_\bS_\bu_\bf_\bf_\bi_\bx(const C& c, const char* suffix) {\n+54 std::size_t len = std::strlen(suffix);\n+55 if(c.size() < len) return false;\n+56 typename C::const_iterator it = c.begin();\n+57 std::advance(it, c.size() - len);\n+58 return std::equal(suffix, suffix+len, it);\n+59 }\n+60\n+72 template\n+_\b7_\b3 static std::string _\bf_\bo_\br_\bm_\ba_\bt_\bS_\bt_\br_\bi_\bn_\bg(const std::string& s, const T&... args)\n+74 {\n+75 static const int bufferSize=1000;\n+76 char buffer[bufferSize];\n+77\n+78 // try to format with static buffer\n+79 int r = std::snprintf(buffer, bufferSize, s.c_str(), args...);\n+80\n+81 // negative return values correspond to errors\n+82 if (r<0)\n+83 _\bD_\bU_\bN_\bE_\b__\bT_\bH_\bR_\bO_\bW(_\bD_\bu_\bn_\be_\b:_\b:_\bE_\bx_\bc_\be_\bp_\bt_\bi_\bo_\bn,\"Could not convert format string using given\n+arguments.\");\n 84\n-_\b8_\b5 constexpr const _\be_\bx_\bt_\be_\bn_\bt_\bs_\b__\bt_\by_\bp_\be& _\be_\bx_\bt_\be_\bn_\bt_\bs () const noexcept { return extents_; }\n-86\n-_\b8_\b8 constexpr _\bi_\bn_\bd_\be_\bx_\b__\bt_\by_\bp_\be _\br_\be_\bq_\bu_\bi_\br_\be_\bd_\b__\bs_\bp_\ba_\bn_\b__\bs_\bi_\bz_\be () const noexcept\n-89 {\n-90 return size(extents_,strides_);\n-91 }\n+85 // if buffer was large enough return result as string\n+86 if (r = 0,\n-96 std::enable_if_t<(std::is_convertible_v && ...), int> =\n-0,\n-97 std::enable_if_t<(std::is_nothrow_constructible_v &&\n-...), int> = 0>\n-_\b9_\b8 constexpr _\bi_\bn_\bd_\be_\bx_\b__\bt_\by_\bp_\be _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b(_\b)_\b (Indices... ii) const noexcept\n-99 {\n-100 return _\bu_\bn_\bp_\ba_\bc_\bk_\bI_\bn_\bt_\be_\bg_\be_\br_\bS_\be_\bq_\bu_\be_\bn_\bc_\be([&](auto... r) {\n-101 return ((static_cast<_\bi_\bn_\bd_\be_\bx_\b__\bt_\by_\bp_\be>(ii)*strides_[r]) + ... + 0); },\n-102 std::make_index_sequence{});\n-103 }\n-104\n-_\b1_\b0_\b6 constexpr _\bi_\bn_\bd_\be_\bx_\b__\bt_\by_\bp_\be _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b(_\b)_\b () const noexcept\n-107 {\n-108 return 0;\n-109 }\n-110\n-_\b1_\b1_\b1 static constexpr bool _\bi_\bs_\b__\ba_\bl_\bw_\ba_\by_\bs_\b__\bu_\bn_\bi_\bq_\bu_\be () noexcept { return true; }\n-_\b1_\b1_\b2 static constexpr bool _\bi_\bs_\b__\ba_\bl_\bw_\ba_\by_\bs_\b__\be_\bx_\bh_\ba_\bu_\bs_\bt_\bi_\bv_\be () noexcept { return false; }\n-_\b1_\b1_\b3 static constexpr bool _\bi_\bs_\b__\ba_\bl_\bw_\ba_\by_\bs_\b__\bs_\bt_\br_\bi_\bd_\be_\bd () noexcept { return true; }\n+93 std::unique_ptr dynamicBuffer;\n+94 try {\n+95 dynamicBuffer = std::make_unique(dynamicBufferSize);\n+96 }\n+97 catch (const std::bad_alloc&) {\n+98 _\bD_\bU_\bN_\bE_\b__\bT_\bH_\bR_\bO_\bW(_\bD_\bu_\bn_\be_\b:_\b:_\bE_\bx_\bc_\be_\bp_\bt_\bi_\bo_\bn,\"Could allocate large enough dynamic buffer in\n+formatString.\");\n+99 }\n+100\n+101 // convert and check for errors again\n+102 r = std::snprintf(dynamicBuffer.get(), dynamicBufferSize, s.c_str(),\n+args...);\n+103 if (r<0)\n+104 _\bD_\bU_\bN_\bE_\b__\bT_\bH_\bR_\bO_\bW(_\bD_\bu_\bn_\be_\b:_\b:_\bE_\bx_\bc_\be_\bp_\bt_\bi_\bo_\bn,\"Could not convert format string using given\n+arguments.\");\n+105\n+106 // the new buffer should always be large enough\n+107 assert(r 0 &&\n-_\br_\be_\bq_\bu_\bi_\br_\be_\bd_\b__\bs_\bp_\ba_\bn_\b__\bs_\bi_\bz_\be() == _\be_\bx_\bt_\be_\bn_\bt_\bs().product());\n-124 }\n-125\n-_\b1_\b2_\b7 constexpr const strides_type& _\bs_\bt_\br_\bi_\bd_\be_\bs () const noexcept\n-128 {\n-129 return strides_;\n-130 }\n-131\n-133 template 0), int> = 0>\n-_\b1_\b3_\b5 constexpr _\bi_\bn_\bd_\be_\bx_\b__\bt_\by_\bp_\be _\bs_\bt_\br_\bi_\bd_\be (_\br_\ba_\bn_\bk_\b__\bt_\by_\bp_\be i) const noexcept\n-136 {\n-137 return strides_[i];\n-138 }\n-139\n-140 template = 0,\n-142 std::enable_if_t<(OtherMapping::is_always_strided()), int> = 0>\n-_\b1_\b4_\b3 friend constexpr bool operator== (const _\bm_\ba_\bp_\bp_\bi_\bn_\bg& a, const OtherMapping& b)\n-noexcept\n-144 {\n-145 if (offset(b))\n-146 return false;\n-147 if constexpr(extents_type::rank() == 0)\n-148 return true;\n-149 return a.extents_ == b.extents_ && a.strides_ == b.strides_;\n-150 }\n-151\n-152private:\n-153 template \n-154 static constexpr _\bi_\bn_\bd_\be_\bx_\b__\bt_\by_\bp_\be size (const E& _\be_\bx_\bt_\be_\bn_\bt_\bs, const S& _\bs_\bt_\br_\bi_\bd_\be_\bs)\n-noexcept\n-155 {\n-156 if constexpr (E::rank() == 0)\n-157 return 1;\n-158 else {\n-159 if (_\be_\bx_\bt_\be_\bn_\bt_\bs.product() == 0)\n-160 return 0;\n-161 else {\n-162 _\bi_\bn_\bd_\be_\bx_\b__\bt_\by_\bp_\be result = 1;\n-163 for (_\br_\ba_\bn_\bk_\b__\bt_\by_\bp_\be r = 0; r < E::rank(); ++r)\n-164 result += (_\be_\bx_\bt_\be_\bn_\bt_\bs._\be_\bx_\bt_\be_\bn_\bt(r)-1) * _\bs_\bt_\br_\bi_\bd_\be_\bs[r];\n-165 return result;\n-166 }\n-167 }\n-168 }\n-169\n-170 template \n-171 static constexpr _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be offset (const M& m) noexcept\n-172 {\n-173 if constexpr (M::extents_type::rank() == 0)\n-174 return m();\n-175 else {\n-176 if (m.required_span_size() == 0)\n-177 return 0;\n-178 else {\n-179 return _\bu_\bn_\bp_\ba_\bc_\bk_\bI_\bn_\bt_\be_\bg_\be_\br_\bS_\be_\bq_\bu_\be_\bn_\bc_\be([&](auto... r) {\n-180 return m((r,0)...); }, // map the index tuple (0,0...)\n-181 std::make_index_sequence{});\n-182 }\n-183 }\n-184 }\n-185\n-186private:\n-187 [[no_unique_address]] _\be_\bx_\bt_\be_\bn_\bt_\bs_\b__\bt_\by_\bp_\be extents_;\n-188 strides_type strides_;\n-189};\n-190\n-191} // end namespace Dune::Std\n-192\n-193#endif // DUNE_COMMON_STD_LAYOUT_STRIDE_HH\n-_\bf_\bw_\bd_\b__\bl_\ba_\by_\bo_\bu_\bt_\bs_\b._\bh_\bh\n-_\bi_\bn_\bd_\bi_\bc_\be_\bs_\b._\bh_\bh\n-_\bD_\bu_\bn_\be_\b:_\b:_\bu_\bn_\bp_\ba_\bc_\bk_\bI_\bn_\bt_\be_\bg_\be_\br_\bS_\be_\bq_\bu_\be_\bn_\bc_\be\n-decltype(auto) constexpr unpackIntegerSequence(F &&f, std::integer_sequence< I,\n-i... > sequence)\n-Unpack an std::integer_sequence to std::integral_constant...\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn indices.hh:124\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bt_\bd\n-Namespace for features backported from new C++ standards.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn default_accessor.hh:10\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bt_\bd_\b:_\b:_\be_\bx_\bt_\be_\bn_\bt_\bs\n-Multidimensional index space with dynamic and static extents.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn extents.hh:54\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bt_\bd_\b:_\b:_\be_\bx_\bt_\be_\bn_\bt_\bs_\b:_\b:_\be_\bx_\bt_\be_\bn_\bt\n-constexpr index_type extent(rank_type r) const noexcept\n-Return the extent of dimension i\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn extents.hh:100\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bt_\bd_\b:_\b:_\bl_\ba_\by_\bo_\bu_\bt_\b__\br_\bi_\bg_\bh_\bt\n-A layout where the rightmost extent has stride 1, and strides increase right-\n-to-left as the product o...\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn fwd_layouts.hh:30\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bt_\bd_\b:_\b:_\bl_\ba_\by_\bo_\bu_\bt_\b__\bs_\bt_\br_\bi_\bd_\be\n-A layout mapping where the strides are user-defined.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn fwd_layouts.hh:40\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bt_\bd_\b:_\b:_\bl_\ba_\by_\bo_\bu_\bt_\b__\bs_\bt_\br_\bi_\bd_\be_\b:_\b:_\bm_\ba_\bp_\bp_\bi_\bn_\bg\n-A layout mapping where the strides are user-defined.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn layout_stride.hh:19\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bt_\bd_\b:_\b:_\bl_\ba_\by_\bo_\bu_\bt_\b__\bs_\bt_\br_\bi_\bd_\be_\b:_\b:_\bm_\ba_\bp_\bp_\bi_\bn_\bg_\b:_\b:_\bm_\ba_\bp_\bp_\bi_\bn_\bg\n-constexpr mapping(const extents_type &e, const span< OtherIndexType, rank_ >\n-&s) noexcept\n-Construct the mapping from given extents and strides.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn layout_stride.hh:59\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bt_\bd_\b:_\b:_\bl_\ba_\by_\bo_\bu_\bt_\b__\bs_\bt_\br_\bi_\bd_\be_\b:_\b:_\bm_\ba_\bp_\bp_\bi_\bn_\bg_\b:_\b:_\be_\bx_\bt_\be_\bn_\bt_\bs_\b__\bt_\by_\bp_\be\n-Extents extents_type\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn layout_stride.hh:24\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bt_\bd_\b:_\b:_\bl_\ba_\by_\bo_\bu_\bt_\b__\bs_\bt_\br_\bi_\bd_\be_\b:_\b:_\bm_\ba_\bp_\bp_\bi_\bn_\bg_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b=\n-constexpr mapping & operator=(const mapping &) noexcept=default\n-Copy-assignment for the mapping.\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bt_\bd_\b:_\b:_\bl_\ba_\by_\bo_\bu_\bt_\b__\bs_\bt_\br_\bi_\bd_\be_\b:_\b:_\bm_\ba_\bp_\bp_\bi_\bn_\bg_\b:_\b:_\bi_\bs_\b__\be_\bx_\bh_\ba_\bu_\bs_\bt_\bi_\bv_\be\n-constexpr bool is_exhaustive() const noexcept\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn layout_stride.hh:118\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bt_\bd_\b:_\b:_\bl_\ba_\by_\bo_\bu_\bt_\b__\bs_\bt_\br_\bi_\bd_\be_\b:_\b:_\bm_\ba_\bp_\bp_\bi_\bn_\bg_\b:_\b:_\bm_\ba_\bp_\bp_\bi_\bn_\bg\n-constexpr mapping() noexcept\n-The default construction initializes the strides from layout_right.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn layout_stride.hh:36\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bt_\bd_\b:_\b:_\bl_\ba_\by_\bo_\bu_\bt_\b__\bs_\bt_\br_\bi_\bd_\be_\b:_\b:_\bm_\ba_\bp_\bp_\bi_\bn_\bg_\b:_\b:_\bm_\ba_\bp_\bp_\bi_\bn_\bg\n-constexpr mapping(const extents_type &e, const std::array< OtherIndexType,\n-rank_ > &s) noexcept\n-Construct the mapping from given extents and strides.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn layout_stride.hh:47\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bt_\bd_\b:_\b:_\bl_\ba_\by_\bo_\bu_\bt_\b__\bs_\bt_\br_\bi_\bd_\be_\b:_\b:_\bm_\ba_\bp_\bp_\bi_\bn_\bg_\b:_\b:_\bs_\bt_\br_\bi_\bd_\be\n-constexpr index_type stride(rank_type i) const noexcept\n-Get the single stride i\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn layout_stride.hh:135\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bt_\bd_\b:_\b:_\bl_\ba_\by_\bo_\bu_\bt_\b__\bs_\bt_\br_\bi_\bd_\be_\b:_\b:_\bm_\ba_\bp_\bp_\bi_\bn_\bg_\b:_\b:_\bi_\bn_\bd_\be_\bx_\b__\bt_\by_\bp_\be\n-typename extents_type::index_type index_type\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn layout_stride.hh:25\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bt_\bd_\b:_\b:_\bl_\ba_\by_\bo_\bu_\bt_\b__\bs_\bt_\br_\bi_\bd_\be_\b:_\b:_\bm_\ba_\bp_\bp_\bi_\bn_\bg_\b:_\b:_\bi_\bs_\b__\ba_\bl_\bw_\ba_\by_\bs_\b__\be_\bx_\bh_\ba_\bu_\bs_\bt_\bi_\bv_\be\n-static constexpr bool is_always_exhaustive() noexcept\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn layout_stride.hh:112\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bt_\bd_\b:_\b:_\bl_\ba_\by_\bo_\bu_\bt_\b__\bs_\bt_\br_\bi_\bd_\be_\b:_\b:_\bm_\ba_\bp_\bp_\bi_\bn_\bg_\b:_\b:_\be_\bx_\bt_\be_\bn_\bt_\bs\n-constexpr const extents_type & extents() const noexcept\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn layout_stride.hh:85\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bt_\bd_\b:_\b:_\bl_\ba_\by_\bo_\bu_\bt_\b__\bs_\bt_\br_\bi_\bd_\be_\b:_\b:_\bm_\ba_\bp_\bp_\bi_\bn_\bg_\b:_\b:_\bi_\bs_\b__\bs_\bt_\br_\bi_\bd_\be_\bd\n-static constexpr bool is_strided() noexcept\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn layout_stride.hh:116\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bt_\bd_\b:_\b:_\bl_\ba_\by_\bo_\bu_\bt_\b__\bs_\bt_\br_\bi_\bd_\be_\b:_\b:_\bm_\ba_\bp_\bp_\bi_\bn_\bg_\b:_\b:_\bi_\bs_\b__\ba_\bl_\bw_\ba_\by_\bs_\b__\bs_\bt_\br_\bi_\bd_\be_\bd\n-static constexpr bool is_always_strided() noexcept\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn layout_stride.hh:113\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bt_\bd_\b:_\b:_\bl_\ba_\by_\bo_\bu_\bt_\b__\bs_\bt_\br_\bi_\bd_\be_\b:_\b:_\bm_\ba_\bp_\bp_\bi_\bn_\bg_\b:_\b:_\br_\be_\bq_\bu_\bi_\br_\be_\bd_\b__\bs_\bp_\ba_\bn_\b__\bs_\bi_\bz_\be\n-constexpr index_type required_span_size() const noexcept\n-Return the sum 1 + (E(0)-1)*S(0) + (E(1)-1)*S(1) + ...\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn layout_stride.hh:88\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bt_\bd_\b:_\b:_\bl_\ba_\by_\bo_\bu_\bt_\b__\bs_\bt_\br_\bi_\bd_\be_\b:_\b:_\bm_\ba_\bp_\bp_\bi_\bn_\bg_\b:_\b:_\bs_\bt_\br_\bi_\bd_\be_\bs\n-constexpr const strides_type & strides() const noexcept\n-Get the array of all strides.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn layout_stride.hh:127\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bt_\bd_\b:_\b:_\bl_\ba_\by_\bo_\bu_\bt_\b__\bs_\bt_\br_\bi_\bd_\be_\b:_\b:_\bm_\ba_\bp_\bp_\bi_\bn_\bg_\b:_\b:_\bm_\ba_\bp_\bp_\bi_\bn_\bg\n-constexpr mapping(const mapping &) noexcept=default\n-Copy constructor for the mapping.\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bt_\bd_\b:_\b:_\bl_\ba_\by_\bo_\bu_\bt_\b__\bs_\bt_\br_\bi_\bd_\be_\b:_\b:_\bm_\ba_\bp_\bp_\bi_\bn_\bg_\b:_\b:_\br_\ba_\bn_\bk_\b__\bt_\by_\bp_\be\n-typename extents_type::rank_type rank_type\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn layout_stride.hh:27\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bt_\bd_\b:_\b:_\bl_\ba_\by_\bo_\bu_\bt_\b__\bs_\bt_\br_\bi_\bd_\be_\b:_\b:_\bm_\ba_\bp_\bp_\bi_\bn_\bg_\b:_\b:_\bi_\bs_\b__\bu_\bn_\bi_\bq_\bu_\be\n-static constexpr bool is_unique() noexcept\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn layout_stride.hh:115\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bt_\bd_\b:_\b:_\bl_\ba_\by_\bo_\bu_\bt_\b__\bs_\bt_\br_\bi_\bd_\be_\b:_\b:_\bm_\ba_\bp_\bp_\bi_\bn_\bg_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b(_\b)\n-constexpr index_type operator()() const noexcept\n-The default offset for rank-0 tensors is 0.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn layout_stride.hh:106\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bt_\bd_\b:_\b:_\bl_\ba_\by_\bo_\bu_\bt_\b__\bs_\bt_\br_\bi_\bd_\be_\b:_\b:_\bm_\ba_\bp_\bp_\bi_\bn_\bg_\b:_\b:_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be\n-typename extents_type::size_type size_type\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn layout_stride.hh:26\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bt_\bd_\b:_\b:_\bl_\ba_\by_\bo_\bu_\bt_\b__\bs_\bt_\br_\bi_\bd_\be_\b:_\b:_\bm_\ba_\bp_\bp_\bi_\bn_\bg_\b:_\b:_\bi_\bs_\b__\ba_\bl_\bw_\ba_\by_\bs_\b__\bu_\bn_\bi_\bq_\bu_\be\n-static constexpr bool is_always_unique() noexcept\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn layout_stride.hh:111\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bt_\bd_\b:_\b:_\bs_\bp_\ba_\bn\n-A contiguous sequence of elements with static or dynamic extent.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn span.hh:126\n+115#endif // DUNE_COMMON_STRINGUTILITY_HH\n+_\be_\bx_\bc_\be_\bp_\bt_\bi_\bo_\bn_\bs_\b._\bh_\bh\n+A few common exception classes.\n+_\bD_\bu_\bn_\be_\b:_\b:_\bh_\ba_\bs_\bS_\bu_\bf_\bf_\bi_\bx\n+bool hasSuffix(const C &c, const char *suffix)\n+Check whether a character container has a given suffix.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn stringutility.hh:53\n+_\bD_\bu_\bn_\be_\b:_\b:_\bf_\bo_\br_\bm_\ba_\bt_\bS_\bt_\br_\bi_\bn_\bg\n+static std::string formatString(const std::string &s, const T &... args)\n+Format values according to printf format string.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn stringutility.hh:73\n+_\bD_\bu_\bn_\be_\b:_\b:_\bh_\ba_\bs_\bP_\br_\be_\bf_\bi_\bx\n+bool hasPrefix(const C &c, const char *prefix)\n+Check whether a character container has a given prefix.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn stringutility.hh:37\n+_\bD_\bU_\bN_\bE_\b__\bT_\bH_\bR_\bO_\bW\n+#define DUNE_THROW(E, m)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn exceptions.hh:218\n+_\bD_\bu_\bn_\be\n+Dune namespace.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn alignedallocator.hh:13\n+_\bD_\bu_\bn_\be_\b:_\b:_\bE_\bx_\bc_\be_\bp_\bt_\bi_\bo_\bn\n+Base class for Dune-Exceptions.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn exceptions.hh:96\n ===============================================================================\n Generated by\u00a0_\b[_\bd_\bo_\bx_\by_\bg_\be_\bn_\b] 1.9.8\n"}]}, {"source1": "./usr/share/doc/libdune-common-doc/doxygen/a00131.html", "source2": "./usr/share/doc/libdune-common-doc/doxygen/a00131.html", "unified_diff": "@@ -1,15 +1,15 @@\n \n \n \n \n \n \n \n-dune-common: layout_left.hh File Reference\n+dune-common: rangeutilities.hh File Reference\n \n \n \n \n \n \n \n@@ -65,46 +65,127 @@\n
    \n
    \n \n \n \n \n \n
    \n \n-
    layout_left.hh File Reference
    \n+Namespaces |\n+Functions |\n+Variables
    \n+
    rangeutilities.hh File Reference
    \n \n
    \n-
    #include <array>
    \n+\n+

    Utilities for reduction like operations on ranges. \n+More...

    \n+
    #include <algorithm>
    \n+#include <utility>
    \n #include <type_traits>
    \n-#include <dune/common/indices.hh>
    \n-#include <dune/common/std/impl/fwd_layouts.hh>
    \n+#include <bitset>
    \n+#include <dune/common/typetraits.hh>
    \n+#include <dune/common/iteratorfacades.hh>
    \n
    \n

    Go to the source code of this file.

    \n \n \n-\n-\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n \n

    \n Classes

    class  Dune::Std::layout_left::mapping< Extents >
     A layout mapping where the leftmost extent has stride 1. More...
    class  Dune::IntegralRange< T >
     dynamic integer range for use in range-based for loops More...
     
    class  Dune::StaticIntegralRange< T, to, from >
     static integer range for use in range-based for loops More...
     
    struct  Dune::ValueTransformationTag
     Tag to enable value based transformations in TransformedRangeView. More...
     
    struct  Dune::IteratorTransformationTag
     Tag to enable iterator based transformations in TransformedRangeView. More...
     
    class  Dune::TransformedRangeView< R, F, T >
     A range transforming the values of another range on-the-fly. More...
     
    \n \n \n \n \n-\n-\n-\n+

    \n Namespaces

    namespace  Dune
     Dune namespace.
     
    namespace  Dune::Std
     Namespace for features backported from new C++ standards.
     
    \n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+

    \n+Functions

    template<typename T , typename std::enable_if< IsIterable< T >::value, int >::type = 0>
    T::value_type Dune::max_value (const T &v)
     compute the maximum value over a range
     
    template<typename T , typename std::enable_if<!IsIterable< T >::value, int >::type = 0>
    const T & Dune::max_value (const T &v)
     
    template<typename T , typename std::enable_if< IsIterable< T >::value, int >::type = 0>
    T::value_type Dune::min_value (const T &v)
     compute the minimum value over a range
     
    template<typename T , typename std::enable_if<!IsIterable< T >::value, int >::type = 0>
    const T & Dune::min_value (const T &v)
     
    template<typename T , typename std::enable_if< IsIterable< T >::value, int >::type = 0>
    bool Dune::any_true (const T &v)
     similar to std::bitset<N>::any() return true, if any entries is true
     
    template<std::size_t N>
    bool Dune::any_true (const std::bitset< N > &b)
     
    template<typename T , typename std::enable_if< IsIterable< T >::value, int >::type = 0>
    bool Dune::all_true (const T &v)
     similar to std::bitset<N>::all() return true, if any entries is true
     
    template<std::size_t N>
    bool Dune::all_true (const std::bitset< N > &b)
     
    template<class T , class U , std::enable_if_t< std::is_same< std::decay_t< T >, std::decay_t< U > >::value, int > = 0, std::enable_if_t< std::is_integral< std::decay_t< T > >::value, int > = 0>
    static IntegralRange< std::decay_t< T > > Dune::range (T &&from, U &&to) noexcept
     free standing function for setting up a range based for loop over an integer range for (auto i: range(0,10)) // 0,1,2,3,4,5,6,7,8,9 or for (auto i: range(-10,10)) // -10,-9,..,8,9 or for (auto i: range(10)) // 0,1,2,3,4,5,6,7,8,9
     
    template<class T , std::enable_if_t< std::is_integral< std::decay_t< T > >::value, int > = 0>
    static IntegralRange< std::decay_t< T > > Dune::range (T &&to) noexcept
     
    template<class T , std::enable_if_t< std::is_enum< std::decay_t< T > >::value, int > = 0>
    static IntegralRange< std::underlying_type_t< std::decay_t< T > > > Dune::range (T &&to) noexcept
     
    template<class T , T to>
    static StaticIntegralRange< T, to > Dune::range (std::integral_constant< T, to >) noexcept
     
    template<class R , class F >
    auto Dune::transformedRangeView (R &&range, F &&f)
     Create a TransformedRangeView.
     
    template<class R , class F >
    auto Dune::iteratorTransformedRangeView (R &&range, F &&f)
     Create a TransformedRangeView using an iterator transformation.
     
    template<class Range >
    auto Dune::sparseRange (Range &&range)
     Allow structured-binding for-loops for sparse iterators.
     
    \n+\n+\n+\n+\n

    \n+Variables

    template<class T , T from, T to>
    static StaticIntegralRange< T, to, from > Dune::range (std::integral_constant< T, from >, std::integral_constant< T, to >) noexcept
     
    \n-
    \n+

    Detailed Description

    \n+

    Utilities for reduction like operations on ranges.

    \n+
    Author
    Christian Engwer
    \n+
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,27 +1,133 @@\n dune-common\u00a02.10\n Loading...\n Searching...\n No Matches\n * _\bd_\bu_\bn_\be\n * _\bc_\bo_\bm_\bm_\bo_\bn\n- * _\bs_\bt_\bd\n-_\bC_\bl_\ba_\bs_\bs_\be_\bs | _\bN_\ba_\bm_\be_\bs_\bp_\ba_\bc_\be_\bs\n-layout_left.hh File Reference\n-#include \n+_\bC_\bl_\ba_\bs_\bs_\be_\bs | _\bN_\ba_\bm_\be_\bs_\bp_\ba_\bc_\be_\bs | _\bF_\bu_\bn_\bc_\bt_\bi_\bo_\bn_\bs | _\bV_\ba_\br_\bi_\ba_\bb_\bl_\be_\bs\n+rangeutilities.hh File Reference\n+Utilities for reduction like operations on ranges. _\bM_\bo_\br_\be_\b._\b._\b.\n+#include \n+#include \n #include \n-#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bi_\bn_\bd_\bi_\bc_\be_\bs_\b._\bh_\bh>\n-#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bs_\bt_\bd_\b/_\bi_\bm_\bp_\bl_\b/_\bf_\bw_\bd_\b__\bl_\ba_\by_\bo_\bu_\bt_\bs_\b._\bh_\bh>\n+#include \n+#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bt_\by_\bp_\be_\bt_\br_\ba_\bi_\bt_\bs_\b._\bh_\bh>\n+#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bi_\bt_\be_\br_\ba_\bt_\bo_\br_\bf_\ba_\bc_\ba_\bd_\be_\bs_\b._\bh_\bh>\n _\bG_\bo_\b _\bt_\bo_\b _\bt_\bh_\be_\b _\bs_\bo_\bu_\br_\bc_\be_\b _\bc_\bo_\bd_\be_\b _\bo_\bf_\b _\bt_\bh_\bi_\bs_\b _\bf_\bi_\bl_\be_\b.\n C\bCl\bla\bas\bss\bse\bes\bs\n-class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bS_\bt_\bd_\b:_\b:_\bl_\ba_\by_\bo_\bu_\bt_\b__\bl_\be_\bf_\bt_\b:_\b:_\bm_\ba_\bp_\bp_\bi_\bn_\bg_\b<_\b _\bE_\bx_\bt_\be_\bn_\bt_\bs_\b _\b>\n-\u00a0 A layout mapping where the leftmost extent has stride 1. _\bM_\bo_\br_\be_\b._\b._\b.\n+ class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bt_\be_\bg_\br_\ba_\bl_\bR_\ba_\bn_\bg_\be_\b<_\b _\bT_\b _\b>\n+\u00a0 dynamic integer range for use in range-based for loops _\bM_\bo_\br_\be_\b._\b._\b.\n+\u00a0\n+ class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bS_\bt_\ba_\bt_\bi_\bc_\bI_\bn_\bt_\be_\bg_\br_\ba_\bl_\bR_\ba_\bn_\bg_\be_\b<_\b _\bT_\b,_\b _\bt_\bo_\b,_\b _\bf_\br_\bo_\bm_\b _\b>\n+\u00a0 static integer range for use in range-based for loops _\bM_\bo_\br_\be_\b._\b._\b.\n+\u00a0\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bV_\ba_\bl_\bu_\be_\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\bT_\ba_\bg\n+\u00a0 Tag to enable value based transformations in _\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\be_\bd_\bR_\ba_\bn_\bg_\be_\bV_\bi_\be_\bw.\n+ _\bM_\bo_\br_\be_\b._\b._\b.\n+\u00a0\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\bT_\ba_\bg\n+\u00a0 Tag to enable iterator based transformations in _\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\be_\bd_\bR_\ba_\bn_\bg_\be_\bV_\bi_\be_\bw.\n+ _\bM_\bo_\br_\be_\b._\b._\b.\n+\u00a0\n+ class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\be_\bd_\bR_\ba_\bn_\bg_\be_\bV_\bi_\be_\bw_\b<_\b _\bR_\b,_\b _\bF_\b,_\b _\bT_\b _\b>\n+\u00a0 A range transforming the values of another range on-the-fly. _\bM_\bo_\br_\be_\b._\b._\b.\n \u00a0\n N\bNa\bam\bme\bes\bsp\bpa\bac\bce\bes\bs\n namespace \u00a0 _\bD_\bu_\bn_\be\n \u00a0 _\bD_\bu_\bn_\be namespace.\n \u00a0\n-namespace \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bS_\bt_\bd\n-\u00a0 Namespace for features backported from new C++ standards.\n+F\bFu\bun\bnc\bct\bti\bio\bon\bns\bs\n+template::value, int >::\n+type = 0>\n+ T::value_type\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bm_\ba_\bx_\b__\bv_\ba_\bl_\bu_\be (const T &v)\n+\u00a0 compute the maximum value over a range\n+\u00a0\n+template::value, int >::\n+type = 0>\n+ const T &\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bm_\ba_\bx_\b__\bv_\ba_\bl_\bu_\be (const T &v)\n+\u00a0\n+template::value, int >::\n+type = 0>\n+ T::value_type\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bm_\bi_\bn_\b__\bv_\ba_\bl_\bu_\be (const T &v)\n+\u00a0 compute the minimum value over a range\n+\u00a0\n+template::value, int >::\n+type = 0>\n+ const T &\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bm_\bi_\bn_\b__\bv_\ba_\bl_\bu_\be (const T &v)\n+\u00a0\n+template::value, int >::\n+type = 0>\n+ bool\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\ba_\bn_\by_\b__\bt_\br_\bu_\be (const T &v)\n+\u00a0 similar to std::bitset::any() return\n+ true, if any entries is true\n+\u00a0\n+template\n+ bool\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\ba_\bn_\by_\b__\bt_\br_\bu_\be (const std::bitset< N >\n+ &b)\n+\u00a0\n+template::value, int >::\n+type = 0>\n+ bool\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\ba_\bl_\bl_\b__\bt_\br_\bu_\be (const T &v)\n+\u00a0 similar to std::bitset::all() return\n+ true, if any entries is true\n+\u00a0\n+template\n+ bool\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\ba_\bl_\bl_\b__\bt_\br_\bu_\be (const std::bitset< N >\n+ &b)\n+\u00a0\n+template,\n+std::decay_t< U > >::value, int > = 0, std::enable_if_t< std::is_integral<\n+std::decay_t< T > >::value, int > = 0>\n+static _\bI_\bn_\bt_\be_\bg_\br_\ba_\bl_\bR_\ba_\bn_\bg_\be< std::decay_t< T >\n+ >\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\br_\ba_\bn_\bg_\be (T &&from, U &&to) noexcept\n+ free standing function for setting up a\n+ range based for loop over an integer\n+ range for (auto i: _\br_\ba_\bn_\bg_\be_\b(_\b0_\b,_\b1_\b0_\b)) /\n+\u00a0 / 0,1,2,3,4,5,6,7,8,9 or for (auto i:\n+ range(-10,10)) // -10,-9,..,8,9 or for\n+ (auto i: _\br_\ba_\bn_\bg_\be_\b(_\b1_\b0_\b)) /\n+ / 0,1,2,3,4,5,6,7,8,9\n+\u00a0\n+template >::\n+value, int > = 0>\n+static _\bI_\bn_\bt_\be_\bg_\br_\ba_\bl_\bR_\ba_\bn_\bg_\be< std::decay_t< T >\n+ >\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\br_\ba_\bn_\bg_\be (T &&to) noexcept\n+\u00a0\n+template >::value,\n+int > = 0>\n+ static _\bI_\bn_\bt_\be_\bg_\br_\ba_\bl_\bR_\ba_\bn_\bg_\be< std::\n+ underlying_type_t< std::decay_t< T > >\n+ >\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\br_\ba_\bn_\bg_\be (T &&to) noexcept\n+\u00a0\n+template\n+ static _\bS_\bt_\ba_\bt_\bi_\bc_\bI_\bn_\bt_\be_\bg_\br_\ba_\bl_\bR_\ba_\bn_\bg_\be< T, to >\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\br_\ba_\bn_\bg_\be (std::integral_constant< T,\n+ to >) noexcept\n+\u00a0\n+template\n+ auto\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bt_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\be_\bd_\bR_\ba_\bn_\bg_\be_\bV_\bi_\be_\bw (R &&_\br_\ba_\bn_\bg_\be,\n+ F &&f)\n+\u00a0 Create a _\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\be_\bd_\bR_\ba_\bn_\bg_\be_\bV_\bi_\be_\bw.\n+\u00a0\n+template\n+ auto\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bi_\bt_\be_\br_\ba_\bt_\bo_\br_\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\be_\bd_\bR_\ba_\bn_\bg_\be_\bV_\bi_\be_\bw (R\n+ &&_\br_\ba_\bn_\bg_\be, F &&f)\n+\u00a0 Create a _\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\be_\bd_\bR_\ba_\bn_\bg_\be_\bV_\bi_\be_\bw using an\n+ iterator transformation.\n+\u00a0\n+template\n+ auto\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bs_\bp_\ba_\br_\bs_\be_\bR_\ba_\bn_\bg_\be (Range &&_\br_\ba_\bn_\bg_\be)\n+\u00a0 Allow structured-binding for-loops for\n+ sparse iterators.\n+\u00a0\n+V\bVa\bar\bri\bia\bab\bbl\ble\bes\bs\n+template\n+static _\bS_\bt_\ba_\bt_\bi_\bc_\bI_\bn_\bt_\be_\bg_\br_\ba_\bl_\bR_\ba_\bn_\bg_\be< T, to, from _\bD_\bu_\bn_\be_\b:_\b:_\br_\ba_\bn_\bg_\be (std::integral_constant< T,\n+ >\u00a0 from >, std::integral_constant< T, to\n+ >) noexcept\n \u00a0\n+*\b**\b**\b**\b**\b* D\bDe\bet\bta\bai\bil\ble\bed\bd D\bDe\bes\bsc\bcr\bri\bip\bpt\bti\bio\bon\bn *\b**\b**\b**\b**\b*\n+Utilities for reduction like operations on ranges.\n+ Author\n+ Christian Engwer\n ===============================================================================\n Generated by\u00a0_\b[_\bd_\bo_\bx_\by_\bg_\be_\bn_\b] 1.9.8\n"}]}, {"source1": "./usr/share/doc/libdune-common-doc/doxygen/a00131_source.html", "source2": "./usr/share/doc/libdune-common-doc/doxygen/a00131_source.html", "unified_diff": "@@ -1,15 +1,15 @@\n \n \n \n \n \n \n \n-dune-common: layout_left.hh Source File\n+dune-common: rangeutilities.hh Source File\n \n \n \n \n \n \n \n@@ -70,197 +70,615 @@\n \n \n \n \n \n \n \n
    \n-
    layout_left.hh
    \n+
    rangeutilities.hh
    \n
    \n
    \n Go to the documentation of this file.
    1// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
    \n
    2// vi: set et ts=4 sw=2 sts=2:
    \n
    3// SPDX-FileCopyrightInfo: Copyright \u00a9 DUNE Project contributors, see file LICENSE.md in module root
    \n
    4// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception
    \n-
    5#ifndef DUNE_COMMON_STD_LAYOUT_LEFT_HH
    \n-
    6#define DUNE_COMMON_STD_LAYOUT_LEFT_HH
    \n+
    5#ifndef DUNE_COMMON_RANGE_UTILITIES_HH
    \n+
    6#define DUNE_COMMON_RANGE_UTILITIES_HH
    \n
    7
    \n-
    8#include <array>
    \n-
    9#include <type_traits>
    \n-
    10
    \n-\n-\n-
    13
    \n-
    14namespace Dune::Std {
    \n+
    8#include <algorithm>
    \n+
    9#include <utility>
    \n+
    10#include <type_traits>
    \n+
    11#include <bitset>
    \n+
    12
    \n+\n+\n
    15
    \n-
    17template <class Extents>
    \n-
    \n-\n-
    19{
    \n-
    20 template <class> friend class mapping;
    \n-
    21
    \n-
    22public:
    \n-
    23 using extents_type = Extents;
    \n-
    24 using size_type = typename extents_type::size_type;
    \n-
    25 using rank_type = typename extents_type::rank_type;
    \n-
    26 using index_type = typename extents_type::index_type;
    \n-\n-
    28
    \n-
    30 constexpr mapping () noexcept = default;
    \n-
    31
    \n-
    33 constexpr mapping (const mapping&) noexcept = default;
    \n-
    34
    \n-
    \n-
    36 constexpr mapping (const extents_type& e) noexcept
    \n-
    37 : extents_(e)
    \n-
    38 {}
    \n-
    \n-
    39
    \n-
    41 template <class OtherExtents,
    \n-
    42 std::enable_if_t<std::is_constructible_v<extents_type, OtherExtents>, int> = 0>
    \n-
    43 #if __cpp_conditional_explicit >= 201806L
    \n-
    44 explicit(!std::is_convertible_v<OtherExtents, extents_type>)
    \n-
    45 #endif
    \n-
    \n-
    46 constexpr mapping (const mapping<OtherExtents>& m) noexcept
    \n-
    47 : extents_(m.extents())
    \n-
    48 {}
    \n-
    \n-
    49
    \n-
    51 template <class OtherExtents, class E = extents_type,
    \n-
    52 std::enable_if_t<(E::rank() <= 1), int> = 0,
    \n-
    53 std::enable_if_t<std::is_constructible_v<extents_type, OtherExtents>, int> = 0>
    \n-
    54 #if __cpp_conditional_explicit >= 201806L
    \n-
    55 explicit(!std::is_convertible_v<OtherExtents, extents_type>)
    \n-
    56 #endif
    \n-
    \n-
    57 constexpr mapping (const layout_right::mapping<OtherExtents>& m) noexcept
    \n-
    58 : extents_(m.extents())
    \n-
    59 {}
    \n+
    23namespace Dune
    \n+
    24{
    \n+
    25
    \n+
    36 template <typename T,
    \n+
    37 typename std::enable_if<IsIterable<T>::value, int>::type = 0>
    \n+
    38 typename T::value_type
    \n+
    \n+
    39 max_value(const T & v) {
    \n+
    40 using std::max_element;
    \n+
    41 return *max_element(v.begin(), v.end());
    \n+
    42 }
    \n+
    \n+
    43
    \n+
    44 template <typename T,
    \n+
    45 typename std::enable_if<!IsIterable<T>::value, int>::type = 0>
    \n+
    46 const T & max_value(const T & v) { return v; }
    \n+
    47
    \n+
    53 template <typename T,
    \n+
    54 typename std::enable_if<IsIterable<T>::value, int>::type = 0>
    \n+
    55 typename T::value_type
    \n+
    \n+
    56 min_value(const T & v) {
    \n+
    57 using std::min_element;
    \n+
    58 return *min_element(v.begin(), v.end());
    \n+
    59 }
    \n
    \n
    60
    \n-
    62 template <class OtherExtents,
    \n-
    63 std::enable_if_t<std::is_constructible_v<extents_type, OtherExtents>, int> = 0>
    \n-
    64 #if __cpp_conditional_explicit >= 201806L
    \n-
    65 explicit(extents_type::rank() > 0)
    \n-
    66 #endif
    \n-
    \n-\n-
    68 : extents_(m.extents())
    \n-
    69 {
    \n-
    70#ifndef NDEBUG
    \n-
    71 if constexpr(extents_type::rank() > 0) {
    \n-
    72 index_type prod = 1;
    \n-
    73 for (rank_type r = 0; r < extents_type::rank()-1; ++r) {
    \n-
    74 assert(m.strides(r) == prod);
    \n-
    75 prod *= m.extents().extent(r);
    \n-
    76 }
    \n-
    77 assert(m.strides(extents_type::rank()-1) == prod);
    \n-
    78 }
    \n-
    79#endif
    \n-
    80 }
    \n-
    \n-
    81
    \n-
    83 constexpr mapping& operator= (const mapping&) noexcept = default;
    \n-
    84
    \n-
    85 constexpr const extents_type& extents () const noexcept { return extents_; }
    \n-
    86 constexpr index_type required_span_size () const noexcept { return extents_.product(); }
    \n-
    87
    \n-
    89 template <class... Indices,
    \n-
    90 std::enable_if_t<(sizeof...(Indices) == extents_type::rank()), int> = 0,
    \n-
    91 std::enable_if_t<(... && std::is_convertible_v<Indices, index_type>), int> = 0,
    \n-
    92 std::enable_if_t<(... && std::is_nothrow_constructible_v<Indices, index_type>), int> = 0>
    \n-
    \n-
    93 constexpr index_type operator() (Indices... ii) const noexcept
    \n-
    94 {
    \n-
    95 const std::array indices{index_type(std::move(ii))...};
    \n-
    96 index_type value = indices.back();
    \n-
    97 for (rank_type r = 1; r < extents_type::rank(); ++r) {
    \n-
    98 const rank_type j = extents_type::rank()-r;
    \n-
    99 value = indices[j-1] + extents_.extent(j-1) * value;
    \n-
    100 }
    \n-
    101 return value;
    \n-
    102 }
    \n-
    \n-
    103
    \n-
    \n-
    105 constexpr index_type operator() () const noexcept
    \n-
    106 {
    \n-
    107 return 0;
    \n-
    108 }
    \n-
    \n-
    109
    \n-
    110 static constexpr bool is_always_unique () noexcept { return true; }
    \n-
    111 static constexpr bool is_always_exhaustive () noexcept { return true; }
    \n-
    112 static constexpr bool is_always_strided () noexcept { return true; }
    \n+
    61 template <typename T,
    \n+
    62 typename std::enable_if<!IsIterable<T>::value, int>::type = 0>
    \n+
    63 const T & min_value(const T & v) { return v; }
    \n+
    64
    \n+
    70 template <typename T,
    \n+
    71 typename std::enable_if<IsIterable<T>::value, int>::type = 0>
    \n+
    \n+
    72 bool any_true(const T & v) {
    \n+
    73 bool b = false;
    \n+
    74 for (const auto & e : v)
    \n+
    75 b = b or bool(e);
    \n+
    76 return b;
    \n+
    77 }
    \n+
    \n+
    78
    \n+
    79 template <typename T,
    \n+
    80 typename std::enable_if<!IsIterable<T>::value, int>::type = 0>
    \n+
    81 bool any_true(const T & v) { return v; }
    \n+
    82
    \n+
    83 template<std::size_t N>
    \n+
    \n+
    84 bool any_true(const std::bitset<N> & b)
    \n+
    85 {
    \n+
    86 return b.any();
    \n+
    87 }
    \n+
    \n+
    88
    \n+
    94 template <typename T,
    \n+
    95 typename std::enable_if<IsIterable<T>::value, int>::type = 0>
    \n+
    \n+
    96 bool all_true(const T & v) {
    \n+
    97 bool b = true;
    \n+
    98 for (const auto & e : v)
    \n+
    99 b = b and bool(e);
    \n+
    100 return b;
    \n+
    101 }
    \n+
    \n+
    102
    \n+
    103 template <typename T,
    \n+
    104 typename std::enable_if<!IsIterable<T>::value, int>::type = 0>
    \n+
    105 bool all_true(const T & v) { return v; }
    \n+
    106
    \n+
    107 template<std::size_t N>
    \n+
    \n+
    108 bool all_true(const std::bitset<N> & b)
    \n+
    109 {
    \n+
    110 return b.all();
    \n+
    111 }
    \n+
    \n+
    112
    \n
    113
    \n-
    114 static constexpr bool is_unique () noexcept { return true; }
    \n-
    115 static constexpr bool is_exhaustive () noexcept { return true; }
    \n-
    116 static constexpr bool is_strided () noexcept { return true; }
    \n+
    114
    \n+
    115 namespace Impl
    \n+
    116 {
    \n
    117
    \n-
    119 template <class E = extents_type,
    \n-
    120 std::enable_if_t<(E::rank() > 0), int> = 0>
    \n-
    \n-
    121 constexpr index_type stride (rank_type i) const noexcept
    \n-
    122 {
    \n-
    123 assert(i < extents_type::rank());
    \n-
    124 index_type prod = 1;
    \n-
    125 for (rank_type r = 0; r < i; ++r)
    \n-
    126 prod *= extents().extent(r);
    \n-
    127 return prod;
    \n-
    128 }
    \n-
    \n-
    129
    \n-
    130 template <class OtherExtents,
    \n-
    131 std::enable_if_t<(Extents::rank() == OtherExtents::rank()), int> = 0>
    \n-
    \n-
    132 friend constexpr bool operator== (const mapping& a, const mapping<OtherExtents>& b) noexcept
    \n-
    133 {
    \n-
    134 return a.extents_ == b.extents_;
    \n-
    135 }
    \n-
    \n-
    136
    \n-
    137private:
    \n-
    138 [[no_unique_address]] extents_type extents_;
    \n-
    139};
    \n-
    \n-
    140
    \n-
    141} // end namespace Dune::Std
    \n-
    142
    \n-
    143#endif // DUNE_COMMON_STD_LAYOUT_LEFT_HH
    \n-\n-\n-
    Namespace for features backported from new C++ standards.
    Definition default_accessor.hh:10
    \n-
    A layout where the leftmost extent has stride 1.
    Definition fwd_layouts.hh:17
    \n-
    A layout mapping where the leftmost extent has stride 1.
    Definition layout_left.hh:19
    \n-
    constexpr index_type stride(rank_type i) const noexcept
    The stride is the product of the extents E(0)*E(1)*...*E(i-1)
    Definition layout_left.hh:121
    \n-
    typename extents_type::index_type index_type
    Definition layout_left.hh:26
    \n-
    constexpr index_type required_span_size() const noexcept
    Definition layout_left.hh:86
    \n-
    constexpr mapping & operator=(const mapping &) noexcept=default
    Copy-assignment for the mapping.
    \n-
    Extents extents_type
    Definition layout_left.hh:23
    \n-
    static constexpr bool is_always_unique() noexcept
    Definition layout_left.hh:110
    \n-
    constexpr mapping() noexcept=default
    The default construction is possible for default constructible extents.
    \n-
    static constexpr bool is_strided() noexcept
    Definition layout_left.hh:116
    \n-
    static constexpr bool is_always_strided() noexcept
    Definition layout_left.hh:112
    \n-
    constexpr index_type operator()() const noexcept
    The default offset for rank-0 tensors is 0.
    Definition layout_left.hh:105
    \n-
    typename extents_type::size_type size_type
    Definition layout_left.hh:24
    \n-
    static constexpr bool is_unique() noexcept
    Definition layout_left.hh:114
    \n-
    constexpr mapping(const layout_right::mapping< OtherExtents > &m) noexcept
    Construct the mapping from a layout_right.
    Definition layout_left.hh:57
    \n-
    constexpr const extents_type & extents() const noexcept
    Definition layout_left.hh:85
    \n-
    static constexpr bool is_always_exhaustive() noexcept
    Definition layout_left.hh:111
    \n-
    typename extents_type::rank_type rank_type
    Definition layout_left.hh:25
    \n-
    static constexpr bool is_exhaustive() noexcept
    Definition layout_left.hh:115
    \n-
    A layout mapping where the rightmost extent has stride 1.
    Definition layout_right.hh:19
    \n-
    A layout mapping where the strides are user-defined.
    Definition layout_stride.hh:19
    \n-
    constexpr const extents_type & extents() const noexcept
    Definition layout_stride.hh:85
    \n-
    constexpr const strides_type & strides() const noexcept
    Get the array of all strides.
    Definition layout_stride.hh:127
    \n+
    118 template <class T>
    \n+
    119 class IntegralRangeIterator
    \n+
    120 {
    \n+
    121 public:
    \n+
    122 typedef std::random_access_iterator_tag iterator_category;
    \n+
    123 typedef T value_type;
    \n+
    124 typedef std::make_signed_t<T> difference_type;
    \n+
    125 typedef const T *pointer;
    \n+
    126 typedef T reference;
    \n+
    127
    \n+
    128 constexpr IntegralRangeIterator() noexcept : value_(0) {}
    \n+
    129 constexpr explicit IntegralRangeIterator(value_type value) noexcept : value_(value) {}
    \n+
    130
    \n+
    131 pointer operator->() const noexcept { return &value_; }
    \n+
    132 constexpr reference operator*() const noexcept { return value_; }
    \n+
    133
    \n+
    134 constexpr reference operator[]( difference_type n ) const noexcept { return (value_ + n); }
    \n+
    135
    \n+
    136 constexpr bool operator==(const IntegralRangeIterator & other) const noexcept { return (value_ == other.value_); }
    \n+
    137 constexpr bool operator!=(const IntegralRangeIterator & other) const noexcept { return (value_ != other.value_); }
    \n+
    138
    \n+
    139 constexpr bool operator<(const IntegralRangeIterator & other) const noexcept { return (value_ <= other.value_); }
    \n+
    140 constexpr bool operator<=(const IntegralRangeIterator & other) const noexcept { return (value_ <= other.value_); }
    \n+
    141 constexpr bool operator>(const IntegralRangeIterator & other) const noexcept { return (value_ >= other.value_); }
    \n+
    142 constexpr bool operator>=(const IntegralRangeIterator & other) const noexcept { return (value_ >= other.value_); }
    \n+
    143
    \n+
    144 IntegralRangeIterator& operator++() noexcept { ++value_; return *this; }
    \n+
    145 IntegralRangeIterator operator++(int) noexcept { IntegralRangeIterator copy( *this ); ++(*this); return copy; }
    \n+
    146
    \n+
    147 IntegralRangeIterator& operator--() noexcept { --value_; return *this; }
    \n+
    148 IntegralRangeIterator operator--(int) noexcept { IntegralRangeIterator copy( *this ); --(*this); return copy; }
    \n+
    149
    \n+
    150 IntegralRangeIterator& operator+=(difference_type n) noexcept { value_ += n; return *this; }
    \n+
    151 IntegralRangeIterator& operator-=(difference_type n) noexcept { value_ -= n; return *this; }
    \n+
    152
    \n+
    153 friend constexpr IntegralRangeIterator operator+(const IntegralRangeIterator &a, difference_type n) noexcept { return IntegralRangeIterator(a.value_ + n); }
    \n+
    154 friend constexpr IntegralRangeIterator operator+(difference_type n, const IntegralRangeIterator &a) noexcept { return IntegralRangeIterator(a.value_ + n); }
    \n+
    155 friend constexpr IntegralRangeIterator operator-(const IntegralRangeIterator &a, difference_type n) noexcept { return IntegralRangeIterator(a.value_ - n); }
    \n+
    156
    \n+
    157 constexpr difference_type operator-(const IntegralRangeIterator &other) const noexcept { return (static_cast<difference_type>(value_) - static_cast<difference_type>(other.value_)); }
    \n+
    158
    \n+
    159 private:
    \n+
    160 value_type value_;
    \n+
    161 };
    \n+
    162
    \n+
    163 } // namespace Impl
    \n+
    164
    \n+
    165
    \n+
    166
    \n+
    175 template <class T>
    \n+
    \n+\n+
    177 {
    \n+
    178 public:
    \n+
    180 typedef T value_type;
    \n+
    182 typedef Impl::IntegralRangeIterator<T> iterator;
    \n+
    184 typedef std::make_unsigned_t<T> size_type;
    \n+
    185
    \n+
    187 constexpr IntegralRange(value_type from, value_type to) noexcept : from_(from), to_(to) {}
    \n+
    189 constexpr explicit IntegralRange(value_type to) noexcept : from_(0), to_(to) {}
    \n+
    191 constexpr IntegralRange(std::pair<value_type, value_type> range) noexcept : from_(range.first), to_(range.second) {}
    \n+
    192
    \n+
    194 constexpr iterator begin() const noexcept { return iterator(from_); }
    \n+
    196 constexpr iterator end() const noexcept { return iterator(to_); }
    \n+
    197
    \n+
    199 constexpr value_type operator[](const value_type &i) const noexcept { return (from_ + i); }
    \n+
    200
    \n+
    202 constexpr bool empty() const noexcept { return (from_ == to_); }
    \n+
    204 constexpr size_type size() const noexcept { return (static_cast<size_type>(to_) - static_cast<size_type>(from_)); }
    \n+
    205
    \n+
    207 constexpr bool contains(value_type index) const noexcept { return from_ <= index && index < to_; }
    \n+
    208
    \n+
    209 private:
    \n+
    210 value_type from_, to_;
    \n+
    211 };
    \n+
    \n+
    212
    \n+
    213
    \n+
    228 template <class T, T to, T from = 0>
    \n+
    \n+\n+
    230 {
    \n+
    231 template <T ofs, T... i>
    \n+
    232 static std::integer_sequence<T, (i+ofs)...> shift_integer_sequence(std::integer_sequence<T, i...>);
    \n+
    233
    \n+
    234 public:
    \n+
    236 typedef T value_type;
    \n+
    238 typedef Impl::IntegralRangeIterator<T> iterator;
    \n+
    240 typedef std::make_unsigned_t<T> size_type;
    \n+
    241
    \n+
    243 typedef decltype(shift_integer_sequence<from>(std::make_integer_sequence<T, to-from>())) integer_sequence;
    \n+
    244
    \n+
    246 constexpr StaticIntegralRange() noexcept = default;
    \n+
    247
    \n+
    249 constexpr operator IntegralRange<T>() const noexcept { return {from, to}; }
    \n+
    251 constexpr operator integer_sequence() const noexcept { return {}; }
    \n+
    252
    \n+
    254 static constexpr integer_sequence to_integer_sequence() noexcept { return {}; }
    \n+
    255
    \n+
    257 static constexpr iterator begin() noexcept { return iterator(from); }
    \n+
    259 static constexpr iterator end() noexcept { return iterator(to); }
    \n+
    260
    \n+
    262 template <class U, U i>
    \n+
    \n+
    263 constexpr auto operator[](const std::integral_constant<U, i> &) const noexcept
    \n+
    264 -> std::integral_constant<value_type, from + static_cast<value_type>(i)>
    \n+
    265 {
    \n+
    266 return {};
    \n+
    267 }
    \n+
    \n+
    268
    \n+
    270 constexpr value_type operator[](const size_type &i) const noexcept { return (from + static_cast<value_type>(i)); }
    \n+
    271
    \n+
    273 static constexpr std::integral_constant<bool, from == to> empty() noexcept { return {}; }
    \n+
    275 static constexpr std::integral_constant<size_type, static_cast<size_type>(to) - static_cast<size_type>(from) > size() noexcept { return {}; }
    \n+
    276
    \n+
    278 static constexpr bool contains(value_type index) noexcept { return from <= index && index < to; }
    \n+
    279
    \n+
    280 };
    \n+
    \n+
    281
    \n+
    291 template<class T, class U,
    \n+
    292 std::enable_if_t<std::is_same<std::decay_t<T>, std::decay_t<U>>::value, int> = 0,
    \n+
    293 std::enable_if_t<std::is_integral<std::decay_t<T>>::value, int> = 0>
    \n+
    \n+
    294 inline static IntegralRange<std::decay_t<T>> range(T &&from, U &&to) noexcept
    \n+
    295 {
    \n+
    296 return IntegralRange<std::decay_t<T>>(std::forward<T>(from), std::forward<U>(to));
    \n+
    297 }
    \n+
    \n+
    298
    \n+
    299 template<class T, std::enable_if_t<std::is_integral<std::decay_t<T>>::value, int> = 0>
    \n+
    \n+
    300 inline static IntegralRange<std::decay_t<T>> range(T &&to) noexcept
    \n+
    301 {
    \n+
    302 return IntegralRange<std::decay_t<T>>(std::forward<T>(to));
    \n+
    303 }
    \n+
    \n+
    304
    \n+
    305 template<class T, std::enable_if_t<std::is_enum<std::decay_t<T>>::value, int> = 0>
    \n+
    \n+\n+
    307 {
    \n+
    308 return IntegralRange<std::underlying_type_t<std::decay_t<T>>>(std::forward<T>(to));
    \n+
    309 }
    \n+
    \n+
    310
    \n+
    311 template<class T, T from, T to>
    \n+
    \n+
    312 inline static StaticIntegralRange<T, to, from> range(std::integral_constant<T, from>, std::integral_constant<T, to>) noexcept
    \n+
    313 {
    \n+
    314 return {};
    \n+
    315 }
    \n+
    \n+
    316
    \n+
    317 template<class T, T to>
    \n+
    \n+
    318 inline static StaticIntegralRange<T, to> range(std::integral_constant<T, to>) noexcept
    \n+
    319 {
    \n+
    320 return {};
    \n+
    321 }
    \n+
    \n+
    322
    \n+
    323
    \n+
    324
    \n+\n+
    329
    \n+\n+
    334
    \n+
    335 namespace Impl
    \n+
    336 {
    \n+
    337
    \n+
    338
    \n+
    339
    \n+
    340 // An iterator transforming a wrapped iterator using
    \n+
    341 // an unary function. It inherits the iterator-category
    \n+
    342 // of the underlying iterator.
    \n+
    343 //
    \n+
    344 // \\tparam I Type of the underlying iterator
    \n+
    345 // \\tparam F Type of transformation function that can either be applied directly or after dereferencing
    \n+
    346 // \\tparam TT Type of transformation (ValueTransformationTag or IteratorTransformationTag)
    \n+
    347 // \\tparam C An iterator category tag, defaults to the one of I
    \n+
    348 template <class I, class F, class TT, class C = typename std::iterator_traits<I>::iterator_category>
    \n+
    349 class TransformedRangeIterator;
    \n+
    350
    \n+
    351 template<class I, class F, class TT, class C>
    \n+
    352 struct TransformationRangeIteratorTraits
    \n+
    353 {
    \n+
    354 template<class FF>
    \n+
    355 static decltype(auto) transform(FF&& f, const I& it) {
    \n+
    356 if constexpr (std::is_same_v<TT,IteratorTransformationTag>)
    \n+
    357 {
    \n+
    358 if constexpr (Dune::IsCallable<FF(const I&)>::value)
    \n+
    359 return f(it);
    \n+
    360 else
    \n+
    361 return (*f)(it);
    \n+
    362 }
    \n+
    363 else
    \n+
    364 {
    \n+
    365 if constexpr (Dune::IsCallable<FF(decltype(*it))>::value)
    \n+
    366 return f(*it);
    \n+
    367 else
    \n+
    368 return (*f)(*it);
    \n+
    369 }
    \n+
    370 }
    \n+
    371
    \n+
    372 using reference = decltype(transform(std::declval<F>(), std::declval<I>()));
    \n+
    373 using value_type = Dune::AutonomousValue<reference>;
    \n+
    374 using pointer = std::conditional_t<std::is_lvalue_reference_v<reference>, value_type*, ProxyArrowResult<reference>>;
    \n+
    375 using difference_type = typename std::iterator_traits<I>::difference_type;
    \n+
    376 using Facade = Dune::IteratorFacade<TransformedRangeIterator<I,F,TT,C>, C, value_type, reference, pointer, difference_type>;
    \n+
    377 };
    \n+
    378
    \n+
    379
    \n+
    380 template <class I, class F, class TT, class C>
    \n+
    381 class TransformedRangeIterator :
    \n+
    382 public TransformationRangeIteratorTraits<I,F, TT, C>::Facade
    \n+
    383 {
    \n+
    384 using Traits = TransformationRangeIteratorTraits<I,F, TT, C>;
    \n+
    385 using Facade = typename Traits::Facade;
    \n+
    386
    \n+
    387 static constexpr bool isBidirectional = std::is_convertible_v<C, std::bidirectional_iterator_tag>;
    \n+
    388 static constexpr bool isRandomAccess = std::is_convertible_v<C, std::random_access_iterator_tag>;
    \n+
    389
    \n+
    390 public:
    \n+
    391
    \n+
    392 using Function = F;
    \n+
    393 using reference = typename Facade::reference;
    \n+
    394 using difference_type = typename Facade::difference_type;
    \n+
    395
    \n+
    396 template<class II, class FF>
    \n+
    397 constexpr TransformedRangeIterator(II&& it, FF&& f) noexcept :
    \n+
    398 it_(std::forward<II>(it)),
    \n+
    399 f_(std::forward<FF>(f))
    \n+
    400 {}
    \n+
    401
    \n+
    402 template<class II,
    \n+
    403 disableCopyMove<TransformedRangeIterator,II> =0,
    \n+
    404 std::enable_if_t<std::is_convertible_v<II, I> and std::is_default_constructible_v<F>, int> =0>
    \n+
    405 constexpr TransformedRangeIterator(II&& it) noexcept :
    \n+
    406 it_(std::forward<II>(it)),
    \n+
    407 f_()
    \n+
    408 {}
    \n+
    409
    \n+
    410 template<class FF,
    \n+
    411 disableCopyMove<TransformedRangeIterator,FF> =0,
    \n+
    412 std::enable_if_t<std::is_convertible_v<FF, F> and std::is_default_constructible_v<I>, int> =0>
    \n+
    413 constexpr TransformedRangeIterator(FF&& f) noexcept :
    \n+
    414 it_(),
    \n+
    415 f_(std::forward<FF>(f))
    \n+
    416 {}
    \n+
    417
    \n+
    418 // Explicitly initialize members. Using a plain
    \n+
    419 //
    \n+
    420 // constexpr TransformedRangeIterator() noexcept {}
    \n+
    421 //
    \n+
    422 // would default-initialize the members while
    \n+
    423 //
    \n+
    424 // constexpr TransformedRangeIterator() noexcept : it_(), f_() {}
    \n+
    425 //
    \n+
    426 // leads to value-initialization. This is a case where
    \n+
    427 // both are really different. If it_ is a raw pointer (i.e. POD)
    \n+
    428 // then default-initialization leaves it uninitialized while
    \n+
    429 // value-initialization zero-initializes it.
    \n+
    430 constexpr TransformedRangeIterator() noexcept :
    \n+
    431 it_(),
    \n+
    432 f_()
    \n+
    433 {}
    \n+
    434
    \n+
    435 // Dereferencing returns a value created by the function
    \n+
    436 constexpr reference operator*() const noexcept {
    \n+
    437 return Traits::transform(f_, it_);
    \n+
    438 }
    \n+
    439
    \n+
    440 protected:
    \n+
    441
    \n+\n+
    443
    \n+
    444 // Export base iterator, such that equalilty comparison,
    \n+
    445 // differences, and inequality comparisons are automatically
    \n+
    446 // forwarded to the base iterator by the facade.
    \n+
    447 const I& baseIterator() const noexcept {
    \n+
    448 return it_;
    \n+
    449 }
    \n+
    450
    \n+
    451 I& baseIterator() noexcept {
    \n+
    452 return it_;
    \n+
    453 }
    \n+
    454
    \n+
    455 I it_;
    \n+
    456 Function f_;
    \n+
    457 };
    \n+
    458
    \n+
    459 } // namespace Impl
    \n+
    460
    \n+
    461
    \n+
    462
    \n+
    499 template <class R, class F, class T=ValueTransformationTag>
    \n+
    \n+\n+
    501 {
    \n+
    502 using RawConstIterator = std::decay_t<decltype(std::declval<const R>().begin())>;
    \n+
    503 using RawIterator = std::decay_t<decltype(std::declval<R>().begin())>;
    \n+
    504
    \n+
    505 public:
    \n+
    506
    \n+
    513 using const_iterator = Impl::TransformedRangeIterator<RawConstIterator, const F*, T>;
    \n+
    514
    \n+
    521 using iterator = Impl::TransformedRangeIterator<RawIterator, F*, T>;
    \n+
    522
    \n+
    529 using RawRange = std::remove_reference_t<R>;
    \n+
    530
    \n+
    534 template<class RR, class FF>
    \n+
    \n+
    535 constexpr TransformedRangeView(RR&& rawRange, FF&& f) noexcept :
    \n+
    536 rawRange_(std::forward<RR>(rawRange)),
    \n+
    537 f_(std::forward<FF>(f))
    \n+
    538 {
    \n+
    539 static_assert(std::is_same_v<T, ValueTransformationTag> or std::is_same_v<T, IteratorTransformationTag>,
    \n+
    540 "The TransformationType passed to TransformedRangeView has to be either ValueTransformationTag or IteratorTransformationTag.");
    \n+
    541 }
    \n+
    \n+
    542
    \n+
    \n+
    551 constexpr const_iterator begin() const noexcept {
    \n+
    552 return const_iterator(rawRange_.begin(), &f_);
    \n+
    553 }
    \n+
    \n+
    554
    \n+
    \n+
    555 constexpr iterator begin() noexcept {
    \n+
    556 return iterator(rawRange_.begin(), &f_);
    \n+
    557 }
    \n+
    \n+
    558
    \n+
    \n+
    567 constexpr const_iterator end() const noexcept {
    \n+
    568 return const_iterator(rawRange_.end(), &f_);
    \n+
    569 }
    \n+
    \n+
    570
    \n+
    \n+
    571 constexpr iterator end() noexcept {
    \n+
    572 return iterator(rawRange_.end(), &f_);
    \n+
    573 }
    \n+
    \n+
    574
    \n+
    578 template<class It=const_iterator,
    \n+
    579 std::enable_if_t<std::is_same_v<typename It::iterator_category,std::random_access_iterator_tag>, int> = 0>
    \n+
    \n+
    580 constexpr decltype(auto) operator[](std::size_t i) const noexcept
    \n+
    581 {
    \n+
    582 return this->begin()[i];
    \n+
    583 }
    \n+
    \n+
    584
    \n+
    588 template<class It=iterator,
    \n+
    589 std::enable_if_t<std::is_same_v<typename It::iterator_category,std::random_access_iterator_tag>, int> = 0>
    \n+
    \n+
    590 constexpr decltype(auto) operator[](std::size_t i) noexcept
    \n+
    591 {
    \n+
    592 return this->begin()[i];
    \n+
    593 }
    \n+
    \n+
    594
    \n+
    605 template<class Range=R,
    \n+
    606 class = std::void_t<decltype(std::declval<const Range>().size())>>
    \n+
    \n+
    607 auto size() const noexcept
    \n+
    608 {
    \n+
    609 return rawRange_.size();
    \n+
    610 }
    \n+
    \n+
    611
    \n+
    \n+
    615 constexpr bool empty() const noexcept
    \n+
    616 {
    \n+
    617 return rawRange_.begin() == rawRange_.end();
    \n+
    618 }
    \n+
    \n+
    619
    \n+
    \n+
    623 const RawRange& rawRange() const noexcept
    \n+
    624 {
    \n+
    625 return rawRange_;
    \n+
    626 }
    \n+
    \n+
    627
    \n+
    \n+
    631 RawRange& rawRange() noexcept
    \n+
    632 {
    \n+
    633 return rawRange_;
    \n+
    634 }
    \n+
    \n+
    635
    \n+
    636 private:
    \n+
    637 R rawRange_;
    \n+
    638 F f_;
    \n+
    639 };
    \n+
    \n+
    640
    \n+
    669 template <class R, class F>
    \n+
    \n+\n+
    671 {
    \n+
    672 return TransformedRangeView<R, std::decay_t<F>, ValueTransformationTag>(std::forward<R>(range), std::forward<F>(f));
    \n+
    673 }
    \n+
    \n+
    674
    \n+
    702 template <class R, class F>
    \n+
    \n+\n+
    704 {
    \n+
    705 return TransformedRangeView<R, std::decay_t<F>, IteratorTransformationTag>(std::forward<R>(range), std::forward<F>(f));
    \n+
    706 }
    \n+
    \n+
    707
    \n+
    708
    \n+
    721 template<class Range>
    \n+
    \n+
    722 auto sparseRange(Range&& range) {
    \n+
    723 return Dune::iteratorTransformedRangeView(std::forward<Range>(range), [](auto&& it) {
    \n+
    724 return std::tuple<decltype(*it), decltype(it.index())>(*it, it.index());
    \n+
    725 });
    \n+
    726 }
    \n+
    \n+
    727
    \n+
    732}
    \n+
    733
    \n+
    734#endif // DUNE_COMMON_RANGE_UTILITIES_HH
    \n+
    Traits for type conversions and type information.
    \n+
    This file implements iterator facade classes for writing stl conformant iterators.
    \n+
    auto iteratorTransformedRangeView(R &&range, F &&f)
    Create a TransformedRangeView using an iterator transformation.
    Definition rangeutilities.hh:703
    \n+
    auto transformedRangeView(R &&range, F &&f)
    Create a TransformedRangeView.
    Definition rangeutilities.hh:670
    \n+
    auto sparseRange(Range &&range)
    Allow structured-binding for-loops for sparse iterators.
    Definition rangeutilities.hh:722
    \n+
    static StaticIntegralRange< T, to, from > range(std::integral_constant< T, from >, std::integral_constant< T, to >) noexcept
    Definition rangeutilities.hh:312
    \n+
    typename AutonomousValueType< T >::type AutonomousValue
    Type free of internal references that T can be converted to.
    Definition typetraits.hh:588
    \n+
    bigunsignedint< k > operator*(const bigunsignedint< k > &x, std::uintmax_t y)
    Definition bigunsignedint.hh:549
    \n+
    bigunsignedint< k > operator-(const bigunsignedint< k > &x, std::uintmax_t y)
    Definition bigunsignedint.hh:542
    \n+
    bigunsignedint< k > operator+(const bigunsignedint< k > &x, std::uintmax_t y)
    Definition bigunsignedint.hh:535
    \n+
    EnableIfInterOperable< T1, T2, bool >::type operator<(const RandomAccessIteratorFacade< T1, V1, R1, D > &lhs, const RandomAccessIteratorFacade< T2, V2, R2, D > &rhs)
    Comparison operator.
    Definition iteratorfacades.hh:638
    \n+
    EnableIfInterOperable< T1, T2, bool >::type operator>(const RandomAccessIteratorFacade< T1, V1, R1, D > &lhs, const RandomAccessIteratorFacade< T2, V2, R2, D > &rhs)
    Comparison operator.
    Definition iteratorfacades.hh:684
    \n+
    EnableIfInterOperable< T1, T2, bool >::type operator<=(const RandomAccessIteratorFacade< T1, V1, R1, D > &lhs, const RandomAccessIteratorFacade< T2, V2, R2, D > &rhs)
    Comparison operator.
    Definition iteratorfacades.hh:661
    \n+
    EnableIfInterOperable< T1, T2, bool >::type operator==(const ForwardIteratorFacade< T1, V1, R1, D > &lhs, const ForwardIteratorFacade< T2, V2, R2, D > &rhs)
    Checks for equality.
    Definition iteratorfacades.hh:238
    \n+
    EnableIfInterOperable< T1, T2, bool >::type operator>=(const RandomAccessIteratorFacade< T1, V1, R1, D > &lhs, const RandomAccessIteratorFacade< T2, V2, R2, D > &rhs)
    Comparison operator.
    Definition iteratorfacades.hh:706
    \n+
    EnableIfInterOperable< T1, T2, bool >::type operator!=(const ForwardIteratorFacade< T1, V1, R1, D > &lhs, const ForwardIteratorFacade< T2, V2, R2, D > &rhs)
    Checks for inequality.
    Definition iteratorfacades.hh:260
    \n+
    Dune namespace.
    Definition alignedallocator.hh:13
    \n+
    bool any_true(const AlignedNumber< bool, align > &val)
    Definition debugalign.hh:506
    \n+
    bool all_true(const AlignedNumber< bool, align > &val)
    Definition debugalign.hh:512
    \n+
    T max_value(const AlignedNumber< T, align > &val)
    Definition debugalign.hh:494
    \n+
    T min_value(const AlignedNumber< T, align > &val)
    Definition debugalign.hh:500
    \n+
    This class encapsulates access of IteratorFacade.
    Definition iteratorfacades.hh:786
    \n+
    CRTP-Mixing class for stl conformant iterators of given iterator category.
    Definition iteratorfacades.hh:1053
    \n+
    constexpr decltype(auto) operator*() const
    Dereferencing operator.
    Definition iteratorfacades.hh:1119
    \n+
    dynamic integer range for use in range-based for loops
    Definition rangeutilities.hh:177
    \n+
    constexpr iterator begin() const noexcept
    obtain a random-access iterator to the first element
    Definition rangeutilities.hh:194
    \n+
    constexpr iterator end() const noexcept
    obtain a random-access iterator past the last element
    Definition rangeutilities.hh:196
    \n+
    std::make_unsigned_t< T > size_type
    unsigned integer type corresponding to value_type
    Definition rangeutilities.hh:184
    \n+
    Impl::IntegralRangeIterator< T > iterator
    type of iterator
    Definition rangeutilities.hh:182
    \n+
    constexpr value_type operator[](const value_type &i) const noexcept
    access specified element
    Definition rangeutilities.hh:199
    \n+
    constexpr bool contains(value_type index) const noexcept
    check whether given index is within range [from, to)
    Definition rangeutilities.hh:207
    \n+
    constexpr bool empty() const noexcept
    check whether the range is empty
    Definition rangeutilities.hh:202
    \n+
    constexpr IntegralRange(std::pair< value_type, value_type > range) noexcept
    construct integer range std::pair
    Definition rangeutilities.hh:191
    \n+
    constexpr IntegralRange(value_type from, value_type to) noexcept
    construct integer range [from, to)
    Definition rangeutilities.hh:187
    \n+
    constexpr size_type size() const noexcept
    obtain number of elements in the range
    Definition rangeutilities.hh:204
    \n+
    constexpr IntegralRange(value_type to) noexcept
    construct integer range [0, to)
    Definition rangeutilities.hh:189
    \n+
    T value_type
    type of integers contained in the range
    Definition rangeutilities.hh:180
    \n+
    static integer range for use in range-based for loops
    Definition rangeutilities.hh:230
    \n+
    static constexpr iterator end() noexcept
    obtain a random-access iterator past the last element
    Definition rangeutilities.hh:259
    \n+
    decltype(shift_integer_sequence< from >(std::make_integer_sequence< T, to-from >())) integer_sequence
    type of corresponding std::integer_sequence
    Definition rangeutilities.hh:243
    \n+
    static constexpr bool contains(value_type index) noexcept
    check whether given index is within range [from, to)
    Definition rangeutilities.hh:278
    \n+
    constexpr StaticIntegralRange() noexcept=default
    default constructor
    \n+
    std::make_unsigned_t< T > size_type
    unsigned integer type corresponding to value_type
    Definition rangeutilities.hh:240
    \n+
    T value_type
    type of integers contained in the range
    Definition rangeutilities.hh:236
    \n+
    constexpr auto operator[](const std::integral_constant< U, i > &) const noexcept -> std::integral_constant< value_type, from+static_cast< value_type >(i)>
    access specified element (static version)
    Definition rangeutilities.hh:263
    \n+
    static constexpr std::integral_constant< bool, from==to > empty() noexcept
    check whether the range is empty
    Definition rangeutilities.hh:273
    \n+
    static constexpr iterator begin() noexcept
    obtain a random-access iterator to the first element
    Definition rangeutilities.hh:257
    \n+
    static constexpr integer_sequence to_integer_sequence() noexcept
    return corresponding std::integer_sequence
    Definition rangeutilities.hh:254
    \n+
    constexpr value_type operator[](const size_type &i) const noexcept
    access specified element (dynamic version)
    Definition rangeutilities.hh:270
    \n+
    Impl::IntegralRangeIterator< T > iterator
    type of iterator
    Definition rangeutilities.hh:238
    \n+
    static constexpr std::integral_constant< size_type, static_cast< size_type >(to) - static_cast< size_type >(from) > size() noexcept
    obtain number of elements in the range
    Definition rangeutilities.hh:275
    \n+
    Tag to enable value based transformations in TransformedRangeView.
    Definition rangeutilities.hh:328
    \n+
    Tag to enable iterator based transformations in TransformedRangeView.
    Definition rangeutilities.hh:333
    \n+
    A range transforming the values of another range on-the-fly.
    Definition rangeutilities.hh:501
    \n+
    Impl::TransformedRangeIterator< RawIterator, F *, T > iterator
    Iterator type.
    Definition rangeutilities.hh:521
    \n+
    constexpr TransformedRangeView(RR &&rawRange, FF &&f) noexcept
    Construct from range and function.
    Definition rangeutilities.hh:535
    \n+
    constexpr iterator end() noexcept
    Definition rangeutilities.hh:571
    \n+
    Impl::TransformedRangeIterator< RawConstIterator, const F *, T > const_iterator
    Const iterator type.
    Definition rangeutilities.hh:513
    \n+
    std::remove_reference_t< R > RawRange
    Export type of the wrapped untransformed range.
    Definition rangeutilities.hh:529
    \n+
    constexpr iterator begin() noexcept
    Definition rangeutilities.hh:555
    \n+
    RawRange & rawRange() noexcept
    Export the wrapped untransformed range.
    Definition rangeutilities.hh:631
    \n+
    const RawRange & rawRange() const noexcept
    Export the wrapped untransformed range.
    Definition rangeutilities.hh:623
    \n+
    constexpr const_iterator begin() const noexcept
    Obtain a iterator to the first element.
    Definition rangeutilities.hh:551
    \n+
    auto size() const noexcept
    Obtain the size of the range.
    Definition rangeutilities.hh:607
    \n+
    constexpr const_iterator end() const noexcept
    Obtain a iterator past the last element.
    Definition rangeutilities.hh:567
    \n+
    constexpr bool empty() const noexcept
    Checks whether the range is empty.
    Definition rangeutilities.hh:615
    \n+
    Check if a type is callable with ()-operator and given arguments.
    Definition typetraits.hh:162
    \n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,229 +1,804 @@\n dune-common\u00a02.10\n Loading...\n Searching...\n No Matches\n * _\bd_\bu_\bn_\be\n * _\bc_\bo_\bm_\bm_\bo_\bn\n- * _\bs_\bt_\bd\n-layout_left.hh\n+rangeutilities.hh\n _\bG_\bo_\b _\bt_\bo_\b _\bt_\bh_\be_\b _\bd_\bo_\bc_\bu_\bm_\be_\bn_\bt_\ba_\bt_\bi_\bo_\bn_\b _\bo_\bf_\b _\bt_\bh_\bi_\bs_\b _\bf_\bi_\bl_\be_\b.\n 1// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-\n 2// vi: set et ts=4 sw=2 sts=2:\n 3// SPDX-FileCopyrightInfo: Copyright \u00c2\u00a9 DUNE Project contributors, see file\n LICENSE.md in module root\n 4// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception\n-5#ifndef DUNE_COMMON_STD_LAYOUT_LEFT_HH\n-6#define DUNE_COMMON_STD_LAYOUT_LEFT_HH\n+5#ifndef DUNE_COMMON_RANGE_UTILITIES_HH\n+6#define DUNE_COMMON_RANGE_UTILITIES_HH\n 7\n-8#include \n-9#include \n-10\n-11#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bi_\bn_\bd_\bi_\bc_\be_\bs_\b._\bh_\bh>\n-12#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bs_\bt_\bd_\b/_\bi_\bm_\bp_\bl_\b/_\bf_\bw_\bd_\b__\bl_\ba_\by_\bo_\bu_\bt_\bs_\b._\bh_\bh>\n-13\n-14namespace _\bD_\bu_\bn_\be_\b:_\b:_\bS_\bt_\bd {\n+8#include \n+9#include \n+10#include \n+11#include \n+12\n+13#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bt_\by_\bp_\be_\bt_\br_\ba_\bi_\bt_\bs_\b._\bh_\bh>\n+14#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bi_\bt_\be_\br_\ba_\bt_\bo_\br_\bf_\ba_\bc_\ba_\bd_\be_\bs_\b._\bh_\bh>\n 15\n-17template \n-_\b1_\b8class _\bl_\ba_\by_\bo_\bu_\bt_\b__\bl_\be_\bf_\bt_\b:_\b:_\bm_\ba_\bp_\bp_\bi_\bn_\bg\n-19{\n-_\b2_\b0 template friend class _\bm_\ba_\bp_\bp_\bi_\bn_\bg;\n-21\n-22public:\n-_\b2_\b3 using _\be_\bx_\bt_\be_\bn_\bt_\bs_\b__\bt_\by_\bp_\be = Extents;\n-_\b2_\b4 using _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be = typename extents_type::size_type;\n-_\b2_\b5 using _\br_\ba_\bn_\bk_\b__\bt_\by_\bp_\be = typename extents_type::rank_type;\n-_\b2_\b6 using _\bi_\bn_\bd_\be_\bx_\b__\bt_\by_\bp_\be = typename extents_type::index_type;\n-_\b2_\b7 using _\bl_\ba_\by_\bo_\bu_\bt_\b__\bt_\by_\bp_\be = _\bl_\ba_\by_\bo_\bu_\bt_\b__\bl_\be_\bf_\bt;\n-28\n-_\b3_\b0 constexpr _\bm_\ba_\bp_\bp_\bi_\bn_\bg () noexcept = default;\n-31\n-_\b3_\b3 constexpr _\bm_\ba_\bp_\bp_\bi_\bn_\bg (const _\bm_\ba_\bp_\bp_\bi_\bn_\bg&) noexcept = default;\n-34\n-_\b3_\b6 constexpr _\bm_\ba_\bp_\bp_\bi_\bn_\bg (const _\be_\bx_\bt_\be_\bn_\bt_\bs_\b__\bt_\by_\bp_\be& e) noexcept\n-37 : extents_(e)\n-38 {}\n-39\n-41 template , int> =\n-0>\n-43 #if __cpp_conditional_explicit >= 201806L\n-44 explicit(!std::is_convertible_v)\n-45 #endif\n-_\b4_\b6 constexpr _\bm_\ba_\bp_\bp_\bi_\bn_\bg (const _\bm_\ba_\bp_\bp_\bi_\bn_\bg_\b<_\bO_\bt_\bh_\be_\br_\bE_\bx_\bt_\be_\bn_\bt_\bs_\b>& m) noexcept\n-47 : extents_(m._\be_\bx_\bt_\be_\bn_\bt_\bs())\n-48 {}\n-49\n-51 template = 0,\n-53 std::enable_if_t, int> =\n-0>\n-54 #if __cpp_conditional_explicit >= 201806L\n-55 explicit(!std::is_convertible_v)\n-56 #endif\n-_\b5_\b7 constexpr _\bm_\ba_\bp_\bp_\bi_\bn_\bg (const _\bl_\ba_\by_\bo_\bu_\bt_\b__\br_\bi_\bg_\bh_\bt_\b:_\b:_\bm_\ba_\bp_\bp_\bi_\bn_\bg_\b<_\bO_\bt_\bh_\be_\br_\bE_\bx_\bt_\be_\bn_\bt_\bs_\b>& m) noexcept\n-58 : extents_(m._\be_\bx_\bt_\be_\bn_\bt_\bs())\n-59 {}\n+23namespace _\bD_\bu_\bn_\be\n+24{\n+25\n+36 template ::value, int>::type = 0>\n+38 typename T::value_type\n+_\b3_\b9 _\bm_\ba_\bx_\b__\bv_\ba_\bl_\bu_\be(const T & v) {\n+40 using std::max_element;\n+41 return *max_element(v.begin(), v.end());\n+42 }\n+43\n+44 template ::value, int>::type = 0>\n+_\b4_\b6 const T & _\bm_\ba_\bx_\b__\bv_\ba_\bl_\bu_\be(const T & v) { return v; }\n+47\n+53 template ::value, int>::type = 0>\n+55 typename T::value_type\n+_\b5_\b6 _\bm_\bi_\bn_\b__\bv_\ba_\bl_\bu_\be(const T & v) {\n+57 using std::min_element;\n+58 return *min_element(v.begin(), v.end());\n+59 }\n 60\n-62 template , int> =\n-0>\n-64 #if __cpp_conditional_explicit >= 201806L\n-65 explicit(extents_type::rank() > 0)\n-66 #endif\n-_\b6_\b7 constexpr _\bm_\ba_\bp_\bp_\bi_\bn_\bg (const _\bl_\ba_\by_\bo_\bu_\bt_\b__\bs_\bt_\br_\bi_\bd_\be_\b:_\b:_\bm_\ba_\bp_\bp_\bi_\bn_\bg_\b<_\bO_\bt_\bh_\be_\br_\bE_\bx_\bt_\be_\bn_\bt_\bs_\b>& m)\n-68 : extents_(m._\be_\bx_\bt_\be_\bn_\bt_\bs())\n-69 {\n-70#ifndef NDEBUG\n-71 if constexpr(extents_type::rank() > 0) {\n-72 _\bi_\bn_\bd_\be_\bx_\b__\bt_\by_\bp_\be prod = 1;\n-73 for (_\br_\ba_\bn_\bk_\b__\bt_\by_\bp_\be r = 0; r < extents_type::rank()-1; ++r) {\n-74 assert(m._\bs_\bt_\br_\bi_\bd_\be_\bs(r) == prod);\n-75 prod *= m._\be_\bx_\bt_\be_\bn_\bt_\bs().extent(r);\n-76 }\n-77 assert(m._\bs_\bt_\br_\bi_\bd_\be_\bs(extents_type::rank()-1) == prod);\n-78 }\n-79#endif\n-80 }\n-81\n-_\b8_\b3 constexpr _\bm_\ba_\bp_\bp_\bi_\bn_\bg& _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b=_\b (const _\bm_\ba_\bp_\bp_\bi_\bn_\bg&) noexcept = default;\n-84\n-_\b8_\b5 constexpr const _\be_\bx_\bt_\be_\bn_\bt_\bs_\b__\bt_\by_\bp_\be& _\be_\bx_\bt_\be_\bn_\bt_\bs () const noexcept { return extents_; }\n-_\b8_\b6 constexpr _\bi_\bn_\bd_\be_\bx_\b__\bt_\by_\bp_\be _\br_\be_\bq_\bu_\bi_\br_\be_\bd_\b__\bs_\bp_\ba_\bn_\b__\bs_\bi_\bz_\be () const noexcept { return\n-extents_.product(); }\n-87\n-89 template = 0,\n-91 std::enable_if_t<(... && std::is_convertible_v), int> =\n-0,\n-92 std::enable_if_t<(... && std::is_nothrow_constructible_v), int> = 0>\n-_\b9_\b3 constexpr _\bi_\bn_\bd_\be_\bx_\b__\bt_\by_\bp_\be operator() (Indices... ii) const noexcept\n-94 {\n-95 const std::array indices{_\bi_\bn_\bd_\be_\bx_\b__\bt_\by_\bp_\be(std::move(ii))...};\n-96 _\bi_\bn_\bd_\be_\bx_\b__\bt_\by_\bp_\be value = indices.back();\n-97 for (_\br_\ba_\bn_\bk_\b__\bt_\by_\bp_\be r = 1; r < extents_type::rank(); ++r) {\n-98 const _\br_\ba_\bn_\bk_\b__\bt_\by_\bp_\be j = extents_type::rank()-r;\n-99 value = indices[j-1] + extents_.extent(j-1) * value;\n-100 }\n-101 return value;\n-102 }\n-103\n-_\b1_\b0_\b5 constexpr _\bi_\bn_\bd_\be_\bx_\b__\bt_\by_\bp_\be _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b(_\b)_\b () const noexcept\n-106 {\n-107 return 0;\n-108 }\n-109\n-_\b1_\b1_\b0 static constexpr bool _\bi_\bs_\b__\ba_\bl_\bw_\ba_\by_\bs_\b__\bu_\bn_\bi_\bq_\bu_\be () noexcept { return true; }\n-_\b1_\b1_\b1 static constexpr bool _\bi_\bs_\b__\ba_\bl_\bw_\ba_\by_\bs_\b__\be_\bx_\bh_\ba_\bu_\bs_\bt_\bi_\bv_\be () noexcept { return true; }\n-_\b1_\b1_\b2 static constexpr bool _\bi_\bs_\b__\ba_\bl_\bw_\ba_\by_\bs_\b__\bs_\bt_\br_\bi_\bd_\be_\bd () noexcept { return true; }\n+61 template ::value, int>::type = 0>\n+_\b6_\b3 const T & _\bm_\bi_\bn_\b__\bv_\ba_\bl_\bu_\be(const T & v) { return v; }\n+64\n+70 template ::value, int>::type = 0>\n+_\b7_\b2 bool _\ba_\bn_\by_\b__\bt_\br_\bu_\be(const T & v) {\n+73 bool b = false;\n+74 for (const auto & e : v)\n+75 b = b or bool(e);\n+76 return b;\n+77 }\n+78\n+79 template ::value, int>::type = 0>\n+81 bool _\ba_\bn_\by_\b__\bt_\br_\bu_\be(const T & v) { return v; }\n+82\n+83 template\n+_\b8_\b4 bool _\ba_\bn_\by_\b__\bt_\br_\bu_\be(const std::bitset & b)\n+85 {\n+86 return b.any();\n+87 }\n+88\n+94 template ::value, int>::type = 0>\n+_\b9_\b6 bool _\ba_\bl_\bl_\b__\bt_\br_\bu_\be(const T & v) {\n+97 bool b = true;\n+98 for (const auto & e : v)\n+99 b = b and bool(e);\n+100 return b;\n+101 }\n+102\n+103 template ::value, int>::type = 0>\n+105 bool _\ba_\bl_\bl_\b__\bt_\br_\bu_\be(const T & v) { return v; }\n+106\n+107 template\n+_\b1_\b0_\b8 bool _\ba_\bl_\bl_\b__\bt_\br_\bu_\be(const std::bitset & b)\n+109 {\n+110 return b.all();\n+111 }\n+112\n 113\n-_\b1_\b1_\b4 static constexpr bool _\bi_\bs_\b__\bu_\bn_\bi_\bq_\bu_\be () noexcept { return true; }\n-_\b1_\b1_\b5 static constexpr bool _\bi_\bs_\b__\be_\bx_\bh_\ba_\bu_\bs_\bt_\bi_\bv_\be () noexcept { return true; }\n-_\b1_\b1_\b6 static constexpr bool _\bi_\bs_\b__\bs_\bt_\br_\bi_\bd_\be_\bd () noexcept { return true; }\n+114\n+115 namespace Impl\n+116 {\n 117\n-119 template 0), int> = 0>\n-_\b1_\b2_\b1 constexpr _\bi_\bn_\bd_\be_\bx_\b__\bt_\by_\bp_\be _\bs_\bt_\br_\bi_\bd_\be (_\br_\ba_\bn_\bk_\b__\bt_\by_\bp_\be i) const noexcept\n-122 {\n-123 assert(i < extents_type::rank());\n-124 _\bi_\bn_\bd_\be_\bx_\b__\bt_\by_\bp_\be prod = 1;\n-125 for (_\br_\ba_\bn_\bk_\b__\bt_\by_\bp_\be r = 0; r < i; ++r)\n-126 prod *= _\be_\bx_\bt_\be_\bn_\bt_\bs().extent(r);\n-127 return prod;\n-128 }\n-129\n-130 template = 0>\n-_\b1_\b3_\b2 friend constexpr bool operator== (const _\bm_\ba_\bp_\bp_\bi_\bn_\bg& a, const\n-_\bm_\ba_\bp_\bp_\bi_\bn_\bg_\b<_\bO_\bt_\bh_\be_\br_\bE_\bx_\bt_\be_\bn_\bt_\bs_\b>& b) noexcept\n-133 {\n-134 return a.extents_ == b.extents_;\n-135 }\n-136\n-137private:\n-138 [[no_unique_address]] _\be_\bx_\bt_\be_\bn_\bt_\bs_\b__\bt_\by_\bp_\be extents_;\n-139};\n-140\n-141} // end namespace Dune::Std\n-142\n-143#endif // DUNE_COMMON_STD_LAYOUT_LEFT_HH\n-_\bf_\bw_\bd_\b__\bl_\ba_\by_\bo_\bu_\bt_\bs_\b._\bh_\bh\n-_\bi_\bn_\bd_\bi_\bc_\be_\bs_\b._\bh_\bh\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bt_\bd\n-Namespace for features backported from new C++ standards.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn default_accessor.hh:10\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bt_\bd_\b:_\b:_\bl_\ba_\by_\bo_\bu_\bt_\b__\bl_\be_\bf_\bt\n-A layout where the leftmost extent has stride 1.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn fwd_layouts.hh:17\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bt_\bd_\b:_\b:_\bl_\ba_\by_\bo_\bu_\bt_\b__\bl_\be_\bf_\bt_\b:_\b:_\bm_\ba_\bp_\bp_\bi_\bn_\bg\n-A layout mapping where the leftmost extent has stride 1.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn layout_left.hh:19\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bt_\bd_\b:_\b:_\bl_\ba_\by_\bo_\bu_\bt_\b__\bl_\be_\bf_\bt_\b:_\b:_\bm_\ba_\bp_\bp_\bi_\bn_\bg_\b:_\b:_\bs_\bt_\br_\bi_\bd_\be\n-constexpr index_type stride(rank_type i) const noexcept\n-The stride is the product of the extents E(0)*E(1)*...*E(i-1)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn layout_left.hh:121\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bt_\bd_\b:_\b:_\bl_\ba_\by_\bo_\bu_\bt_\b__\bl_\be_\bf_\bt_\b:_\b:_\bm_\ba_\bp_\bp_\bi_\bn_\bg_\b:_\b:_\bi_\bn_\bd_\be_\bx_\b__\bt_\by_\bp_\be\n-typename extents_type::index_type index_type\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn layout_left.hh:26\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bt_\bd_\b:_\b:_\bl_\ba_\by_\bo_\bu_\bt_\b__\bl_\be_\bf_\bt_\b:_\b:_\bm_\ba_\bp_\bp_\bi_\bn_\bg_\b:_\b:_\br_\be_\bq_\bu_\bi_\br_\be_\bd_\b__\bs_\bp_\ba_\bn_\b__\bs_\bi_\bz_\be\n-constexpr index_type required_span_size() const noexcept\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn layout_left.hh:86\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bt_\bd_\b:_\b:_\bl_\ba_\by_\bo_\bu_\bt_\b__\bl_\be_\bf_\bt_\b:_\b:_\bm_\ba_\bp_\bp_\bi_\bn_\bg_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b=\n-constexpr mapping & operator=(const mapping &) noexcept=default\n-Copy-assignment for the mapping.\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bt_\bd_\b:_\b:_\bl_\ba_\by_\bo_\bu_\bt_\b__\bl_\be_\bf_\bt_\b:_\b:_\bm_\ba_\bp_\bp_\bi_\bn_\bg_\b:_\b:_\be_\bx_\bt_\be_\bn_\bt_\bs_\b__\bt_\by_\bp_\be\n-Extents extents_type\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn layout_left.hh:23\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bt_\bd_\b:_\b:_\bl_\ba_\by_\bo_\bu_\bt_\b__\bl_\be_\bf_\bt_\b:_\b:_\bm_\ba_\bp_\bp_\bi_\bn_\bg_\b:_\b:_\bi_\bs_\b__\ba_\bl_\bw_\ba_\by_\bs_\b__\bu_\bn_\bi_\bq_\bu_\be\n-static constexpr bool is_always_unique() noexcept\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn layout_left.hh:110\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bt_\bd_\b:_\b:_\bl_\ba_\by_\bo_\bu_\bt_\b__\bl_\be_\bf_\bt_\b:_\b:_\bm_\ba_\bp_\bp_\bi_\bn_\bg_\b:_\b:_\bm_\ba_\bp_\bp_\bi_\bn_\bg\n-constexpr mapping() noexcept=default\n-The default construction is possible for default constructible extents.\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bt_\bd_\b:_\b:_\bl_\ba_\by_\bo_\bu_\bt_\b__\bl_\be_\bf_\bt_\b:_\b:_\bm_\ba_\bp_\bp_\bi_\bn_\bg_\b:_\b:_\bi_\bs_\b__\bs_\bt_\br_\bi_\bd_\be_\bd\n-static constexpr bool is_strided() noexcept\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn layout_left.hh:116\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bt_\bd_\b:_\b:_\bl_\ba_\by_\bo_\bu_\bt_\b__\bl_\be_\bf_\bt_\b:_\b:_\bm_\ba_\bp_\bp_\bi_\bn_\bg_\b:_\b:_\bi_\bs_\b__\ba_\bl_\bw_\ba_\by_\bs_\b__\bs_\bt_\br_\bi_\bd_\be_\bd\n-static constexpr bool is_always_strided() noexcept\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn layout_left.hh:112\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bt_\bd_\b:_\b:_\bl_\ba_\by_\bo_\bu_\bt_\b__\bl_\be_\bf_\bt_\b:_\b:_\bm_\ba_\bp_\bp_\bi_\bn_\bg_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b(_\b)\n-constexpr index_type operator()() const noexcept\n-The default offset for rank-0 tensors is 0.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn layout_left.hh:105\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bt_\bd_\b:_\b:_\bl_\ba_\by_\bo_\bu_\bt_\b__\bl_\be_\bf_\bt_\b:_\b:_\bm_\ba_\bp_\bp_\bi_\bn_\bg_\b:_\b:_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be\n-typename extents_type::size_type size_type\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn layout_left.hh:24\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bt_\bd_\b:_\b:_\bl_\ba_\by_\bo_\bu_\bt_\b__\bl_\be_\bf_\bt_\b:_\b:_\bm_\ba_\bp_\bp_\bi_\bn_\bg_\b:_\b:_\bi_\bs_\b__\bu_\bn_\bi_\bq_\bu_\be\n-static constexpr bool is_unique() noexcept\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn layout_left.hh:114\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bt_\bd_\b:_\b:_\bl_\ba_\by_\bo_\bu_\bt_\b__\bl_\be_\bf_\bt_\b:_\b:_\bm_\ba_\bp_\bp_\bi_\bn_\bg_\b:_\b:_\bm_\ba_\bp_\bp_\bi_\bn_\bg\n-constexpr mapping(const layout_right::mapping< OtherExtents > &m) noexcept\n-Construct the mapping from a layout_right.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn layout_left.hh:57\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bt_\bd_\b:_\b:_\bl_\ba_\by_\bo_\bu_\bt_\b__\bl_\be_\bf_\bt_\b:_\b:_\bm_\ba_\bp_\bp_\bi_\bn_\bg_\b:_\b:_\be_\bx_\bt_\be_\bn_\bt_\bs\n-constexpr const extents_type & extents() const noexcept\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn layout_left.hh:85\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bt_\bd_\b:_\b:_\bl_\ba_\by_\bo_\bu_\bt_\b__\bl_\be_\bf_\bt_\b:_\b:_\bm_\ba_\bp_\bp_\bi_\bn_\bg_\b:_\b:_\bi_\bs_\b__\ba_\bl_\bw_\ba_\by_\bs_\b__\be_\bx_\bh_\ba_\bu_\bs_\bt_\bi_\bv_\be\n-static constexpr bool is_always_exhaustive() noexcept\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn layout_left.hh:111\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bt_\bd_\b:_\b:_\bl_\ba_\by_\bo_\bu_\bt_\b__\bl_\be_\bf_\bt_\b:_\b:_\bm_\ba_\bp_\bp_\bi_\bn_\bg_\b:_\b:_\br_\ba_\bn_\bk_\b__\bt_\by_\bp_\be\n-typename extents_type::rank_type rank_type\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn layout_left.hh:25\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bt_\bd_\b:_\b:_\bl_\ba_\by_\bo_\bu_\bt_\b__\bl_\be_\bf_\bt_\b:_\b:_\bm_\ba_\bp_\bp_\bi_\bn_\bg_\b:_\b:_\bi_\bs_\b__\be_\bx_\bh_\ba_\bu_\bs_\bt_\bi_\bv_\be\n-static constexpr bool is_exhaustive() noexcept\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn layout_left.hh:115\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bt_\bd_\b:_\b:_\bl_\ba_\by_\bo_\bu_\bt_\b__\br_\bi_\bg_\bh_\bt_\b:_\b:_\bm_\ba_\bp_\bp_\bi_\bn_\bg\n-A layout mapping where the rightmost extent has stride 1.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn layout_right.hh:19\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bt_\bd_\b:_\b:_\bl_\ba_\by_\bo_\bu_\bt_\b__\bs_\bt_\br_\bi_\bd_\be_\b:_\b:_\bm_\ba_\bp_\bp_\bi_\bn_\bg\n-A layout mapping where the strides are user-defined.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn layout_stride.hh:19\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bt_\bd_\b:_\b:_\bl_\ba_\by_\bo_\bu_\bt_\b__\bs_\bt_\br_\bi_\bd_\be_\b:_\b:_\bm_\ba_\bp_\bp_\bi_\bn_\bg_\b:_\b:_\be_\bx_\bt_\be_\bn_\bt_\bs\n-constexpr const extents_type & extents() const noexcept\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn layout_stride.hh:85\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bt_\bd_\b:_\b:_\bl_\ba_\by_\bo_\bu_\bt_\b__\bs_\bt_\br_\bi_\bd_\be_\b:_\b:_\bm_\ba_\bp_\bp_\bi_\bn_\bg_\b:_\b:_\bs_\bt_\br_\bi_\bd_\be_\bs\n-constexpr const strides_type & strides() const noexcept\n-Get the array of all strides.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn layout_stride.hh:127\n+118 template \n+119 class IntegralRangeIterator\n+120 {\n+121 public:\n+122 typedef std::random_access_iterator_tag iterator_category;\n+123 typedef T value_type;\n+124 typedef std::make_signed_t difference_type;\n+125 typedef const T *pointer;\n+126 typedef T reference;\n+127\n+128 constexpr IntegralRangeIterator() noexcept : value_(0) {}\n+129 constexpr explicit IntegralRangeIterator(value_type value) noexcept :\n+value_(value) {}\n+130\n+131 pointer operator->() const noexcept { return &value_; }\n+132 constexpr reference _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b*() const noexcept { return value_; }\n+133\n+134 constexpr reference operator[]( difference_type n ) const noexcept { return\n+(value_ + n); }\n+135\n+136 constexpr bool _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b=_\b=(const IntegralRangeIterator & other) const\n+noexcept { return (value_ == other.value_); }\n+137 constexpr bool _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b!_\b=(const IntegralRangeIterator & other) const\n+noexcept { return (value_ != other.value_); }\n+138\n+139 constexpr bool _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b<(const IntegralRangeIterator & other) const\n+noexcept { return (value_ <= other.value_); }\n+140 constexpr bool _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b<_\b=(const IntegralRangeIterator & other) const\n+noexcept { return (value_ <= other.value_); }\n+141 constexpr bool _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b>(const IntegralRangeIterator & other) const\n+noexcept { return (value_ >= other.value_); }\n+142 constexpr bool _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b>_\b=(const IntegralRangeIterator & other) const\n+noexcept { return (value_ >= other.value_); }\n+143\n+144 IntegralRangeIterator& operator++() noexcept { ++value_; return *this; }\n+145 IntegralRangeIterator operator++(int) noexcept { IntegralRangeIterator copy\n+( *this ); ++(*this); return copy; }\n+146\n+147 IntegralRangeIterator& operator--() noexcept { --value_; return *this; }\n+148 IntegralRangeIterator operator--(int) noexcept { IntegralRangeIterator copy\n+( *this ); --(*this); return copy; }\n+149\n+150 IntegralRangeIterator& operator+=(difference_type n) noexcept { value_ +=\n+n; return *this; }\n+151 IntegralRangeIterator& operator-=(difference_type n) noexcept { value_ -\n+= n; return *this; }\n+152\n+153 friend constexpr IntegralRangeIterator _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b+(const\n+IntegralRangeIterator &a, difference_type n) noexcept { return\n+IntegralRangeIterator(a.value_ + n); }\n+154 friend constexpr IntegralRangeIterator _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b+(difference_type n, const\n+IntegralRangeIterator &a) noexcept { return IntegralRangeIterator(a.value_ +\n+n); }\n+155 friend constexpr IntegralRangeIterator _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b-(const\n+IntegralRangeIterator &a, difference_type n) noexcept { return\n+IntegralRangeIterator(a.value_ - n); }\n+156\n+157 constexpr difference_type _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b-(const IntegralRangeIterator &other)\n+const noexcept { return (static_cast(value_) -\n+static_cast(other.value_)); }\n+158\n+159 private:\n+160 value_type value_;\n+161 };\n+162\n+163 } // namespace Impl\n+164\n+165\n+166\n+175 template \n+_\b1_\b7_\b6 class _\bI_\bn_\bt_\be_\bg_\br_\ba_\bl_\bR_\ba_\bn_\bg_\be\n+177 {\n+178 public:\n+_\b1_\b8_\b0 typedef T _\bv_\ba_\bl_\bu_\be_\b__\bt_\by_\bp_\be;\n+_\b1_\b8_\b2 typedef Impl::IntegralRangeIterator _\bi_\bt_\be_\br_\ba_\bt_\bo_\br;\n+_\b1_\b8_\b4 typedef std::make_unsigned_t _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be;\n+185\n+_\b1_\b8_\b7 constexpr _\bI_\bn_\bt_\be_\bg_\br_\ba_\bl_\bR_\ba_\bn_\bg_\be(_\bv_\ba_\bl_\bu_\be_\b__\bt_\by_\bp_\be from, _\bv_\ba_\bl_\bu_\be_\b__\bt_\by_\bp_\be to) noexcept : from_\n+(from), to_(to) {}\n+_\b1_\b8_\b9 constexpr explicit _\bI_\bn_\bt_\be_\bg_\br_\ba_\bl_\bR_\ba_\bn_\bg_\be(_\bv_\ba_\bl_\bu_\be_\b__\bt_\by_\bp_\be to) noexcept : from_(0), to_\n+(to) {}\n+_\b1_\b9_\b1 constexpr _\bI_\bn_\bt_\be_\bg_\br_\ba_\bl_\bR_\ba_\bn_\bg_\be(std::pair _\br_\ba_\bn_\bg_\be) noexcept :\n+from_(_\br_\ba_\bn_\bg_\be.first), to_(_\br_\ba_\bn_\bg_\be.second) {}\n+192\n+_\b1_\b9_\b4 constexpr _\bi_\bt_\be_\br_\ba_\bt_\bo_\br _\bb_\be_\bg_\bi_\bn() const noexcept { return _\bi_\bt_\be_\br_\ba_\bt_\bo_\br(from_); }\n+_\b1_\b9_\b6 constexpr _\bi_\bt_\be_\br_\ba_\bt_\bo_\br _\be_\bn_\bd() const noexcept { return _\bi_\bt_\be_\br_\ba_\bt_\bo_\br(to_); }\n+197\n+_\b1_\b9_\b9 constexpr _\bv_\ba_\bl_\bu_\be_\b__\bt_\by_\bp_\be _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b[_\b](const _\bv_\ba_\bl_\bu_\be_\b__\bt_\by_\bp_\be &i) const noexcept\n+{ return (from_ + i); }\n+200\n+_\b2_\b0_\b2 constexpr bool _\be_\bm_\bp_\bt_\by() const noexcept { return (from_ == to_); }\n+_\b2_\b0_\b4 constexpr _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be _\bs_\bi_\bz_\be() const noexcept { return (static_cast<_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be>\n+(to_) - static_cast<_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be>(from_)); }\n+205\n+_\b2_\b0_\b7 constexpr bool _\bc_\bo_\bn_\bt_\ba_\bi_\bn_\bs(_\bv_\ba_\bl_\bu_\be_\b__\bt_\by_\bp_\be index) const noexcept { return from_ <=\n+index && index < to_; }\n+208\n+209 private:\n+210 _\bv_\ba_\bl_\bu_\be_\b__\bt_\by_\bp_\be from_, to_;\n+211 };\n+212\n+213\n+228 template \n+_\b2_\b2_\b9 class _\bS_\bt_\ba_\bt_\bi_\bc_\bI_\bn_\bt_\be_\bg_\br_\ba_\bl_\bR_\ba_\bn_\bg_\be\n+230 {\n+231 template \n+232 static std::integer_sequence shift_integer_sequence(std::\n+integer_sequence);\n+233\n+234 public:\n+_\b2_\b3_\b6 typedef T _\bv_\ba_\bl_\bu_\be_\b__\bt_\by_\bp_\be;\n+_\b2_\b3_\b8 typedef Impl::IntegralRangeIterator _\bi_\bt_\be_\br_\ba_\bt_\bo_\br;\n+_\b2_\b4_\b0 typedef std::make_unsigned_t _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be;\n+241\n+_\b2_\b4_\b3 typedef decltype(shift_integer_sequence(std::make_integer_sequence())) _\bi_\bn_\bt_\be_\bg_\be_\br_\b__\bs_\be_\bq_\bu_\be_\bn_\bc_\be;\n+244\n+_\b2_\b4_\b6 constexpr _\bS_\bt_\ba_\bt_\bi_\bc_\bI_\bn_\bt_\be_\bg_\br_\ba_\bl_\bR_\ba_\bn_\bg_\be() noexcept = default;\n+247\n+_\b2_\b4_\b9 constexpr operator _\bI_\bn_\bt_\be_\bg_\br_\ba_\bl_\bR_\ba_\bn_\bg_\be() const noexcept { return {from, to}; }\n+_\b2_\b5_\b1 constexpr operator _\bi_\bn_\bt_\be_\bg_\be_\br_\b__\bs_\be_\bq_\bu_\be_\bn_\bc_\be() const noexcept { return {}; }\n+252\n+_\b2_\b5_\b4 static constexpr _\bi_\bn_\bt_\be_\bg_\be_\br_\b__\bs_\be_\bq_\bu_\be_\bn_\bc_\be _\bt_\bo_\b__\bi_\bn_\bt_\be_\bg_\be_\br_\b__\bs_\be_\bq_\bu_\be_\bn_\bc_\be() noexcept { return\n+{}; }\n+255\n+_\b2_\b5_\b7 static constexpr _\bi_\bt_\be_\br_\ba_\bt_\bo_\br _\bb_\be_\bg_\bi_\bn() noexcept { return _\bi_\bt_\be_\br_\ba_\bt_\bo_\br(from); }\n+_\b2_\b5_\b9 static constexpr _\bi_\bt_\be_\br_\ba_\bt_\bo_\br _\be_\bn_\bd() noexcept { return _\bi_\bt_\be_\br_\ba_\bt_\bo_\br(to); }\n+260\n+262 template \n+_\b2_\b6_\b3 constexpr auto _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b[_\b](const std::integral_constant &) const\n+noexcept\n+264 -> std::integral_constant(i)>\n+265 {\n+266 return {};\n+267 }\n+268\n+_\b2_\b7_\b0 constexpr _\bv_\ba_\bl_\bu_\be_\b__\bt_\by_\bp_\be _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b[_\b](const _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be &i) const noexcept { return\n+(from + static_cast<_\bv_\ba_\bl_\bu_\be_\b__\bt_\by_\bp_\be>(i)); }\n+271\n+_\b2_\b7_\b3 static constexpr std::integral_constant _\be_\bm_\bp_\bt_\by() noexcept\n+{ return {}; }\n+_\b2_\b7_\b5 static constexpr std::integral_constant\n+(to) - static_cast<_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be>(from) > _\bs_\bi_\bz_\be() noexcept { return {}; }\n+276\n+_\b2_\b7_\b8 static constexpr bool _\bc_\bo_\bn_\bt_\ba_\bi_\bn_\bs(_\bv_\ba_\bl_\bu_\be_\b__\bt_\by_\bp_\be index) noexcept { return from <=\n+index && index < to; }\n+279\n+280 };\n+281\n+291 template, std::decay_t>::value,\n+int> = 0,\n+293 std::enable_if_t>::value, int> = 0>\n+_\b2_\b9_\b4 inline static _\bI_\bn_\bt_\be_\bg_\br_\ba_\bl_\bR_\ba_\bn_\bg_\be_\b<_\bs_\bt_\bd_\b:_\b:_\bd_\be_\bc_\ba_\by_\b__\bt_\b<_\bT_\b>> _\br_\ba_\bn_\bg_\be(T &&from, U &&to)\n+noexcept\n+295 {\n+296 return _\bI_\bn_\bt_\be_\bg_\br_\ba_\bl_\bR_\ba_\bn_\bg_\be_\b<_\bs_\bt_\bd_\b:_\b:_\bd_\be_\bc_\ba_\by_\b__\bt_\b<_\bT_\b>>(std::forward(from), std::\n+forward(to));\n+297 }\n+298\n+299 template>::\n+value, int> = 0>\n+_\b3_\b0_\b0 inline static _\bI_\bn_\bt_\be_\bg_\br_\ba_\bl_\bR_\ba_\bn_\bg_\be_\b<_\bs_\bt_\bd_\b:_\b:_\bd_\be_\bc_\ba_\by_\b__\bt_\b<_\bT_\b>> _\br_\ba_\bn_\bg_\be(T &&to) noexcept\n+301 {\n+302 return _\bI_\bn_\bt_\be_\bg_\br_\ba_\bl_\bR_\ba_\bn_\bg_\be_\b<_\bs_\bt_\bd_\b:_\b:_\bd_\be_\bc_\ba_\by_\b__\bt_\b<_\bT_\b>>(std::forward(to));\n+303 }\n+304\n+305 template>::value,\n+int> = 0>\n+_\b3_\b0_\b6 inline static _\bI_\bn_\bt_\be_\bg_\br_\ba_\bl_\bR_\ba_\bn_\bg_\be_\b<_\bs_\bt_\bd_\b:_\b:_\bu_\bn_\bd_\be_\br_\bl_\by_\bi_\bn_\bg_\b__\bt_\by_\bp_\be_\b__\bt_\b<_\bs_\bt_\bd_\b:_\b:_\bd_\be_\bc_\ba_\by_\b__\bt_\b<_\bT_\b>>> _\br_\ba_\bn_\bg_\be\n+(T &&to) noexcept\n+307 {\n+308 return _\bI_\bn_\bt_\be_\bg_\br_\ba_\bl_\bR_\ba_\bn_\bg_\be_\b<_\bs_\bt_\bd_\b:_\b:_\bu_\bn_\bd_\be_\br_\bl_\by_\bi_\bn_\bg_\b__\bt_\by_\bp_\be_\b__\bt_\b<_\bs_\bt_\bd_\b:_\b:_\bd_\be_\bc_\ba_\by_\b__\bt_\b<_\bT_\b>>>(std::\n+forward(to));\n+309 }\n+310\n+311 template\n+_\b3_\b1_\b2 inline static _\bS_\bt_\ba_\bt_\bi_\bc_\bI_\bn_\bt_\be_\bg_\br_\ba_\bl_\bR_\ba_\bn_\bg_\be_\b<_\bT_\b,_\b _\bt_\bo_\b,_\b _\bf_\br_\bo_\bm_\b> _\br_\ba_\bn_\bg_\be(std::\n+integral_constant, std::integral_constant) noexcept\n+313 {\n+314 return {};\n+315 }\n+316\n+317 template\n+_\b3_\b1_\b8 inline static _\bS_\bt_\ba_\bt_\bi_\bc_\bI_\bn_\bt_\be_\bg_\br_\ba_\bl_\bR_\ba_\bn_\bg_\be_\b<_\bT_\b,_\b _\bt_\bo_\b> _\br_\ba_\bn_\bg_\be(std::integral_constant) noexcept\n+319 {\n+320 return {};\n+321 }\n+322\n+323\n+324\n+_\b3_\b2_\b8 struct _\bV_\ba_\bl_\bu_\be_\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\bT_\ba_\bg {};\n+329\n+_\b3_\b3_\b3 struct _\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\bT_\ba_\bg {};\n+334\n+335 namespace Impl\n+336 {\n+337\n+338\n+339\n+340 // An iterator transforming a wrapped iterator using\n+341 // an unary function. It inherits the iterator-category\n+342 // of the underlying iterator.\n+343 //\n+344 // \\tparam I Type of the underlying iterator\n+345 // \\tparam F Type of transformation function that can either be applied\n+directly or after dereferencing\n+346 // \\tparam TT Type of transformation (ValueTransformationTag or\n+IteratorTransformationTag)\n+347 // \\tparam C An iterator category tag, defaults to the one of I\n+348 template ::iterator_category>\n+349 class TransformedRangeIterator;\n+350\n+351 template\n+352 struct TransformationRangeIteratorTraits\n+353 {\n+354 template\n+355 static decltype(auto) transform(FF&& f, const I& it) {\n+356 if constexpr (std::is_same_v)\n+357 {\n+358 if constexpr (_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bs_\bC_\ba_\bl_\bl_\ba_\bb_\bl_\be::value)\n+359 return f(it);\n+360 else\n+361 return (*f)(it);\n+362 }\n+363 else\n+364 {\n+365 if constexpr (_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bs_\bC_\ba_\bl_\bl_\ba_\bb_\bl_\be::value)\n+366 return f(*it);\n+367 else\n+368 return (*f)(*it);\n+369 }\n+370 }\n+371\n+372 using reference = decltype(transform(std::declval(), std::declval\n+()));\n+373 using value_type = _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bu_\bt_\bo_\bn_\bo_\bm_\bo_\bu_\bs_\bV_\ba_\bl_\bu_\be_\b<_\br_\be_\bf_\be_\br_\be_\bn_\bc_\be_\b>;\n+374 using pointer = std::conditional_t,\n+value_type*, ProxyArrowResult>;\n+375 using difference_type = typename std::iterator_traits::difference_type;\n+376 using Facade = _\bD_\bu_\bn_\be_\b:_\b:_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bF_\ba_\bc_\ba_\bd_\be_\b<_\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\be_\bd_\bR_\ba_\bn_\bg_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b<_\bI_\b,_\bF_\b,_\bT_\bT_\b,_\bC_\b>, C,\n+value_type, reference, pointer, difference_type>;\n+377 };\n+378\n+379\n+380 template \n+381 class TransformedRangeIterator :\n+382 public TransformationRangeIteratorTraits::Facade\n+383 {\n+384 using Traits = TransformationRangeIteratorTraits;\n+385 using Facade = typename Traits::Facade;\n+386\n+387 static constexpr bool isBidirectional = std::is_convertible_v;\n+388 static constexpr bool isRandomAccess = std::is_convertible_v;\n+389\n+390 public:\n+391\n+392 using Function = F;\n+393 using reference = typename Facade::reference;\n+394 using difference_type = typename Facade::difference_type;\n+395\n+396 template\n+397 constexpr TransformedRangeIterator(II&& it, FF&& f) noexcept :\n+398 it_(std::forward(it)),\n+399 f_(std::forward(f))\n+400 {}\n+401\n+402 template =0,\n+404 std::enable_if_t and std::\n+is_default_constructible_v, int> =0>\n+405 constexpr TransformedRangeIterator(II&& it) noexcept :\n+406 it_(std::forward(it)),\n+407 f_()\n+408 {}\n+409\n+410 template =0,\n+412 std::enable_if_t and std::\n+is_default_constructible_v, int> =0>\n+413 constexpr TransformedRangeIterator(FF&& f) noexcept :\n+414 it_(),\n+415 f_(std::forward(f))\n+416 {}\n+417\n+418 // Explicitly initialize members. Using a plain\n+419 //\n+420 // constexpr TransformedRangeIterator() noexcept {}\n+421 //\n+422 // would default-initialize the members while\n+423 //\n+424 // constexpr TransformedRangeIterator() noexcept : it_(), f_() {}\n+425 //\n+426 // leads to value-initialization. This is a case where\n+427 // both are really different. If it_ is a raw pointer (i.e. POD)\n+428 // then default-initialization leaves it uninitialized while\n+429 // value-initialization zero-initializes it.\n+430 constexpr TransformedRangeIterator() noexcept :\n+431 it_(),\n+432 f_()\n+433 {}\n+434\n+435 // Dereferencing returns a value created by the function\n+436 constexpr reference _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b*() const noexcept {\n+437 return Traits::transform(f_, it_);\n+438 }\n+439\n+440 protected:\n+441\n+442 friend _\bD_\bu_\bn_\be_\b:_\b:_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bF_\ba_\bc_\ba_\bd_\be_\bA_\bc_\bc_\be_\bs_\bs;\n+443\n+444 // Export base iterator, such that equalilty comparison,\n+445 // differences, and inequality comparisons are automatically\n+446 // forwarded to the base iterator by the facade.\n+447 const I& baseIterator() const noexcept {\n+448 return it_;\n+449 }\n+450\n+451 I& baseIterator() noexcept {\n+452 return it_;\n+453 }\n+454\n+455 I it_;\n+456 Function f_;\n+457 };\n+458\n+459 } // namespace Impl\n+460\n+461\n+462\n+499 template \n+_\b5_\b0_\b0 class _\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\be_\bd_\bR_\ba_\bn_\bg_\be_\bV_\bi_\be_\bw\n+501 {\n+502 using RawConstIterator = std::decay_t\n+()._\bb_\be_\bg_\bi_\bn())>;\n+503 using RawIterator = std::decay_t().begin())>;\n+504\n+505 public:\n+506\n+_\b5_\b1_\b3 using _\bc_\bo_\bn_\bs_\bt_\b__\bi_\bt_\be_\br_\ba_\bt_\bo_\br = Impl::TransformedRangeIterator;\n+514\n+_\b5_\b2_\b1 using _\bi_\bt_\be_\br_\ba_\bt_\bo_\br = Impl::TransformedRangeIterator;\n+522\n+_\b5_\b2_\b9 using _\bR_\ba_\bw_\bR_\ba_\bn_\bg_\be = std::remove_reference_t;\n+530\n+534 template\n+_\b5_\b3_\b5 constexpr _\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\be_\bd_\bR_\ba_\bn_\bg_\be_\bV_\bi_\be_\bw(RR&& _\br_\ba_\bw_\bR_\ba_\bn_\bg_\be, FF&& f) noexcept :\n+536 rawRange_(std::forward(_\br_\ba_\bw_\bR_\ba_\bn_\bg_\be)),\n+537 f_(std::forward(f))\n+538 {\n+539 static_assert(std::is_same_v or std::\n+is_same_v,\n+540 \"The TransformationType passed to TransformedRangeView has to be either\n+ValueTransformationTag or IteratorTransformationTag.\");\n+541 }\n+542\n+_\b5_\b5_\b1 constexpr _\bc_\bo_\bn_\bs_\bt_\b__\bi_\bt_\be_\br_\ba_\bt_\bo_\br _\bb_\be_\bg_\bi_\bn() const noexcept {\n+552 return _\bc_\bo_\bn_\bs_\bt_\b__\bi_\bt_\be_\br_\ba_\bt_\bo_\br(rawRange_.begin(), &f_);\n+553 }\n+554\n+_\b5_\b5_\b5 constexpr _\bi_\bt_\be_\br_\ba_\bt_\bo_\br _\bb_\be_\bg_\bi_\bn() noexcept {\n+556 return _\bi_\bt_\be_\br_\ba_\bt_\bo_\br(rawRange_.begin(), &f_);\n+557 }\n+558\n+_\b5_\b6_\b7 constexpr _\bc_\bo_\bn_\bs_\bt_\b__\bi_\bt_\be_\br_\ba_\bt_\bo_\br _\be_\bn_\bd() const noexcept {\n+568 return _\bc_\bo_\bn_\bs_\bt_\b__\bi_\bt_\be_\br_\ba_\bt_\bo_\br(rawRange_.end(), &f_);\n+569 }\n+570\n+_\b5_\b7_\b1 constexpr _\bi_\bt_\be_\br_\ba_\bt_\bo_\br _\be_\bn_\bd() noexcept {\n+572 return _\bi_\bt_\be_\br_\ba_\bt_\bo_\br(rawRange_.end(), &f_);\n+573 }\n+574\n+578 template, int> = 0>\n+_\b5_\b8_\b0 constexpr decltype(auto) operator[](std::size_t i) const noexcept\n+581 {\n+582 return this->_\bb_\be_\bg_\bi_\bn()[i];\n+583 }\n+584\n+588 template, int> = 0>\n+_\b5_\b9_\b0 constexpr decltype(auto) operator[](std::size_t i) noexcept\n+591 {\n+592 return this->_\bb_\be_\bg_\bi_\bn()[i];\n+593 }\n+594\n+605 template().size())>>\n+_\b6_\b0_\b7 auto _\bs_\bi_\bz_\be() const noexcept\n+608 {\n+609 return rawRange_.size();\n+610 }\n+611\n+_\b6_\b1_\b5 constexpr bool _\be_\bm_\bp_\bt_\by() const noexcept\n+616 {\n+617 return rawRange_.begin() == rawRange_.end();\n+618 }\n+619\n+_\b6_\b2_\b3 const _\bR_\ba_\bw_\bR_\ba_\bn_\bg_\be& _\br_\ba_\bw_\bR_\ba_\bn_\bg_\be() const noexcept\n+624 {\n+625 return rawRange_;\n+626 }\n+627\n+_\b6_\b3_\b1 _\bR_\ba_\bw_\bR_\ba_\bn_\bg_\be& _\br_\ba_\bw_\bR_\ba_\bn_\bg_\be() noexcept\n+632 {\n+633 return rawRange_;\n+634 }\n+635\n+636 private:\n+637 R rawRange_;\n+638 F f_;\n+639 };\n+640\n+669 template \n+_\b6_\b7_\b0 auto _\bt_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\be_\bd_\bR_\ba_\bn_\bg_\be_\bV_\bi_\be_\bw(R&& _\br_\ba_\bn_\bg_\be, F&& f)\n+671 {\n+672 return _\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\be_\bd_\bR_\ba_\bn_\bg_\be_\bV_\bi_\be_\bw_\b<_\bR_\b,_\b _\bs_\bt_\bd_\b:_\b:_\bd_\be_\bc_\ba_\by_\b__\bt_\b<_\bF_\b>, _\bV_\ba_\bl_\bu_\be_\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\bT_\ba_\bg>\n+(std::forward(_\br_\ba_\bn_\bg_\be), std::forward(f));\n+673 }\n+674\n+702 template \n+_\b7_\b0_\b3 auto _\bi_\bt_\be_\br_\ba_\bt_\bo_\br_\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\be_\bd_\bR_\ba_\bn_\bg_\be_\bV_\bi_\be_\bw(R&& _\br_\ba_\bn_\bg_\be, F&& f)\n+704 {\n+705 return _\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\be_\bd_\bR_\ba_\bn_\bg_\be_\bV_\bi_\be_\bw_\b<_\bR_\b,_\b _\bs_\bt_\bd_\b:_\b:_\bd_\be_\bc_\ba_\by_\b__\bt_\b<_\bF_\b>, _\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\bT_\ba_\bg>\n+(std::forward(_\br_\ba_\bn_\bg_\be), std::forward(f));\n+706 }\n+707\n+708\n+721 template\n+_\b7_\b2_\b2 auto _\bs_\bp_\ba_\br_\bs_\be_\bR_\ba_\bn_\bg_\be(Range&& _\br_\ba_\bn_\bg_\be) {\n+723 return _\bD_\bu_\bn_\be_\b:_\b:_\bi_\bt_\be_\br_\ba_\bt_\bo_\br_\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\be_\bd_\bR_\ba_\bn_\bg_\be_\bV_\bi_\be_\bw(std::forward(_\br_\ba_\bn_\bg_\be), []\n+(auto&& it) {\n+724 return std::tuple(*it, it.index());\n+725 });\n+726 }\n+727\n+732}\n+733\n+734#endif // DUNE_COMMON_RANGE_UTILITIES_HH\n+_\bt_\by_\bp_\be_\bt_\br_\ba_\bi_\bt_\bs_\b._\bh_\bh\n+Traits for type conversions and type information.\n+_\bi_\bt_\be_\br_\ba_\bt_\bo_\br_\bf_\ba_\bc_\ba_\bd_\be_\bs_\b._\bh_\bh\n+This file implements iterator facade classes for writing stl conformant\n+iterators.\n+_\bD_\bu_\bn_\be_\b:_\b:_\bi_\bt_\be_\br_\ba_\bt_\bo_\br_\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\be_\bd_\bR_\ba_\bn_\bg_\be_\bV_\bi_\be_\bw\n+auto iteratorTransformedRangeView(R &&range, F &&f)\n+Create a TransformedRangeView using an iterator transformation.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn rangeutilities.hh:703\n+_\bD_\bu_\bn_\be_\b:_\b:_\bt_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\be_\bd_\bR_\ba_\bn_\bg_\be_\bV_\bi_\be_\bw\n+auto transformedRangeView(R &&range, F &&f)\n+Create a TransformedRangeView.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn rangeutilities.hh:670\n+_\bD_\bu_\bn_\be_\b:_\b:_\bs_\bp_\ba_\br_\bs_\be_\bR_\ba_\bn_\bg_\be\n+auto sparseRange(Range &&range)\n+Allow structured-binding for-loops for sparse iterators.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn rangeutilities.hh:722\n+_\bD_\bu_\bn_\be_\b:_\b:_\br_\ba_\bn_\bg_\be\n+static StaticIntegralRange< T, to, from > range(std::integral_constant< T, from\n+>, std::integral_constant< T, to >) noexcept\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn rangeutilities.hh:312\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bu_\bt_\bo_\bn_\bo_\bm_\bo_\bu_\bs_\bV_\ba_\bl_\bu_\be\n+typename AutonomousValueType< T >::type AutonomousValue\n+Type free of internal references that T can be converted to.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn typetraits.hh:588\n+_\bD_\bu_\bn_\be_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b*\n+bigunsignedint< k > operator*(const bigunsignedint< k > &x, std::uintmax_t y)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bigunsignedint.hh:549\n+_\bD_\bu_\bn_\be_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b-\n+bigunsignedint< k > operator-(const bigunsignedint< k > &x, std::uintmax_t y)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bigunsignedint.hh:542\n+_\bD_\bu_\bn_\be_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b+\n+bigunsignedint< k > operator+(const bigunsignedint< k > &x, std::uintmax_t y)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bigunsignedint.hh:535\n+_\bD_\bu_\bn_\be_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b<\n+EnableIfInterOperable< T1, T2, bool >::type operator<(const\n+RandomAccessIteratorFacade< T1, V1, R1, D > &lhs, const\n+RandomAccessIteratorFacade< T2, V2, R2, D > &rhs)\n+Comparison operator.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn iteratorfacades.hh:638\n+_\bD_\bu_\bn_\be_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b>\n+EnableIfInterOperable< T1, T2, bool >::type operator>(const\n+RandomAccessIteratorFacade< T1, V1, R1, D > &lhs, const\n+RandomAccessIteratorFacade< T2, V2, R2, D > &rhs)\n+Comparison operator.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn iteratorfacades.hh:684\n+_\bD_\bu_\bn_\be_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b<_\b=\n+EnableIfInterOperable< T1, T2, bool >::type operator<=(const\n+RandomAccessIteratorFacade< T1, V1, R1, D > &lhs, const\n+RandomAccessIteratorFacade< T2, V2, R2, D > &rhs)\n+Comparison operator.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn iteratorfacades.hh:661\n+_\bD_\bu_\bn_\be_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b=_\b=\n+EnableIfInterOperable< T1, T2, bool >::type operator==(const\n+ForwardIteratorFacade< T1, V1, R1, D > &lhs, const ForwardIteratorFacade< T2,\n+V2, R2, D > &rhs)\n+Checks for equality.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn iteratorfacades.hh:238\n+_\bD_\bu_\bn_\be_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b>_\b=\n+EnableIfInterOperable< T1, T2, bool >::type operator>=(const\n+RandomAccessIteratorFacade< T1, V1, R1, D > &lhs, const\n+RandomAccessIteratorFacade< T2, V2, R2, D > &rhs)\n+Comparison operator.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn iteratorfacades.hh:706\n+_\bD_\bu_\bn_\be_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b!_\b=\n+EnableIfInterOperable< T1, T2, bool >::type operator!=(const\n+ForwardIteratorFacade< T1, V1, R1, D > &lhs, const ForwardIteratorFacade< T2,\n+V2, R2, D > &rhs)\n+Checks for inequality.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn iteratorfacades.hh:260\n+_\bD_\bu_\bn_\be\n+Dune namespace.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn alignedallocator.hh:13\n+_\bD_\bu_\bn_\be_\b:_\b:_\ba_\bn_\by_\b__\bt_\br_\bu_\be\n+bool any_true(const AlignedNumber< bool, align > &val)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn debugalign.hh:506\n+_\bD_\bu_\bn_\be_\b:_\b:_\ba_\bl_\bl_\b__\bt_\br_\bu_\be\n+bool all_true(const AlignedNumber< bool, align > &val)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn debugalign.hh:512\n+_\bD_\bu_\bn_\be_\b:_\b:_\bm_\ba_\bx_\b__\bv_\ba_\bl_\bu_\be\n+T max_value(const AlignedNumber< T, align > &val)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn debugalign.hh:494\n+_\bD_\bu_\bn_\be_\b:_\b:_\bm_\bi_\bn_\b__\bv_\ba_\bl_\bu_\be\n+T min_value(const AlignedNumber< T, align > &val)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn debugalign.hh:500\n+_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bF_\ba_\bc_\ba_\bd_\be_\bA_\bc_\bc_\be_\bs_\bs\n+This class encapsulates access of IteratorFacade.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn iteratorfacades.hh:786\n+_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bF_\ba_\bc_\ba_\bd_\be\n+CRTP-Mixing class for stl conformant iterators of given iterator category.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn iteratorfacades.hh:1053\n+_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bF_\ba_\bc_\ba_\bd_\be_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b*\n+constexpr decltype(auto) operator*() const\n+Dereferencing operator.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn iteratorfacades.hh:1119\n+_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bt_\be_\bg_\br_\ba_\bl_\bR_\ba_\bn_\bg_\be\n+dynamic integer range for use in range-based for loops\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn rangeutilities.hh:177\n+_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bt_\be_\bg_\br_\ba_\bl_\bR_\ba_\bn_\bg_\be_\b:_\b:_\bb_\be_\bg_\bi_\bn\n+constexpr iterator begin() const noexcept\n+obtain a random-access iterator to the first element\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn rangeutilities.hh:194\n+_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bt_\be_\bg_\br_\ba_\bl_\bR_\ba_\bn_\bg_\be_\b:_\b:_\be_\bn_\bd\n+constexpr iterator end() const noexcept\n+obtain a random-access iterator past the last element\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn rangeutilities.hh:196\n+_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bt_\be_\bg_\br_\ba_\bl_\bR_\ba_\bn_\bg_\be_\b:_\b:_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be\n+std::make_unsigned_t< T > size_type\n+unsigned integer type corresponding to value_type\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn rangeutilities.hh:184\n+_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bt_\be_\bg_\br_\ba_\bl_\bR_\ba_\bn_\bg_\be_\b:_\b:_\bi_\bt_\be_\br_\ba_\bt_\bo_\br\n+Impl::IntegralRangeIterator< T > iterator\n+type of iterator\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn rangeutilities.hh:182\n+_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bt_\be_\bg_\br_\ba_\bl_\bR_\ba_\bn_\bg_\be_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b[_\b]\n+constexpr value_type operator[](const value_type &i) const noexcept\n+access specified element\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn rangeutilities.hh:199\n+_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bt_\be_\bg_\br_\ba_\bl_\bR_\ba_\bn_\bg_\be_\b:_\b:_\bc_\bo_\bn_\bt_\ba_\bi_\bn_\bs\n+constexpr bool contains(value_type index) const noexcept\n+check whether given index is within range [from, to)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn rangeutilities.hh:207\n+_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bt_\be_\bg_\br_\ba_\bl_\bR_\ba_\bn_\bg_\be_\b:_\b:_\be_\bm_\bp_\bt_\by\n+constexpr bool empty() const noexcept\n+check whether the range is empty\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn rangeutilities.hh:202\n+_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bt_\be_\bg_\br_\ba_\bl_\bR_\ba_\bn_\bg_\be_\b:_\b:_\bI_\bn_\bt_\be_\bg_\br_\ba_\bl_\bR_\ba_\bn_\bg_\be\n+constexpr IntegralRange(std::pair< value_type, value_type > range) noexcept\n+construct integer range std::pair\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn rangeutilities.hh:191\n+_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bt_\be_\bg_\br_\ba_\bl_\bR_\ba_\bn_\bg_\be_\b:_\b:_\bI_\bn_\bt_\be_\bg_\br_\ba_\bl_\bR_\ba_\bn_\bg_\be\n+constexpr IntegralRange(value_type from, value_type to) noexcept\n+construct integer range [from, to)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn rangeutilities.hh:187\n+_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bt_\be_\bg_\br_\ba_\bl_\bR_\ba_\bn_\bg_\be_\b:_\b:_\bs_\bi_\bz_\be\n+constexpr size_type size() const noexcept\n+obtain number of elements in the range\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn rangeutilities.hh:204\n+_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bt_\be_\bg_\br_\ba_\bl_\bR_\ba_\bn_\bg_\be_\b:_\b:_\bI_\bn_\bt_\be_\bg_\br_\ba_\bl_\bR_\ba_\bn_\bg_\be\n+constexpr IntegralRange(value_type to) noexcept\n+construct integer range [0, to)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn rangeutilities.hh:189\n+_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bt_\be_\bg_\br_\ba_\bl_\bR_\ba_\bn_\bg_\be_\b:_\b:_\bv_\ba_\bl_\bu_\be_\b__\bt_\by_\bp_\be\n+T value_type\n+type of integers contained in the range\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn rangeutilities.hh:180\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bt_\ba_\bt_\bi_\bc_\bI_\bn_\bt_\be_\bg_\br_\ba_\bl_\bR_\ba_\bn_\bg_\be\n+static integer range for use in range-based for loops\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn rangeutilities.hh:230\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bt_\ba_\bt_\bi_\bc_\bI_\bn_\bt_\be_\bg_\br_\ba_\bl_\bR_\ba_\bn_\bg_\be_\b:_\b:_\be_\bn_\bd\n+static constexpr iterator end() noexcept\n+obtain a random-access iterator past the last element\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn rangeutilities.hh:259\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bt_\ba_\bt_\bi_\bc_\bI_\bn_\bt_\be_\bg_\br_\ba_\bl_\bR_\ba_\bn_\bg_\be_\b:_\b:_\bi_\bn_\bt_\be_\bg_\be_\br_\b__\bs_\be_\bq_\bu_\be_\bn_\bc_\be\n+decltype(shift_integer_sequence< from >(std::make_integer_sequence< T, to-from\n+>())) integer_sequence\n+type of corresponding std::integer_sequence\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn rangeutilities.hh:243\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bt_\ba_\bt_\bi_\bc_\bI_\bn_\bt_\be_\bg_\br_\ba_\bl_\bR_\ba_\bn_\bg_\be_\b:_\b:_\bc_\bo_\bn_\bt_\ba_\bi_\bn_\bs\n+static constexpr bool contains(value_type index) noexcept\n+check whether given index is within range [from, to)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn rangeutilities.hh:278\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bt_\ba_\bt_\bi_\bc_\bI_\bn_\bt_\be_\bg_\br_\ba_\bl_\bR_\ba_\bn_\bg_\be_\b:_\b:_\bS_\bt_\ba_\bt_\bi_\bc_\bI_\bn_\bt_\be_\bg_\br_\ba_\bl_\bR_\ba_\bn_\bg_\be\n+constexpr StaticIntegralRange() noexcept=default\n+default constructor\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bt_\ba_\bt_\bi_\bc_\bI_\bn_\bt_\be_\bg_\br_\ba_\bl_\bR_\ba_\bn_\bg_\be_\b:_\b:_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be\n+std::make_unsigned_t< T > size_type\n+unsigned integer type corresponding to value_type\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn rangeutilities.hh:240\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bt_\ba_\bt_\bi_\bc_\bI_\bn_\bt_\be_\bg_\br_\ba_\bl_\bR_\ba_\bn_\bg_\be_\b:_\b:_\bv_\ba_\bl_\bu_\be_\b__\bt_\by_\bp_\be\n+T value_type\n+type of integers contained in the range\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn rangeutilities.hh:236\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bt_\ba_\bt_\bi_\bc_\bI_\bn_\bt_\be_\bg_\br_\ba_\bl_\bR_\ba_\bn_\bg_\be_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b[_\b]\n+constexpr auto operator[](const std::integral_constant< U, i > &) const\n+noexcept -> std::integral_constant< value_type, from+static_cast< value_type >\n+(i)>\n+access specified element (static version)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn rangeutilities.hh:263\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bt_\ba_\bt_\bi_\bc_\bI_\bn_\bt_\be_\bg_\br_\ba_\bl_\bR_\ba_\bn_\bg_\be_\b:_\b:_\be_\bm_\bp_\bt_\by\n+static constexpr std::integral_constant< bool, from==to > empty() noexcept\n+check whether the range is empty\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn rangeutilities.hh:273\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bt_\ba_\bt_\bi_\bc_\bI_\bn_\bt_\be_\bg_\br_\ba_\bl_\bR_\ba_\bn_\bg_\be_\b:_\b:_\bb_\be_\bg_\bi_\bn\n+static constexpr iterator begin() noexcept\n+obtain a random-access iterator to the first element\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn rangeutilities.hh:257\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bt_\ba_\bt_\bi_\bc_\bI_\bn_\bt_\be_\bg_\br_\ba_\bl_\bR_\ba_\bn_\bg_\be_\b:_\b:_\bt_\bo_\b__\bi_\bn_\bt_\be_\bg_\be_\br_\b__\bs_\be_\bq_\bu_\be_\bn_\bc_\be\n+static constexpr integer_sequence to_integer_sequence() noexcept\n+return corresponding std::integer_sequence\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn rangeutilities.hh:254\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bt_\ba_\bt_\bi_\bc_\bI_\bn_\bt_\be_\bg_\br_\ba_\bl_\bR_\ba_\bn_\bg_\be_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b[_\b]\n+constexpr value_type operator[](const size_type &i) const noexcept\n+access specified element (dynamic version)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn rangeutilities.hh:270\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bt_\ba_\bt_\bi_\bc_\bI_\bn_\bt_\be_\bg_\br_\ba_\bl_\bR_\ba_\bn_\bg_\be_\b:_\b:_\bi_\bt_\be_\br_\ba_\bt_\bo_\br\n+Impl::IntegralRangeIterator< T > iterator\n+type of iterator\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn rangeutilities.hh:238\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bt_\ba_\bt_\bi_\bc_\bI_\bn_\bt_\be_\bg_\br_\ba_\bl_\bR_\ba_\bn_\bg_\be_\b:_\b:_\bs_\bi_\bz_\be\n+static constexpr std::integral_constant< size_type, static_cast< size_type >\n+(to) - static_cast< size_type >(from) > size() noexcept\n+obtain number of elements in the range\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn rangeutilities.hh:275\n+_\bD_\bu_\bn_\be_\b:_\b:_\bV_\ba_\bl_\bu_\be_\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\bT_\ba_\bg\n+Tag to enable value based transformations in TransformedRangeView.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn rangeutilities.hh:328\n+_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\bT_\ba_\bg\n+Tag to enable iterator based transformations in TransformedRangeView.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn rangeutilities.hh:333\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\be_\bd_\bR_\ba_\bn_\bg_\be_\bV_\bi_\be_\bw\n+A range transforming the values of another range on-the-fly.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn rangeutilities.hh:501\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\be_\bd_\bR_\ba_\bn_\bg_\be_\bV_\bi_\be_\bw_\b:_\b:_\bi_\bt_\be_\br_\ba_\bt_\bo_\br\n+Impl::TransformedRangeIterator< RawIterator, F *, T > iterator\n+Iterator type.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn rangeutilities.hh:521\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\be_\bd_\bR_\ba_\bn_\bg_\be_\bV_\bi_\be_\bw_\b:_\b:_\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\be_\bd_\bR_\ba_\bn_\bg_\be_\bV_\bi_\be_\bw\n+constexpr TransformedRangeView(RR &&rawRange, FF &&f) noexcept\n+Construct from range and function.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn rangeutilities.hh:535\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\be_\bd_\bR_\ba_\bn_\bg_\be_\bV_\bi_\be_\bw_\b:_\b:_\be_\bn_\bd\n+constexpr iterator end() noexcept\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn rangeutilities.hh:571\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\be_\bd_\bR_\ba_\bn_\bg_\be_\bV_\bi_\be_\bw_\b:_\b:_\bc_\bo_\bn_\bs_\bt_\b__\bi_\bt_\be_\br_\ba_\bt_\bo_\br\n+Impl::TransformedRangeIterator< RawConstIterator, const F *, T > const_iterator\n+Const iterator type.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn rangeutilities.hh:513\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\be_\bd_\bR_\ba_\bn_\bg_\be_\bV_\bi_\be_\bw_\b:_\b:_\bR_\ba_\bw_\bR_\ba_\bn_\bg_\be\n+std::remove_reference_t< R > RawRange\n+Export type of the wrapped untransformed range.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn rangeutilities.hh:529\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\be_\bd_\bR_\ba_\bn_\bg_\be_\bV_\bi_\be_\bw_\b:_\b:_\bb_\be_\bg_\bi_\bn\n+constexpr iterator begin() noexcept\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn rangeutilities.hh:555\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\be_\bd_\bR_\ba_\bn_\bg_\be_\bV_\bi_\be_\bw_\b:_\b:_\br_\ba_\bw_\bR_\ba_\bn_\bg_\be\n+RawRange & rawRange() noexcept\n+Export the wrapped untransformed range.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn rangeutilities.hh:631\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\be_\bd_\bR_\ba_\bn_\bg_\be_\bV_\bi_\be_\bw_\b:_\b:_\br_\ba_\bw_\bR_\ba_\bn_\bg_\be\n+const RawRange & rawRange() const noexcept\n+Export the wrapped untransformed range.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn rangeutilities.hh:623\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\be_\bd_\bR_\ba_\bn_\bg_\be_\bV_\bi_\be_\bw_\b:_\b:_\bb_\be_\bg_\bi_\bn\n+constexpr const_iterator begin() const noexcept\n+Obtain a iterator to the first element.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn rangeutilities.hh:551\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\be_\bd_\bR_\ba_\bn_\bg_\be_\bV_\bi_\be_\bw_\b:_\b:_\bs_\bi_\bz_\be\n+auto size() const noexcept\n+Obtain the size of the range.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn rangeutilities.hh:607\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\be_\bd_\bR_\ba_\bn_\bg_\be_\bV_\bi_\be_\bw_\b:_\b:_\be_\bn_\bd\n+constexpr const_iterator end() const noexcept\n+Obtain a iterator past the last element.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn rangeutilities.hh:567\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\be_\bd_\bR_\ba_\bn_\bg_\be_\bV_\bi_\be_\bw_\b:_\b:_\be_\bm_\bp_\bt_\by\n+constexpr bool empty() const noexcept\n+Checks whether the range is empty.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn rangeutilities.hh:615\n+_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bs_\bC_\ba_\bl_\bl_\ba_\bb_\bl_\be\n+Check if a type is callable with ()-operator and given arguments.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn typetraits.hh:162\n ===============================================================================\n Generated by\u00a0_\b[_\bd_\bo_\bx_\by_\bg_\be_\bn_\b] 1.9.8\n"}]}, {"source1": "./usr/share/doc/libdune-common-doc/doxygen/a00134.html", "source2": "./usr/share/doc/libdune-common-doc/doxygen/a00134.html", "unified_diff": "@@ -1,15 +1,15 @@\n \n \n \n \n \n \n \n-dune-common: type_traits.hh File Reference\n+dune-common: documentation.hh File Reference\n \n \n \n \n \n \n \n@@ -65,78 +65,51 @@\n
    \n \n \n \n \n \n \n
    \n \n-
    type_traits.hh File Reference
    \n+Enumerations
    \n+
    documentation.hh File Reference
    \n \n
    \n-
    #include <type_traits>
    \n-#include <dune-common-config.hh>
    \n-#include <dune/common/typetraits.hh>
    \n-#include <dune/common/typeutilities.hh>
    \n-
    \n+\n+

    Documentation related stuff. \n+More...

    \n+\n

    Go to the source code of this file.

    \n \n \n-\n-\n+\n+\n \n

    \n Classes

    struct  Dune::Std::nonesuch
     Type representing a lookup failure by std::detected_or and friends. More...
    struct  Dune::ImplementationDefined
     Dummy struct used for documentation purposes. More...
     
    \n \n \n \n \n-\n-\n-\n

    \n Namespaces

    namespace  Dune
     Dune namespace.
     
    namespace  Dune::Std
     Namespace for features backported from new C++ standards.
     
    \n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n+\n+\n+\n

    \n-Typedefs

    template<typename Default , template< typename... > class Op, typename... Args>
    using Dune::Std::detected_or = Impl::detector< Default, void, Op, Args... >
     Detects whether Op<Args...> is valid and makes the result available.
     
    template<template< typename... > class Op, typename... Args>
    using Dune::Std::is_detected = typename detected_or< nonesuch, Op, Args... >::value_t
     Detects whether Op<Args...> is valid.
     
    template<template< typename... > class Op, typename... Args>
    using Dune::Std::detected_t = typename detected_or< nonesuch, Op, Args... >::type
     Returns Op<Args...> if that is valid; otherwise returns nonesuch.
     
    template<typename Default , template< typename... > class Op, typename... Args>
    using Dune::Std::detected_or_t = typename detected_or< Default, Op, Args... >::type
     Returns Op<Args...> if that is valid; otherwise returns the fallback type Default.
     
    template<typename Expected , template< typename... > class Op, typename... Args>
    using Dune::Std::is_detected_exact = std::is_same< Expected, detected_t< Op, Args... > >
     Checks whether Op<Args...> is Expected without causing an error if Op<Args...> is invalid.
     
    template<typename Target , template< typename... > class Op, typename... Args>
    using Dune::Std::is_detected_convertible = std::is_convertible< Target, detected_t< Op, Args... > >
     Checks whether Op<Args...> is convertible to Target without causing an error if Op<Args...> is invalid.
     
    template<template< typename... > class Fallback, template< typename... > class TargetType, typename... Args>
    using Dune::detected_or_fallback_t = Std::detected_or_t< decltype(detail::warningIfNotDefined< Std::detected_t< Fallback, Args... > >(std::declval< const Std::detected_t< TargetType, Args... > * >())), TargetType, Args... >
     This type will be either TargetType<Args...> if it exists, or the Fallback<Args...> type.
     

    \n+Enumerations

    enum  { Dune::implementationDefined\n+ }
     
    \n-
    \n+

    Detailed Description

    \n+

    Documentation related stuff.

    \n+
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,71 +1,25 @@\n dune-common\u00a02.10\n Loading...\n Searching...\n No Matches\n * _\bd_\bu_\bn_\be\n * _\bc_\bo_\bm_\bm_\bo_\bn\n- * _\bs_\bt_\bd\n-_\bC_\bl_\ba_\bs_\bs_\be_\bs | _\bN_\ba_\bm_\be_\bs_\bp_\ba_\bc_\be_\bs | _\bT_\by_\bp_\be_\bd_\be_\bf_\bs\n-type_traits.hh File Reference\n-#include \n-#include \n-#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bt_\by_\bp_\be_\bt_\br_\ba_\bi_\bt_\bs_\b._\bh_\bh>\n-#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bt_\by_\bp_\be_\bu_\bt_\bi_\bl_\bi_\bt_\bi_\be_\bs_\b._\bh_\bh>\n+_\bC_\bl_\ba_\bs_\bs_\be_\bs | _\bN_\ba_\bm_\be_\bs_\bp_\ba_\bc_\be_\bs | _\bE_\bn_\bu_\bm_\be_\br_\ba_\bt_\bi_\bo_\bn_\bs\n+documentation.hh File Reference\n+Documentation related stuff. _\bM_\bo_\br_\be_\b._\b._\b.\n _\bG_\bo_\b _\bt_\bo_\b _\bt_\bh_\be_\b _\bs_\bo_\bu_\br_\bc_\be_\b _\bc_\bo_\bd_\be_\b _\bo_\bf_\b _\bt_\bh_\bi_\bs_\b _\bf_\bi_\bl_\be_\b.\n C\bCl\bla\bas\bss\bse\bes\bs\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bS_\bt_\bd_\b:_\b:_\bn_\bo_\bn_\be_\bs_\bu_\bc_\bh\n-\u00a0 Type representing a lookup failure by std::detected_or and friends.\n- _\bM_\bo_\br_\be_\b._\b._\b.\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bI_\bm_\bp_\bl_\be_\bm_\be_\bn_\bt_\ba_\bt_\bi_\bo_\bn_\bD_\be_\bf_\bi_\bn_\be_\bd\n+\u00a0 Dummy struct used for documentation purposes. _\bM_\bo_\br_\be_\b._\b._\b.\n \u00a0\n N\bNa\bam\bme\bes\bsp\bpa\bac\bce\bes\bs\n namespace \u00a0 _\bD_\bu_\bn_\be\n \u00a0 _\bD_\bu_\bn_\be namespace.\n \u00a0\n-namespace \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bS_\bt_\bd\n-\u00a0 Namespace for features backported from new C++ standards.\n-\u00a0\n-T\bTy\byp\bpe\bed\bde\bef\bfs\bs\n-template class Op, typename... Args>\n-using\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bS_\bt_\bd_\b:_\b:_\bd_\be_\bt_\be_\bc_\bt_\be_\bd_\b__\bo_\br = Impl::detector< Default, void, Op, Args... >\n-\u00a0 Detects whether Op is valid and makes the result available.\n-\u00a0\n-template class Op, typename... Args>\n-using\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bS_\bt_\bd_\b:_\b:_\bi_\bs_\b__\bd_\be_\bt_\be_\bc_\bt_\be_\bd = typename _\bd_\be_\bt_\be_\bc_\bt_\be_\bd_\b__\bo_\br< _\bn_\bo_\bn_\be_\bs_\bu_\bc_\bh, Op, Args... >::\n- value_t\n-\u00a0 Detects whether Op is valid.\n-\u00a0\n-template class Op, typename... Args>\n-using\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bS_\bt_\bd_\b:_\b:_\bd_\be_\bt_\be_\bc_\bt_\be_\bd_\b__\bt = typename _\bd_\be_\bt_\be_\bc_\bt_\be_\bd_\b__\bo_\br< _\bn_\bo_\bn_\be_\bs_\bu_\bc_\bh, Op, Args... >::\n- type\n-\u00a0 Returns Op if that is valid; otherwise returns nonesuch.\n-\u00a0\n-template class Op, typename... Args>\n-using\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bS_\bt_\bd_\b:_\b:_\bd_\be_\bt_\be_\bc_\bt_\be_\bd_\b__\bo_\br_\b__\bt = typename _\bd_\be_\bt_\be_\bc_\bt_\be_\bd_\b__\bo_\br< Default, Op, Args...\n- >::type\n-\u00a0 Returns Op if that is valid; otherwise returns the fallback\n- type Default.\n-\u00a0\n-template class Op, typename...\n-Args>\n-using\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bS_\bt_\bd_\b:_\b:_\bi_\bs_\b__\bd_\be_\bt_\be_\bc_\bt_\be_\bd_\b__\be_\bx_\ba_\bc_\bt = std::is_same< Expected, _\bd_\be_\bt_\be_\bc_\bt_\be_\bd_\b__\bt< Op,\n- Args... > >\n-\u00a0 Checks whether Op is Expected without causing an error if\n- Op is invalid.\n-\u00a0\n-template class Op, typename... Args>\n-using\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bS_\bt_\bd_\b:_\b:_\bi_\bs_\b__\bd_\be_\bt_\be_\bc_\bt_\be_\bd_\b__\bc_\bo_\bn_\bv_\be_\br_\bt_\bi_\bb_\bl_\be = std::is_convertible< Target,\n- _\bd_\be_\bt_\be_\bc_\bt_\be_\bd_\b__\bt< Op, Args... > >\n-\u00a0 Checks whether Op is convertible to Target without causing an\n- error if Op is invalid.\n-\u00a0\n-template class Fallback, template< typename... > class\n-TargetType, typename... Args>\n-using\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bd_\be_\bt_\be_\bc_\bt_\be_\bd_\b__\bo_\br_\b__\bf_\ba_\bl_\bl_\bb_\ba_\bc_\bk_\b__\bt = _\bS_\bt_\bd_\b:_\b:_\bd_\be_\bt_\be_\bc_\bt_\be_\bd_\b__\bo_\br_\b__\bt< decltype(detail::\n- warningIfNotDefined< _\bS_\bt_\bd_\b:_\b:_\bd_\be_\bt_\be_\bc_\bt_\be_\bd_\b__\bt< Fallback, Args... > >(std::\n- declval< const _\bS_\bt_\bd_\b:_\b:_\bd_\be_\bt_\be_\bc_\bt_\be_\bd_\b__\bt< TargetType, Args... > * >())),\n- TargetType, Args... >\n-\u00a0 This type will be either TargetType if it exists, or the\n- Fallback type.\n+E\bEn\bnu\bum\bme\ber\bra\bat\bti\bio\bon\bns\bs\n+enum \u00a0 { _\bD_\bu_\bn_\be_\b:_\b:_\bi_\bm_\bp_\bl_\be_\bm_\be_\bn_\bt_\ba_\bt_\bi_\bo_\bn_\bD_\be_\bf_\bi_\bn_\be_\bd }\n \u00a0\n+*\b**\b**\b**\b**\b* D\bDe\bet\bta\bai\bil\ble\bed\bd D\bDe\bes\bsc\bcr\bri\bip\bpt\bti\bio\bon\bn *\b**\b**\b**\b**\b*\n+Documentation related stuff.\n ===============================================================================\n Generated by\u00a0_\b[_\bd_\bo_\bx_\by_\bg_\be_\bn_\b] 1.9.8\n"}]}, {"source1": "./usr/share/doc/libdune-common-doc/doxygen/a00134_source.html", "source2": "./usr/share/doc/libdune-common-doc/doxygen/a00134_source.html", "unified_diff": "@@ -1,15 +1,15 @@\n \n \n \n \n \n \n \n-dune-common: type_traits.hh Source File\n+dune-common: documentation.hh Source File\n \n \n \n \n \n \n \n@@ -70,184 +70,42 @@\n \n \n \n \n \n \n \n
    \n-
    type_traits.hh
    \n+
    documentation.hh
    \n
    \n
    \n Go to the documentation of this file.
    1// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
    \n
    2// vi: set et ts=4 sw=2 sts=2:
    \n
    3// SPDX-FileCopyrightInfo: Copyright \u00a9 DUNE Project contributors, see file LICENSE.md in module root
    \n
    4// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception
    \n-
    5#ifndef DUNE_COMMON_STD_TYPE_TRAITS_HH
    \n-
    6#define DUNE_COMMON_STD_TYPE_TRAITS_HH
    \n-
    7
    \n-
    8#include <type_traits>
    \n-
    9#include <dune-common-config.hh> // DUNE_HAVE_CXX_EXPERIMENTAL_IS_DETECTED
    \n-\n-\n-
    12
    \n-
    13#if DUNE_HAVE_CXX_EXPERIMENTAL_IS_DETECTED
    \n-
    14#include <experimental/type_traits>
    \n-
    15#endif
    \n-
    16
    \n-
    17namespace Dune
    \n-
    18{
    \n-
    19
    \n-
    21
    \n-
    30namespace Std
    \n-
    31{
    \n-
    32
    \n-
    35 using std::bool_constant;
    \n-
    36
    \n-
    37#if DUNE_HAVE_CXX_EXPERIMENTAL_IS_DETECTED
    \n-
    38
    \n-
    39 using std::experimental::nonesuch;
    \n-
    40 using std::experimental::detected_or;
    \n-
    41 using std::experimental::is_detected;
    \n-
    42 using std::experimental::detected_t;
    \n-
    43 using std::experimental::is_detected_v;
    \n-
    44 using std::experimental::detected_or_t;
    \n-
    45 using std::experimental::is_detected_exact;
    \n-
    46 using std::experimental::is_detected_exact_v;
    \n-
    47 using std::experimental::is_detected_convertible;
    \n-
    48 using std::experimental::is_detected_convertible_v;
    \n-
    49
    \n-
    50#else // DUNE_HAVE_CXX_EXPERIMENTAL_IS_DETECTED
    \n-
    51
    \n-
    52 // fallback version of std::experimental::is_detected et al., heavily scribbled
    \n-
    53 // from cppreference.com (but there is actually not much implementation to the thing)
    \n-
    54
    \n-
    55#ifndef DOXYGEN
    \n+
    5
    \n+
    6#ifndef DUNE_COMMON_DOCUMENTATION_HH
    \n+
    7#define DUNE_COMMON_DOCUMENTATION_HH
    \n+
    8
    \n+
    13namespace Dune {
    \n+
    14
    \n+\n+
    43
    \n+\n
    56
    \n-
    57 namespace Impl {
    \n+
    57}
    \n
    58
    \n-
    59 // default version of detector, this gets matched on failure
    \n-
    60 template<typename Default, typename Void, template<typename...> class Op, typename... Args>
    \n-
    61 struct detector
    \n-
    62 {
    \n-
    63 using value_t = std::false_type;
    \n-
    64 using type = Default;
    \n-
    65 };
    \n-
    66
    \n-
    67 // specialization of detector that matches if Op<Args...> can be instantiated
    \n-
    68 template<typename Default, template<typename...> class Op, typename... Args>
    \n-
    69 struct detector<Default, std::void_t<Op<Args...>>, Op, Args...>
    \n-
    70 {
    \n-
    71 using value_t = std::true_type;
    \n-
    72 using type = Op<Args...>;
    \n-
    73 };
    \n-
    74
    \n-
    75 }
    \n-
    76
    \n-
    77#endif // DOXYGEN
    \n-
    78
    \n-
    80
    \n-
    \n-
    88 struct nonesuch
    \n-
    89 {
    \n-
    90 nonesuch() = delete;
    \n-
    91 ~nonesuch() = delete;
    \n-
    92 nonesuch(const nonesuch&) = delete;
    \n-
    93 void operator=(const nonesuch&) = delete;
    \n-
    94 };
    \n-
    \n-
    95
    \n-
    97
    \n-
    131 template<typename Default, template<typename...> class Op, typename... Args>
    \n-
    132 using detected_or = Impl::detector<Default,void,Op,Args...>;
    \n-
    133
    \n-
    135
    \n-
    144 template<template<typename...> class Op, typename... Args>
    \n-
    145 using is_detected = typename detected_or<nonesuch,Op,Args...>::value_t;
    \n-
    146
    \n-
    147#ifdef __cpp_variable_templates
    \n-
    149
    \n-
    158 template<template<typename...> class Op, typename... Args>
    \n-
    159 constexpr bool is_detected_v = is_detected<Op,Args...>::value;
    \n-
    160#endif // __cpp_variable_templates
    \n-
    161
    \n-
    163
    \n-
    173 template<template<typename...> class Op, typename... Args>
    \n-
    174 using detected_t = typename detected_or<nonesuch,Op,Args...>::type;
    \n-
    175
    \n-
    176
    \n-
    178
    \n-
    188 template<typename Default, template<typename...> class Op, typename... Args>
    \n-
    189 using detected_or_t = typename detected_or<Default,Op,Args...>::type;
    \n-
    190
    \n-
    192
    \n-
    198 template<typename Expected, template<typename...> class Op, typename... Args>
    \n-
    199 using is_detected_exact = std::is_same<Expected,detected_t<Op,Args...>>;
    \n-
    200
    \n-
    201#ifdef __cpp_variable_templates
    \n-
    203
    \n-
    209 template<typename Expected, template<typename...> class Op, typename... Args>
    \n-
    210 constexpr bool is_detected_exact_v = is_detected_exact<Expected,Op,Args...>::value;
    \n-
    211#endif // __cpp_variable_templates
    \n-
    212
    \n-
    214
    \n-
    220 template<typename Target, template<typename...> class Op, typename... Args>
    \n-
    221 using is_detected_convertible = std::is_convertible<Target,detected_t<Op,Args...>>;
    \n-
    222
    \n-
    223#ifdef __cpp_variable_templates
    \n-
    225
    \n-
    231 template<typename Target, template<typename...> class Op, typename... Args>
    \n-
    232 constexpr bool is_detected_convertible_v = is_detected_convertible<Target,Op,Args...>::value;
    \n-
    233#endif // __cpp_variable_templates
    \n-
    234
    \n-
    235#endif // DUNE_HAVE_CXX_EXPERIMENTAL_IS_DETECTED
    \n-
    236
    \n-
    237} // namespace Std
    \n-
    238
    \n-
    239
    \n-
    240namespace detail
    \n-
    241{
    \n-
    242 template <class Type>
    \n-
    243 [[deprecated("Type extraction of `TargetType` has failed. Inspect the code calling `detected_or_fallback_t` for getting the source of this warning!")]]
    \n-
    244 Type warningIfNotDefined(const Std::nonesuch*);
    \n-
    245
    \n-
    246 template <class Type, class T>
    \n-
    247 Type warningIfNotDefined(const T*);
    \n-
    248}
    \n-
    249
    \n-
    251template <template<typename...> class Fallback,
    \n-
    252 template<typename...> class TargetType, typename... Args>
    \n-\n-
    254 detail::warningIfNotDefined<Std::detected_t<Fallback, Args...> >(std::declval<const Std::detected_t<TargetType, Args...>*>())),
    \n-
    255 TargetType, Args...>;
    \n-
    256
    \n-
    257
    \n-
    258} // namespace Dune
    \n-
    259
    \n-
    260#endif // #ifndef DUNE_COMMON_STD_TYPE_TRAITS_HH
    \n-
    Traits for type conversions and type information.
    \n-
    Utilities for type computations, constraining overloads, ...
    \n-
    typename detected_or< Default, Op, Args... >::type detected_or_t
    Returns Op<Args...> if that is valid; otherwise returns the fallback type Default.
    Definition type_traits.hh:189
    \n-
    std::is_same< Expected, detected_t< Op, Args... > > is_detected_exact
    Checks whether Op<Args...> is Expected without causing an error if Op<Args...> is invalid.
    Definition type_traits.hh:199
    \n-
    typename detected_or< nonesuch, Op, Args... >::type detected_t
    Returns Op<Args...> if that is valid; otherwise returns nonesuch.
    Definition type_traits.hh:174
    \n-
    typename Impl::voider< Types... >::type void_t
    Is void for all valid input types. The workhorse for C++11 SFINAE-techniques.
    Definition typetraits.hh:40
    \n-
    typename detected_or< nonesuch, Op, Args... >::value_t is_detected
    Detects whether Op<Args...> is valid.
    Definition type_traits.hh:145
    \n-
    Impl::detector< Default, void, Op, Args... > detected_or
    Detects whether Op<Args...> is valid and makes the result available.
    Definition type_traits.hh:132
    \n-
    std::is_convertible< Target, detected_t< Op, Args... > > is_detected_convertible
    Checks whether Op<Args...> is convertible to Target without causing an error if Op<Args....
    Definition type_traits.hh:221
    \n-
    STL namespace.
    \n+
    59
    \n+
    60#endif // DUNE_COMMON_DOCUMENTATION_HH
    \n
    Dune namespace.
    Definition alignedallocator.hh:13
    \n-
    Std::detected_or_t< decltype(detail::warningIfNotDefined< Std::detected_t< Fallback, Args... > >(std::declval< const Std::detected_t< TargetType, Args... > * >())), TargetType, Args... > detected_or_fallback_t
    This type will be either TargetType<Args...> if it exists, or the Fallback<Args......
    Definition type_traits.hh:255
    \n-
    Type representing a lookup failure by std::detected_or and friends.
    Definition type_traits.hh:89
    \n-\n-
    nonesuch(const nonesuch &)=delete
    \n-
    void operator=(const nonesuch &)=delete
    \n-\n+
    @ implementationDefined
    Definition documentation.hh:55
    \n+
    Dummy struct used for documentation purposes.
    Definition documentation.hh:42
    \n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,228 +1,38 @@\n dune-common\u00a02.10\n Loading...\n Searching...\n No Matches\n * _\bd_\bu_\bn_\be\n * _\bc_\bo_\bm_\bm_\bo_\bn\n- * _\bs_\bt_\bd\n-type_traits.hh\n+documentation.hh\n _\bG_\bo_\b _\bt_\bo_\b _\bt_\bh_\be_\b _\bd_\bo_\bc_\bu_\bm_\be_\bn_\bt_\ba_\bt_\bi_\bo_\bn_\b _\bo_\bf_\b _\bt_\bh_\bi_\bs_\b _\bf_\bi_\bl_\be_\b.\n 1// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-\n 2// vi: set et ts=4 sw=2 sts=2:\n 3// SPDX-FileCopyrightInfo: Copyright \u00c2\u00a9 DUNE Project contributors, see file\n LICENSE.md in module root\n 4// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception\n-5#ifndef DUNE_COMMON_STD_TYPE_TRAITS_HH\n-6#define DUNE_COMMON_STD_TYPE_TRAITS_HH\n-7\n-8#include \n-9#include // DUNE_HAVE_CXX_EXPERIMENTAL_IS_DETECTED\n-10#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bt_\by_\bp_\be_\bt_\br_\ba_\bi_\bt_\bs_\b._\bh_\bh>\n-11#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bt_\by_\bp_\be_\bu_\bt_\bi_\bl_\bi_\bt_\bi_\be_\bs_\b._\bh_\bh>\n-12\n-13#if DUNE_HAVE_CXX_EXPERIMENTAL_IS_DETECTED\n-14#include \n-15#endif\n-16\n-17namespace _\bD_\bu_\bn_\be\n-18{\n-19\n-21\n-30namespace Std\n-31{\n-32\n-35 using std::bool_constant;\n-36\n-37#if DUNE_HAVE_CXX_EXPERIMENTAL_IS_DETECTED\n-38\n-39 using std::experimental::nonesuch;\n-40 using std::experimental::detected_or;\n-41 using std::experimental::is_detected;\n-42 using std::experimental::detected_t;\n-43 using std::experimental::is_detected_v;\n-44 using std::experimental::detected_or_t;\n-45 using std::experimental::is_detected_exact;\n-46 using std::experimental::is_detected_exact_v;\n-47 using std::experimental::is_detected_convertible;\n-48 using std::experimental::is_detected_convertible_v;\n-49\n-50#else // DUNE_HAVE_CXX_EXPERIMENTAL_IS_DETECTED\n-51\n-52 // fallback version of std::experimental::is_detected et al., heavily\n-scribbled\n-53 // from cppreference.com (but there is actually not much implementation to\n-the thing)\n-54\n-55#ifndef DOXYGEN\n+5\n+6#ifndef DUNE_COMMON_DOCUMENTATION_HH\n+7#define DUNE_COMMON_DOCUMENTATION_HH\n+8\n+13namespace _\bD_\bu_\bn_\be {\n+14\n+_\b4_\b2 struct _\bI_\bm_\bp_\bl_\be_\bm_\be_\bn_\bt_\ba_\bt_\bi_\bo_\bn_\bD_\be_\bf_\bi_\bn_\be_\bd {};\n+43\n+_\b5_\b5 enum { _\bi_\bm_\bp_\bl_\be_\bm_\be_\bn_\bt_\ba_\bt_\bi_\bo_\bn_\bD_\be_\bf_\bi_\bn_\be_\bd };\n 56\n-57 namespace Impl {\n+57}\n 58\n-59 // default version of detector, this gets matched on failure\n-60 template class Op,\n-typename... Args>\n-61 struct detector\n-62 {\n-63 using value_t = std::false_type;\n-64 using type = Default;\n-65 };\n-66\n-67 // specialization of detector that matches if Op can be\n-instantiated\n-68 template class Op, typename... Args>\n-69 struct detector>, Op, Args...>\n-70 {\n-71 using value_t = std::true_type;\n-72 using type = Op;\n-73 };\n-74\n-75 }\n-76\n-77#endif // DOXYGEN\n-78\n-80\n-_\b8_\b8 struct _\bn_\bo_\bn_\be_\bs_\bu_\bc_\bh\n-89 {\n-_\b9_\b0 _\bn_\bo_\bn_\be_\bs_\bu_\bc_\bh() = delete;\n-_\b9_\b1 _\b~_\bn_\bo_\bn_\be_\bs_\bu_\bc_\bh() = delete;\n-_\b9_\b2 _\bn_\bo_\bn_\be_\bs_\bu_\bc_\bh(const _\bn_\bo_\bn_\be_\bs_\bu_\bc_\bh&) = delete;\n-_\b9_\b3 void _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b=(const _\bn_\bo_\bn_\be_\bs_\bu_\bc_\bh&) = delete;\n-94 };\n-95\n-97\n-131 template class Op, typename...\n-Args>\n-_\b1_\b3_\b2 using _\bd_\be_\bt_\be_\bc_\bt_\be_\bd_\b__\bo_\br = Impl::detector;\n-133\n-135\n-144 template class Op, typename... Args>\n-_\b1_\b4_\b5 using _\bi_\bs_\b__\bd_\be_\bt_\be_\bc_\bt_\be_\bd = typename _\bd_\be_\bt_\be_\bc_\bt_\be_\bd_\b__\bo_\br<_\bn_\bo_\bn_\be_\bs_\bu_\bc_\bh,Op,Args...>::value_t;\n-146\n-147#ifdef __cpp_variable_templates\n-149\n-158 template class Op, typename... Args>\n-159 constexpr bool is_detected_v = _\bi_\bs_\b__\bd_\be_\bt_\be_\bc_\bt_\be_\bd::value;\n-160#endif // __cpp_variable_templates\n-161\n-163\n-173 template class Op, typename... Args>\n-_\b1_\b7_\b4 using _\bd_\be_\bt_\be_\bc_\bt_\be_\bd_\b__\bt = typename _\bd_\be_\bt_\be_\bc_\bt_\be_\bd_\b__\bo_\br<_\bn_\bo_\bn_\be_\bs_\bu_\bc_\bh,Op,Args...>::type;\n-175\n-176\n-178\n-188 template class Op, typename...\n-Args>\n-_\b1_\b8_\b9 using _\bd_\be_\bt_\be_\bc_\bt_\be_\bd_\b__\bo_\br_\b__\bt = typename _\bd_\be_\bt_\be_\bc_\bt_\be_\bd_\b__\bo_\br::type;\n-190\n-192\n-198 template class Op, typename...\n-Args>\n-_\b1_\b9_\b9 using _\bi_\bs_\b__\bd_\be_\bt_\be_\bc_\bt_\be_\bd_\b__\be_\bx_\ba_\bc_\bt = std::is_same>;\n-200\n-201#ifdef __cpp_variable_templates\n-203\n-209 template class Op, typename...\n-Args>\n-210 constexpr bool is_detected_exact_v =\n-_\bi_\bs_\b__\bd_\be_\bt_\be_\bc_\bt_\be_\bd_\b__\be_\bx_\ba_\bc_\bt::value;\n-211#endif // __cpp_variable_templates\n-212\n-214\n-220 template class Op, typename... Args>\n-_\b2_\b2_\b1 using _\bi_\bs_\b__\bd_\be_\bt_\be_\bc_\bt_\be_\bd_\b__\bc_\bo_\bn_\bv_\be_\br_\bt_\bi_\bb_\bl_\be = std::\n-is_convertible>;\n-222\n-223#ifdef __cpp_variable_templates\n-225\n-231 template class Op, typename... Args>\n-232 constexpr bool is_detected_convertible_v =\n-_\bi_\bs_\b__\bd_\be_\bt_\be_\bc_\bt_\be_\bd_\b__\bc_\bo_\bn_\bv_\be_\br_\bt_\bi_\bb_\bl_\be::value;\n-233#endif // __cpp_variable_templates\n-234\n-235#endif // DUNE_HAVE_CXX_EXPERIMENTAL_IS_DETECTED\n-236\n-237} // namespace Std\n-238\n-239\n-240namespace detail\n-241{\n-242 template \n-243 [[deprecated(\"Type extraction of `TargetType` has failed. Inspect the code\n-calling `detected_or_fallback_t` for getting the source of this warning!\")]]\n-244 Type warningIfNotDefined(const _\bS_\bt_\bd_\b:_\b:_\bn_\bo_\bn_\be_\bs_\bu_\bc_\bh*);\n-245\n-246 template \n-247 Type warningIfNotDefined(const T*);\n-248}\n-249\n-251template class Fallback,\n-252 template class TargetType, typename... Args>\n-_\b2_\b5_\b3using _\bd_\be_\bt_\be_\bc_\bt_\be_\bd_\b__\bo_\br_\b__\bf_\ba_\bl_\bl_\bb_\ba_\bc_\bk_\b__\bt = _\bS_\bt_\bd_\b:_\b:_\bd_\be_\bt_\be_\bc_\bt_\be_\bd_\b__\bo_\br_\b__\bt >(std::\n-declval*>())),\n-255 TargetType, Args...>;\n-256\n-257\n-258} // namespace Dune\n-259\n-260#endif // #ifndef DUNE_COMMON_STD_TYPE_TRAITS_HH\n-_\bt_\by_\bp_\be_\bt_\br_\ba_\bi_\bt_\bs_\b._\bh_\bh\n-Traits for type conversions and type information.\n-_\bt_\by_\bp_\be_\bu_\bt_\bi_\bl_\bi_\bt_\bi_\be_\bs_\b._\bh_\bh\n-Utilities for type computations, constraining overloads, ...\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bt_\bd_\b:_\b:_\bd_\be_\bt_\be_\bc_\bt_\be_\bd_\b__\bo_\br_\b__\bt\n-typename detected_or< Default, Op, Args... >::type detected_or_t\n-Returns Op if that is valid; otherwise returns the fallback type\n-Default.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn type_traits.hh:189\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bt_\bd_\b:_\b:_\bi_\bs_\b__\bd_\be_\bt_\be_\bc_\bt_\be_\bd_\b__\be_\bx_\ba_\bc_\bt\n-std::is_same< Expected, detected_t< Op, Args... > > is_detected_exact\n-Checks whether Op is Expected without causing an error if Op\n-is invalid.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn type_traits.hh:199\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bt_\bd_\b:_\b:_\bd_\be_\bt_\be_\bc_\bt_\be_\bd_\b__\bt\n-typename detected_or< nonesuch, Op, Args... >::type detected_t\n-Returns Op if that is valid; otherwise returns nonesuch.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn type_traits.hh:174\n-_\bD_\bu_\bn_\be_\b:_\b:_\bv_\bo_\bi_\bd_\b__\bt\n-typename Impl::voider< Types... >::type void_t\n-Is void for all valid input types. The workhorse for C++11 SFINAE-techniques.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn typetraits.hh:40\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bt_\bd_\b:_\b:_\bi_\bs_\b__\bd_\be_\bt_\be_\bc_\bt_\be_\bd\n-typename detected_or< nonesuch, Op, Args... >::value_t is_detected\n-Detects whether Op is valid.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn type_traits.hh:145\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bt_\bd_\b:_\b:_\bd_\be_\bt_\be_\bc_\bt_\be_\bd_\b__\bo_\br\n-Impl::detector< Default, void, Op, Args... > detected_or\n-Detects whether Op is valid and makes the result available.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn type_traits.hh:132\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bt_\bd_\b:_\b:_\bi_\bs_\b__\bd_\be_\bt_\be_\bc_\bt_\be_\bd_\b__\bc_\bo_\bn_\bv_\be_\br_\bt_\bi_\bb_\bl_\be\n-std::is_convertible< Target, detected_t< Op, Args... > >\n-is_detected_convertible\n-Checks whether Op is convertible to Target without causing an error if\n-Op >(std::declval< const Std::detected_t< TargetType, Args...\n-> * >())), TargetType, Args... > detected_or_fallback_t\n-This type will be either TargetType if it exists, or the\n-Fallback\n \n \n \n \n \n \n-dune-common: default_accessor.hh File Reference\n+dune-common: propertymap.hh File Reference\n \n \n \n \n \n \n \n@@ -65,42 +65,83 @@\n \n \n \n \n \n \n \n
    \n \n-
    default_accessor.hh File Reference
    \n+Namespaces |\n+Functions
    \n+
    propertymap.hh File Reference
    \n \n
    \n-
    #include <type_traits>
    \n+
    #include <cstddef>
    \n+#include <iterator>
    \n+#include <type_traits>
    \n
    \n

    Go to the source code of this file.

    \n \n \n-\n-\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n \n

    \n Classes

    class  Dune::Std::default_accessor< Element >
     A type for indexed access to elements of mdspan. More...
    struct  Dune::PropertyMapTraits< PM >
     
    struct  Dune::ReadablePropertyMapTag
     Tag for the category of readable property maps. More...
     
    struct  Dune::WritablePropertyMapTag
     Tag for the category of writable property maps. More...
     
    struct  Dune::ReadWritePropertyMapTag
     Tag for the category of readable and writable property maps. More...
     
    struct  Dune::LvaluePropertyMapTag
     Tag for the category of lvalue property maps. More...
     
    struct  Dune::PropertyMapTraits< T * >
     
    struct  Dune::PropertyMapTraits< const T * >
     
    struct  Dune::RAPropertyMapHelper< Reference, PropertyMap >
     
    class  Dune::IteratorPropertyMap< RAI, IM, T, R >
     Adapter to turn a random access iterator into a property map. More...
     
    class  Dune::AssociativePropertyMap< T >
     An adapter to turn an unique associative container into a property map. More...
     
    class  Dune::ConstAssociativePropertyMap< T >
     An adaptor to turn an unique associative container into a property map. More...
     
    struct  Dune::IdentityMap
     A property map that applies the identity function to integers. More...
     
    struct  Dune::PropertyMapTypeSelector< T, C >
     Selector for the property map type. More...
     
    \n \n \n \n \n-\n-\n-\n+

    \n Namespaces

    namespace  Dune
     Dune namespace.
     
    namespace  Dune::Std
     Namespace for features backported from new C++ standards.
     
    \n+\n+\n+\n+\n+\n+\n+\n

    \n+Functions

    template<class Reference , class PropertyMap , class Key >
    Reference Dune::get (const RAPropertyMapHelper< Reference, PropertyMap > &pmap, const Key &key)
     
    template<class Reference , class PropertyMap , class Key , class Value >
    void Dune::put (const RAPropertyMapHelper< Reference, PropertyMap > &pmap, const Key &key, const Value &value)
     
    \n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,24 +1,65 @@\n dune-common\u00a02.10\n Loading...\n Searching...\n No Matches\n * _\bd_\bu_\bn_\be\n * _\bc_\bo_\bm_\bm_\bo_\bn\n- * _\bs_\bt_\bd\n-_\bC_\bl_\ba_\bs_\bs_\be_\bs | _\bN_\ba_\bm_\be_\bs_\bp_\ba_\bc_\be_\bs\n-default_accessor.hh File Reference\n+_\bC_\bl_\ba_\bs_\bs_\be_\bs | _\bN_\ba_\bm_\be_\bs_\bp_\ba_\bc_\be_\bs | _\bF_\bu_\bn_\bc_\bt_\bi_\bo_\bn_\bs\n+propertymap.hh File Reference\n+#include \n+#include \n #include \n _\bG_\bo_\b _\bt_\bo_\b _\bt_\bh_\be_\b _\bs_\bo_\bu_\br_\bc_\be_\b _\bc_\bo_\bd_\be_\b _\bo_\bf_\b _\bt_\bh_\bi_\bs_\b _\bf_\bi_\bl_\be_\b.\n C\bCl\bla\bas\bss\bse\bes\bs\n-class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bS_\bt_\bd_\b:_\b:_\bd_\be_\bf_\ba_\bu_\bl_\bt_\b__\ba_\bc_\bc_\be_\bs_\bs_\bo_\br_\b<_\b _\bE_\bl_\be_\bm_\be_\bn_\bt_\b _\b>\n-\u00a0 A type for indexed access to elements of mdspan. _\bM_\bo_\br_\be_\b._\b._\b.\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bP_\br_\bo_\bp_\be_\br_\bt_\by_\bM_\ba_\bp_\bT_\br_\ba_\bi_\bt_\bs_\b<_\b _\bP_\bM_\b _\b>\n+\u00a0\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bR_\be_\ba_\bd_\ba_\bb_\bl_\be_\bP_\br_\bo_\bp_\be_\br_\bt_\by_\bM_\ba_\bp_\bT_\ba_\bg\n+\u00a0 Tag for the category of readable property maps. _\bM_\bo_\br_\be_\b._\b._\b.\n+\u00a0\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bW_\br_\bi_\bt_\ba_\bb_\bl_\be_\bP_\br_\bo_\bp_\be_\br_\bt_\by_\bM_\ba_\bp_\bT_\ba_\bg\n+\u00a0 Tag for the category of writable property maps. _\bM_\bo_\br_\be_\b._\b._\b.\n+\u00a0\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bR_\be_\ba_\bd_\bW_\br_\bi_\bt_\be_\bP_\br_\bo_\bp_\be_\br_\bt_\by_\bM_\ba_\bp_\bT_\ba_\bg\n+\u00a0 Tag for the category of readable and writable property maps. _\bM_\bo_\br_\be_\b._\b._\b.\n+\u00a0\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bL_\bv_\ba_\bl_\bu_\be_\bP_\br_\bo_\bp_\be_\br_\bt_\by_\bM_\ba_\bp_\bT_\ba_\bg\n+\u00a0 Tag for the category of lvalue property maps. _\bM_\bo_\br_\be_\b._\b._\b.\n+\u00a0\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bP_\br_\bo_\bp_\be_\br_\bt_\by_\bM_\ba_\bp_\bT_\br_\ba_\bi_\bt_\bs_\b<_\b _\bT_\b _\b*_\b _\b>\n+\u00a0\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bP_\br_\bo_\bp_\be_\br_\bt_\by_\bM_\ba_\bp_\bT_\br_\ba_\bi_\bt_\bs_\b<_\b _\bc_\bo_\bn_\bs_\bt_\b _\bT_\b _\b*_\b _\b>\n+\u00a0\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bR_\bA_\bP_\br_\bo_\bp_\be_\br_\bt_\by_\bM_\ba_\bp_\bH_\be_\bl_\bp_\be_\br_\b<_\b _\bR_\be_\bf_\be_\br_\be_\bn_\bc_\be_\b,_\b _\bP_\br_\bo_\bp_\be_\br_\bt_\by_\bM_\ba_\bp_\b _\b>\n+\u00a0\n+ class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bP_\br_\bo_\bp_\be_\br_\bt_\by_\bM_\ba_\bp_\b<_\b _\bR_\bA_\bI_\b,_\b _\bI_\bM_\b,_\b _\bT_\b,_\b _\bR_\b _\b>\n+\u00a0 Adapter to turn a random access iterator into a property map. _\bM_\bo_\br_\be_\b._\b._\b.\n+\u00a0\n+ class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bs_\bs_\bo_\bc_\bi_\ba_\bt_\bi_\bv_\be_\bP_\br_\bo_\bp_\be_\br_\bt_\by_\bM_\ba_\bp_\b<_\b _\bT_\b _\b>\n+\u00a0 An adapter to turn an unique associative container into a property\n+ map. _\bM_\bo_\br_\be_\b._\b._\b.\n+\u00a0\n+ class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bn_\bs_\bt_\bA_\bs_\bs_\bo_\bc_\bi_\ba_\bt_\bi_\bv_\be_\bP_\br_\bo_\bp_\be_\br_\bt_\by_\bM_\ba_\bp_\b<_\b _\bT_\b _\b>\n+\u00a0 An adaptor to turn an unique associative container into a property\n+ map. _\bM_\bo_\br_\be_\b._\b._\b.\n+\u00a0\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bI_\bd_\be_\bn_\bt_\bi_\bt_\by_\bM_\ba_\bp\n+\u00a0 A property map that applies the identity function to integers. _\bM_\bo_\br_\be_\b._\b._\b.\n+\u00a0\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bP_\br_\bo_\bp_\be_\br_\bt_\by_\bM_\ba_\bp_\bT_\by_\bp_\be_\bS_\be_\bl_\be_\bc_\bt_\bo_\br_\b<_\b _\bT_\b,_\b _\bC_\b _\b>\n+\u00a0 Selector for the property map type. _\bM_\bo_\br_\be_\b._\b._\b.\n \u00a0\n N\bNa\bam\bme\bes\bsp\bpa\bac\bce\bes\bs\n namespace \u00a0 _\bD_\bu_\bn_\be\n \u00a0 _\bD_\bu_\bn_\be namespace.\n \u00a0\n-namespace \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bS_\bt_\bd\n-\u00a0 Namespace for features backported from new C++ standards.\n+F\bFu\bun\bnc\bct\bti\bio\bon\bns\bs\n+template\n+Reference\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bg_\be_\bt (const _\bR_\bA_\bP_\br_\bo_\bp_\be_\br_\bt_\by_\bM_\ba_\bp_\bH_\be_\bl_\bp_\be_\br< Reference, PropertyMap >\n+ &pmap, const Key &key)\n+\u00a0\n+template\n+ void\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bp_\bu_\bt (const _\bR_\bA_\bP_\br_\bo_\bp_\be_\br_\bt_\by_\bM_\ba_\bp_\bH_\be_\bl_\bp_\be_\br< Reference, PropertyMap >\n+ &pmap, const Key &key, const Value &value)\n \u00a0\n ===============================================================================\n Generated by\u00a0_\b[_\bd_\bo_\bx_\by_\bg_\be_\bn_\b] 1.9.8\n"}]}, {"source1": "./usr/share/doc/libdune-common-doc/doxygen/a00137_source.html", "source2": "./usr/share/doc/libdune-common-doc/doxygen/a00137_source.html", "unified_diff": "@@ -1,15 +1,15 @@\n \n \n \n \n \n \n \n-dune-common: default_accessor.hh Source File\n+dune-common: propertymap.hh Source File\n \n \n \n \n \n \n \n@@ -70,80 +70,311 @@\n
    \n \n \n \n \n \n \n
    \n-
    default_accessor.hh
    \n+
    propertymap.hh
    \n
    \n
    \n Go to the documentation of this file.
    1// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
    \n
    2// vi: set et ts=4 sw=2 sts=2:
    \n
    3// SPDX-FileCopyrightInfo: Copyright \u00a9 DUNE Project contributors, see file LICENSE.md in module root
    \n
    4// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception
    \n-
    5#ifndef DUNE_COMMON_STD_DEFAULT_ACCESSOR_HH
    \n-
    6#define DUNE_COMMON_STD_DEFAULT_ACCESSOR_HH
    \n+
    5#ifndef DUNE_PROPERTYMAP_HH
    \n+
    6#define DUNE_PROPERTYMAP_HH
    \n
    7
    \n-
    8#include <type_traits>
    \n-
    9
    \n-
    \n-
    10namespace Dune::Std {
    \n+
    8#include <cstddef>
    \n+
    9#include <iterator>
    \n+
    10#include <type_traits>
    \n
    11
    \n-
    22template <class Element>
    \n-
    \n-\n-
    24{
    \n-
    25public:
    \n-
    26 using element_type = Element;
    \n-\n-\n-\n-
    30
    \n-
    31public:
    \n-
    32 // [mdspan.accessor.default.overview]
    \n-
    34 constexpr default_accessor () noexcept = default;
    \n+
    12namespace Dune
    \n+
    13{
    \n+
    14
    \n+
    15 template<class PM>
    \n+
    \n+\n+
    17 {
    \n+
    21 typedef typename PM::KeyType KeyType;
    \n+
    25 typedef typename PM::ValueType ValueType;
    \n+
    29 typedef typename PM::Reference Reference;
    \n+
    33 typedef typename PM::Category Category;
    \n+
    34 };
    \n+
    \n
    35
    \n-
    37 template <class OtherElement,
    \n-
    38 std::enable_if_t<std::is_convertible_v<OtherElement(*)[], Element(*)[]>, int> = 0>
    \n-
    39 constexpr default_accessor (default_accessor<OtherElement>) noexcept {}
    \n-
    40
    \n-
    \n-
    42 constexpr reference access (data_handle_type p, std::size_t i) const noexcept
    \n-
    43 {
    \n-
    44 return p[i];
    \n-
    45 }
    \n-
    \n-
    46
    \n-
    \n-
    48 constexpr data_handle_type offset (data_handle_type p, std::size_t i) const noexcept
    \n-
    49 {
    \n-
    50 return p + i;
    \n-
    51 }
    \n-
    \n-
    52};
    \n-
    \n-
    53
    \n-
    54} // end namespace Dune::Std
    \n-
    \n-
    55
    \n-
    56#endif // DUNE_COMMON_STD_DEFAULT_ACCESSOR_HH
    \n-
    STL namespace.
    \n-
    Namespace for features backported from new C++ standards.
    Definition default_accessor.hh:10
    \n-
    A type for indexed access to elements of mdspan.
    Definition default_accessor.hh:24
    \n-
    element_type * data_handle_type
    Definition default_accessor.hh:27
    \n-
    element_type & reference
    Definition default_accessor.hh:28
    \n-
    Element element_type
    Definition default_accessor.hh:26
    \n-
    constexpr default_accessor() noexcept=default
    Default constructor.
    \n-
    constexpr reference access(data_handle_type p, std::size_t i) const noexcept
    Return a reference to the i'th element in the data range starting at p
    Definition default_accessor.hh:42
    \n-
    constexpr data_handle_type offset(data_handle_type p, std::size_t i) const noexcept
    Return a data handle to the i'th element in the data range starting at p
    Definition default_accessor.hh:48
    \n+
    \n+\n+
    38 {};
    \n+
    \n+
    39
    \n+
    \n+\n+
    42 {};
    \n+
    \n+
    43
    \n+
    \n+\n+\n+
    50 {};
    \n+
    \n+
    51
    \n+
    \n+\n+\n+
    57 {};
    \n+
    \n+
    58
    \n+
    59 template<class T>
    \n+
    \n+\n+
    61 {
    \n+
    62 typedef T ValueType;
    \n+\n+
    64 typedef std::ptrdiff_t KeyType;
    \n+\n+
    66 };
    \n+
    \n+
    67
    \n+
    68
    \n+
    69 template<class T>
    \n+
    \n+
    70 struct PropertyMapTraits<const T*>
    \n+
    71 {
    \n+
    72 typedef T ValueType;
    \n+
    73 typedef const ValueType& Reference;
    \n+
    74 typedef std::ptrdiff_t KeyType;
    \n+\n+
    76 };
    \n+
    \n+
    77
    \n+
    78 template<class Reference, class PropertyMap>
    \n+
    \n+\n+
    80 {};
    \n+
    \n+
    81
    \n+
    82 template<class Reference, class PropertyMap, class Key>
    \n+
    83 inline Reference
    \n+
    \n+\n+
    85 const Key& key)
    \n+
    86 {
    \n+
    87 return static_cast<const PropertyMap&>(pmap)[key];
    \n+
    88 }
    \n+
    \n+
    89
    \n+
    90 template<class Reference, class PropertyMap, class Key, class Value>
    \n+
    91 inline void
    \n+
    \n+\n+
    93 const Key& key, const Value& value)
    \n+
    94 {
    \n+
    95 static_assert(std::is_convertible<typename PropertyMap::Category,WritablePropertyMapTag>::value,
    \n+
    96 "WritablePropertyMapTag required!");
    \n+
    97 static_cast<const PropertyMap&>(pmap)[key] = value;
    \n+
    98 }
    \n+
    \n+
    99
    \n+
    103 template<class RAI, class IM,
    \n+
    104 class T = typename std::iterator_traits<RAI>::value_type,
    \n+
    105 class R = typename std::iterator_traits<RAI>::reference>
    \n+
    \n+\n+
    107 : public RAPropertyMapHelper<R,IteratorPropertyMap<RAI,IM,T,R> >
    \n+
    108 {
    \n+
    109 public:
    \n+\n+
    114
    \n+
    120 typedef IM IndexMap;
    \n+
    121
    \n+
    125 typedef typename IndexMap::KeyType KeyType;
    \n+
    126
    \n+
    130 typedef T ValueType;
    \n+
    131
    \n+
    135 typedef R Reference;
    \n+
    136
    \n+\n+
    141
    \n+
    \n+\n+
    150 const IndexMap& im=IndexMap())
    \n+
    151 : iter_(iter), indexMap_(im)
    \n+
    152 {}
    \n+
    \n+
    153
    \n+
    \n+\n+
    156 : iter_(), indexMap_()
    \n+
    157 {}
    \n+
    \n+
    158
    \n+
    \n+
    160 inline Reference operator[](KeyType key) const
    \n+
    161 {
    \n+
    162 return *(iter_ + get(indexMap_, key));
    \n+
    163 }
    \n+
    \n+
    164
    \n+
    165 private:
    \n+\n+
    169 IndexMap indexMap_;
    \n+
    170 };
    \n+
    \n+
    171
    \n+
    176 template<typename T>
    \n+
    \n+\n+
    178 : RAPropertyMapHelper<typename T::value_type::second_type&,
    \n+
    179 AssociativePropertyMap<T> >
    \n+
    180 {
    \n+
    184 typedef T UniqueAssociativeContainer;
    \n+
    185
    \n+
    189 typedef typename UniqueAssociativeContainer::value_type::first_type
    \n+
    190 KeyType;
    \n+
    191
    \n+
    195 typedef typename UniqueAssociativeContainer::value_type::second_type
    \n+
    196 ValueType;
    \n+
    197
    \n+
    201 typedef ValueType& Reference;
    \n+
    202
    \n+\n+
    207
    \n+\n+
    210 : map_(0)
    \n+
    211 {}
    \n+
    212
    \n+
    214 inline AssociativePropertyMap(UniqueAssociativeContainer& map)
    \n+
    215 : map_(&map)
    \n+
    216 {}
    \n+
    217
    \n+
    222 inline Reference operator[](KeyType key) const
    \n+
    223 {
    \n+
    224 return map_->find(key)->second;
    \n+
    225 }
    \n+
    226 private:
    \n+
    227 UniqueAssociativeContainer* map_;
    \n+
    228 };
    \n+
    \n+
    229
    \n+
    234 template<typename T>
    \n+
    \n+\n+
    236 : RAPropertyMapHelper<const typename T::value_type::second_type&,
    \n+
    237 ConstAssociativePropertyMap<T> >
    \n+
    238 {
    \n+
    242 typedef T UniqueAssociativeContainer;
    \n+
    243
    \n+
    247 typedef typename UniqueAssociativeContainer::value_type::first_type
    \n+
    248 KeyType;
    \n+
    249
    \n+
    253 typedef typename UniqueAssociativeContainer::value_type::second_type
    \n+
    254 ValueType;
    \n+
    255
    \n+
    259 typedef const ValueType& Reference;
    \n+
    260
    \n+\n+
    265
    \n+\n+
    268 : map_(0)
    \n+
    269 {}
    \n+
    270
    \n+
    272 inline ConstAssociativePropertyMap(const UniqueAssociativeContainer& map)
    \n+
    273 : map_(&map)
    \n+
    274 {}
    \n+
    275
    \n+
    280 inline Reference operator[](KeyType key) const
    \n+
    281 {
    \n+
    282 return map_->find(key)->second;
    \n+
    283 }
    \n+
    284 private:
    \n+
    285 const UniqueAssociativeContainer* map_;
    \n+
    286 };
    \n+
    \n+
    287
    \n+
    \n+\n+
    292 : public RAPropertyMapHelper<std::size_t, IdentityMap>
    \n+
    293 {
    \n+
    295 typedef std::size_t KeyType;
    \n+
    296
    \n+
    298 typedef std::size_t ValueType;
    \n+
    299
    \n+
    301 typedef std::size_t Reference;
    \n+
    302
    \n+\n+
    305
    \n+
    \n+
    306 inline ValueType operator[](const KeyType& key) const
    \n+
    307 {
    \n+
    308 return key;
    \n+
    309 }
    \n+
    \n+
    310 };
    \n+
    \n+
    311
    \n+
    312
    \n+
    318 template<typename T, typename C>
    \n+
    \n+\n+
    320 {
    \n+
    324 typedef T Tag;
    \n+
    329 typedef C Container;
    \n+
    330 };
    \n+
    \n+
    331
    \n+
    332}
    \n+
    333
    \n+
    334#endif
    \n+
    Dune namespace.
    Definition alignedallocator.hh:13
    \n+
    void put(const RAPropertyMapHelper< Reference, PropertyMap > &pmap, const Key &key, const Value &value)
    Definition propertymap.hh:92
    \n+
    constexpr auto get(std::integer_sequence< T, II... >, std::integral_constant< std::size_t, pos >={})
    Return the entry at position pos of the given sequence.
    Definition integersequence.hh:22
    \n+
    Definition propertymap.hh:17
    \n+
    PM::ValueType ValueType
    The type of the values of the property map.
    Definition propertymap.hh:25
    \n+
    PM::Category Category
    The category the property map belongs to.
    Definition propertymap.hh:33
    \n+
    PM::Reference Reference
    The type of the reference to the values.
    Definition propertymap.hh:29
    \n+
    PM::KeyType KeyType
    The type of the key of the property map.
    Definition propertymap.hh:21
    \n+
    Tag for the category of readable property maps.
    Definition propertymap.hh:38
    \n+
    Tag for the category of writable property maps.
    Definition propertymap.hh:42
    \n+
    Tag for the category of readable and writable property maps.
    Definition propertymap.hh:50
    \n+
    Tag for the category of lvalue property maps.
    Definition propertymap.hh:57
    \n+
    ValueType & Reference
    Definition propertymap.hh:63
    \n+
    std::ptrdiff_t KeyType
    Definition propertymap.hh:64
    \n+
    T ValueType
    Definition propertymap.hh:62
    \n+
    LvaluePropertyMapTag Category
    Definition propertymap.hh:65
    \n+
    std::ptrdiff_t KeyType
    Definition propertymap.hh:74
    \n+
    const ValueType & Reference
    Definition propertymap.hh:73
    \n+
    T ValueType
    Definition propertymap.hh:72
    \n+
    LvaluePropertyMapTag Category
    Definition propertymap.hh:75
    \n+
    Definition propertymap.hh:80
    \n+
    Adapter to turn a random access iterator into a property map.
    Definition propertymap.hh:108
    \n+
    IndexMap::KeyType KeyType
    The key type of the property map.
    Definition propertymap.hh:125
    \n+
    R Reference
    The reference type of the property map.
    Definition propertymap.hh:135
    \n+
    T ValueType
    The value type of the property map.
    Definition propertymap.hh:130
    \n+
    Reference operator[](KeyType key) const
    Access the a value by reference.
    Definition propertymap.hh:160
    \n+
    IteratorPropertyMap(RandomAccessIterator iter, const IndexMap &im=IndexMap())
    Constructor.
    Definition propertymap.hh:149
    \n+
    IteratorPropertyMap()
    Constructor.
    Definition propertymap.hh:155
    \n+
    IM IndexMap
    The type of the index map.
    Definition propertymap.hh:120
    \n+
    RAI RandomAccessIterator
    The type of the random access iterator.
    Definition propertymap.hh:113
    \n+
    LvaluePropertyMapTag Category
    The category of this property map.
    Definition propertymap.hh:140
    \n+
    An adapter to turn an unique associative container into a property map.
    Definition propertymap.hh:180
    \n+
    An adaptor to turn an unique associative container into a property map.
    Definition propertymap.hh:238
    \n+
    A property map that applies the identity function to integers.
    Definition propertymap.hh:293
    \n+
    std::size_t ValueType
    The value type of the map.
    Definition propertymap.hh:298
    \n+
    std::size_t KeyType
    The key type of the map.
    Definition propertymap.hh:295
    \n+
    ValueType operator[](const KeyType &key) const
    Definition propertymap.hh:306
    \n+
    std::size_t Reference
    The reference type of the map.
    Definition propertymap.hh:301
    \n+
    ReadablePropertyMapTag Category
    The category of the map.
    Definition propertymap.hh:304
    \n+
    Selector for the property map type.
    Definition propertymap.hh:320
    \n+
    T Tag
    the tag identifying the property.
    Definition propertymap.hh:324
    \n+
    C Container
    The container type to whose entries the properties are attached.
    Definition propertymap.hh:329
    \n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,86 +1,368 @@\n dune-common\u00a02.10\n Loading...\n Searching...\n No Matches\n * _\bd_\bu_\bn_\be\n * _\bc_\bo_\bm_\bm_\bo_\bn\n- * _\bs_\bt_\bd\n-default_accessor.hh\n+propertymap.hh\n _\bG_\bo_\b _\bt_\bo_\b _\bt_\bh_\be_\b _\bd_\bo_\bc_\bu_\bm_\be_\bn_\bt_\ba_\bt_\bi_\bo_\bn_\b _\bo_\bf_\b _\bt_\bh_\bi_\bs_\b _\bf_\bi_\bl_\be_\b.\n 1// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-\n 2// vi: set et ts=4 sw=2 sts=2:\n 3// SPDX-FileCopyrightInfo: Copyright \u00c2\u00a9 DUNE Project contributors, see file\n LICENSE.md in module root\n 4// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception\n-5#ifndef DUNE_COMMON_STD_DEFAULT_ACCESSOR_HH\n-6#define DUNE_COMMON_STD_DEFAULT_ACCESSOR_HH\n+5#ifndef DUNE_PROPERTYMAP_HH\n+6#define DUNE_PROPERTYMAP_HH\n 7\n-8#include \n-9\n-_\b1_\b0namespace _\bD_\bu_\bn_\be_\b:_\b:_\bS_\bt_\bd {\n+8#include \n+9#include \n+10#include \n 11\n-22template \n-_\b2_\b3class _\bd_\be_\bf_\ba_\bu_\bl_\bt_\b__\ba_\bc_\bc_\be_\bs_\bs_\bo_\br\n-24{\n-25public:\n-_\b2_\b6 using _\be_\bl_\be_\bm_\be_\bn_\bt_\b__\bt_\by_\bp_\be = Element;\n-_\b2_\b7 using _\bd_\ba_\bt_\ba_\b__\bh_\ba_\bn_\bd_\bl_\be_\b__\bt_\by_\bp_\be = _\be_\bl_\be_\bm_\be_\bn_\bt_\b__\bt_\by_\bp_\be*;\n-_\b2_\b8 using _\br_\be_\bf_\be_\br_\be_\bn_\bc_\be = _\be_\bl_\be_\bm_\be_\bn_\bt_\b__\bt_\by_\bp_\be&;\n-_\b2_\b9 using _\bo_\bf_\bf_\bs_\be_\bt_\b__\bp_\bo_\bl_\bi_\bc_\by = _\bd_\be_\bf_\ba_\bu_\bl_\bt_\b__\ba_\bc_\bc_\be_\bs_\bs_\bo_\br;\n-30\n-31public:\n-32 // [mdspan.accessor.default.overview]\n-_\b3_\b4 constexpr _\bd_\be_\bf_\ba_\bu_\bl_\bt_\b__\ba_\bc_\bc_\be_\bs_\bs_\bo_\br () noexcept = default;\n+12namespace _\bD_\bu_\bn_\be\n+13{\n+14\n+15 template\n+_\b1_\b6 struct _\bP_\br_\bo_\bp_\be_\br_\bt_\by_\bM_\ba_\bp_\bT_\br_\ba_\bi_\bt_\bs\n+17 {\n+_\b2_\b1 typedef typename PM::KeyType _\bK_\be_\by_\bT_\by_\bp_\be;\n+_\b2_\b5 typedef typename PM::ValueType _\bV_\ba_\bl_\bu_\be_\bT_\by_\bp_\be;\n+_\b2_\b9 typedef typename PM::Reference _\bR_\be_\bf_\be_\br_\be_\bn_\bc_\be;\n+_\b3_\b3 typedef typename PM::Category _\bC_\ba_\bt_\be_\bg_\bo_\br_\by;\n+34 };\n 35\n-37 template ,\n-int> = 0>\n-_\b3_\b9 constexpr _\bd_\be_\bf_\ba_\bu_\bl_\bt_\b__\ba_\bc_\bc_\be_\bs_\bs_\bo_\br (_\bd_\be_\bf_\ba_\bu_\bl_\bt_\b__\ba_\bc_\bc_\be_\bs_\bs_\bo_\br) noexcept {}\n-40\n-_\b4_\b2 constexpr _\br_\be_\bf_\be_\br_\be_\bn_\bc_\be _\ba_\bc_\bc_\be_\bs_\bs (_\bd_\ba_\bt_\ba_\b__\bh_\ba_\bn_\bd_\bl_\be_\b__\bt_\by_\bp_\be p, std::size_t i) const\n-noexcept\n-43 {\n-44 return p[i];\n-45 }\n-46\n-_\b4_\b8 constexpr _\bd_\ba_\bt_\ba_\b__\bh_\ba_\bn_\bd_\bl_\be_\b__\bt_\by_\bp_\be _\bo_\bf_\bf_\bs_\be_\bt (_\bd_\ba_\bt_\ba_\b__\bh_\ba_\bn_\bd_\bl_\be_\b__\bt_\by_\bp_\be p, std::size_t i) const\n-noexcept\n-49 {\n-50 return p + i;\n-51 }\n-52};\n-53\n-54} // end namespace Dune::Std\n-55\n-56#endif // DUNE_COMMON_STD_DEFAULT_ACCESSOR_HH\n-_\bs_\bt_\bd\n-STL namespace.\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bt_\bd\n-Namespace for features backported from new C++ standards.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn default_accessor.hh:10\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bt_\bd_\b:_\b:_\bd_\be_\bf_\ba_\bu_\bl_\bt_\b__\ba_\bc_\bc_\be_\bs_\bs_\bo_\br\n-A type for indexed access to elements of mdspan.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn default_accessor.hh:24\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bt_\bd_\b:_\b:_\bd_\be_\bf_\ba_\bu_\bl_\bt_\b__\ba_\bc_\bc_\be_\bs_\bs_\bo_\br_\b:_\b:_\bd_\ba_\bt_\ba_\b__\bh_\ba_\bn_\bd_\bl_\be_\b__\bt_\by_\bp_\be\n-element_type * data_handle_type\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn default_accessor.hh:27\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bt_\bd_\b:_\b:_\bd_\be_\bf_\ba_\bu_\bl_\bt_\b__\ba_\bc_\bc_\be_\bs_\bs_\bo_\br_\b:_\b:_\br_\be_\bf_\be_\br_\be_\bn_\bc_\be\n-element_type & reference\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn default_accessor.hh:28\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bt_\bd_\b:_\b:_\bd_\be_\bf_\ba_\bu_\bl_\bt_\b__\ba_\bc_\bc_\be_\bs_\bs_\bo_\br_\b:_\b:_\be_\bl_\be_\bm_\be_\bn_\bt_\b__\bt_\by_\bp_\be\n-Element element_type\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn default_accessor.hh:26\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bt_\bd_\b:_\b:_\bd_\be_\bf_\ba_\bu_\bl_\bt_\b__\ba_\bc_\bc_\be_\bs_\bs_\bo_\br_\b:_\b:_\bd_\be_\bf_\ba_\bu_\bl_\bt_\b__\ba_\bc_\bc_\be_\bs_\bs_\bo_\br\n-constexpr default_accessor() noexcept=default\n-Default constructor.\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bt_\bd_\b:_\b:_\bd_\be_\bf_\ba_\bu_\bl_\bt_\b__\ba_\bc_\bc_\be_\bs_\bs_\bo_\br_\b:_\b:_\ba_\bc_\bc_\be_\bs_\bs\n-constexpr reference access(data_handle_type p, std::size_t i) const noexcept\n-Return a reference to the i'th element in the data range starting at p\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn default_accessor.hh:42\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bt_\bd_\b:_\b:_\bd_\be_\bf_\ba_\bu_\bl_\bt_\b__\ba_\bc_\bc_\be_\bs_\bs_\bo_\br_\b:_\b:_\bo_\bf_\bf_\bs_\be_\bt\n-constexpr data_handle_type offset(data_handle_type p, std::size_t i) const\n-noexcept\n-Return a data handle to the i'th element in the data range starting at p\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn default_accessor.hh:48\n+_\b3_\b7 struct _\bR_\be_\ba_\bd_\ba_\bb_\bl_\be_\bP_\br_\bo_\bp_\be_\br_\bt_\by_\bM_\ba_\bp_\bT_\ba_\bg\n+38 {};\n+39\n+_\b4_\b1 struct _\bW_\br_\bi_\bt_\ba_\bb_\bl_\be_\bP_\br_\bo_\bp_\be_\br_\bt_\by_\bM_\ba_\bp_\bT_\ba_\bg\n+42 {};\n+43\n+_\b4_\b8 struct _\bR_\be_\ba_\bd_\bW_\br_\bi_\bt_\be_\bP_\br_\bo_\bp_\be_\br_\bt_\by_\bM_\ba_\bp_\bT_\ba_\bg\n+49 : public _\bR_\be_\ba_\bd_\ba_\bb_\bl_\be_\bP_\br_\bo_\bp_\be_\br_\bt_\by_\bM_\ba_\bp_\bT_\ba_\bg, public _\bW_\br_\bi_\bt_\ba_\bb_\bl_\be_\bP_\br_\bo_\bp_\be_\br_\bt_\by_\bM_\ba_\bp_\bT_\ba_\bg\n+50 {};\n+51\n+_\b5_\b5 struct _\bL_\bv_\ba_\bl_\bu_\be_\bP_\br_\bo_\bp_\be_\br_\bt_\by_\bM_\ba_\bp_\bT_\ba_\bg\n+56 : public _\bR_\be_\ba_\bd_\bW_\br_\bi_\bt_\be_\bP_\br_\bo_\bp_\be_\br_\bt_\by_\bM_\ba_\bp_\bT_\ba_\bg\n+57 {};\n+58\n+59 template\n+_\b6_\b0 struct _\bP_\br_\bo_\bp_\be_\br_\bt_\by_\bM_\ba_\bp_\bT_\br_\ba_\bi_\bt_\bs\n+61 {\n+_\b6_\b2 typedef T _\bV_\ba_\bl_\bu_\be_\bT_\by_\bp_\be;\n+_\b6_\b3 typedef _\bV_\ba_\bl_\bu_\be_\bT_\by_\bp_\be& _\bR_\be_\bf_\be_\br_\be_\bn_\bc_\be;\n+_\b6_\b4 typedef std::ptrdiff_t _\bK_\be_\by_\bT_\by_\bp_\be;\n+_\b6_\b5 typedef _\bL_\bv_\ba_\bl_\bu_\be_\bP_\br_\bo_\bp_\be_\br_\bt_\by_\bM_\ba_\bp_\bT_\ba_\bg _\bC_\ba_\bt_\be_\bg_\bo_\br_\by;\n+66 };\n+67\n+68\n+69 template\n+_\b7_\b0 struct _\bP_\br_\bo_\bp_\be_\br_\bt_\by_\bM_\ba_\bp_\bT_\br_\ba_\bi_\bt_\bs\n+71 {\n+_\b7_\b2 typedef T _\bV_\ba_\bl_\bu_\be_\bT_\by_\bp_\be;\n+_\b7_\b3 typedef const _\bV_\ba_\bl_\bu_\be_\bT_\by_\bp_\be& _\bR_\be_\bf_\be_\br_\be_\bn_\bc_\be;\n+_\b7_\b4 typedef std::ptrdiff_t _\bK_\be_\by_\bT_\by_\bp_\be;\n+_\b7_\b5 typedef _\bL_\bv_\ba_\bl_\bu_\be_\bP_\br_\bo_\bp_\be_\br_\bt_\by_\bM_\ba_\bp_\bT_\ba_\bg _\bC_\ba_\bt_\be_\bg_\bo_\br_\by;\n+76 };\n+77\n+78 template\n+_\b7_\b9 struct _\bR_\bA_\bP_\br_\bo_\bp_\be_\br_\bt_\by_\bM_\ba_\bp_\bH_\be_\bl_\bp_\be_\br\n+80 {};\n+81\n+82 template\n+83 inline Reference\n+_\b8_\b4 _\bg_\be_\bt(const _\bR_\bA_\bP_\br_\bo_\bp_\be_\br_\bt_\by_\bM_\ba_\bp_\bH_\be_\bl_\bp_\be_\br_\b<_\bR_\be_\bf_\be_\br_\be_\bn_\bc_\be_\b,_\bP_\br_\bo_\bp_\be_\br_\bt_\by_\bM_\ba_\bp_\b>& pmap,\n+85 const Key& key)\n+86 {\n+87 return static_cast(pmap)[key];\n+88 }\n+89\n+90 template\n+91 inline void\n+_\b9_\b2 _\bp_\bu_\bt(const _\bR_\bA_\bP_\br_\bo_\bp_\be_\br_\bt_\by_\bM_\ba_\bp_\bH_\be_\bl_\bp_\be_\br_\b<_\bR_\be_\bf_\be_\br_\be_\bn_\bc_\be_\b,_\bP_\br_\bo_\bp_\be_\br_\bt_\by_\bM_\ba_\bp_\b>& pmap,\n+93 const Key& key, const Value& value)\n+94 {\n+95 static_assert(std::is_convertible::value,\n+96 \"WritablePropertyMapTag required!\");\n+97 static_cast(pmap)[key] = value;\n+98 }\n+99\n+103 template::value_type,\n+105 class R = typename std::iterator_traits::reference>\n+_\b1_\b0_\b6 class _\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bP_\br_\bo_\bp_\be_\br_\bt_\by_\bM_\ba_\bp\n+107 : public _\bR_\bA_\bP_\br_\bo_\bp_\be_\br_\bt_\by_\bM_\ba_\bp_\bH_\be_\bl_\bp_\be_\br >\n+108 {\n+109 public:\n+_\b1_\b1_\b3 typedef RAI _\bR_\ba_\bn_\bd_\bo_\bm_\bA_\bc_\bc_\be_\bs_\bs_\bI_\bt_\be_\br_\ba_\bt_\bo_\br;\n+114\n+_\b1_\b2_\b0 typedef IM _\bI_\bn_\bd_\be_\bx_\bM_\ba_\bp;\n+121\n+_\b1_\b2_\b5 typedef typename IndexMap::KeyType _\bK_\be_\by_\bT_\by_\bp_\be;\n+126\n+_\b1_\b3_\b0 typedef T _\bV_\ba_\bl_\bu_\be_\bT_\by_\bp_\be;\n+131\n+_\b1_\b3_\b5 typedef R _\bR_\be_\bf_\be_\br_\be_\bn_\bc_\be;\n+136\n+_\b1_\b4_\b0 typedef _\bL_\bv_\ba_\bl_\bu_\be_\bP_\br_\bo_\bp_\be_\br_\bt_\by_\bM_\ba_\bp_\bT_\ba_\bg _\bC_\ba_\bt_\be_\bg_\bo_\br_\by;\n+141\n+_\b1_\b4_\b9 inline _\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bP_\br_\bo_\bp_\be_\br_\bt_\by_\bM_\ba_\bp(_\bR_\ba_\bn_\bd_\bo_\bm_\bA_\bc_\bc_\be_\bs_\bs_\bI_\bt_\be_\br_\ba_\bt_\bo_\br iter,\n+150 const _\bI_\bn_\bd_\be_\bx_\bM_\ba_\bp& im=_\bI_\bn_\bd_\be_\bx_\bM_\ba_\bp())\n+151 : iter_(iter), indexMap_(im)\n+152 {}\n+153\n+_\b1_\b5_\b5 inline _\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bP_\br_\bo_\bp_\be_\br_\bt_\by_\bM_\ba_\bp()\n+156 : iter_(), indexMap_()\n+157 {}\n+158\n+_\b1_\b6_\b0 inline _\bR_\be_\bf_\be_\br_\be_\bn_\bc_\be _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b[_\b](_\bK_\be_\by_\bT_\by_\bp_\be key) const\n+161 {\n+162 return *(iter_ + _\bg_\be_\bt(indexMap_, key));\n+163 }\n+164\n+165 private:\n+167 _\bR_\ba_\bn_\bd_\bo_\bm_\bA_\bc_\bc_\be_\bs_\bs_\bI_\bt_\be_\br_\ba_\bt_\bo_\br iter_;\n+169 _\bI_\bn_\bd_\be_\bx_\bM_\ba_\bp indexMap_;\n+170 };\n+171\n+176 template\n+_\b1_\b7_\b7 class _\bA_\bs_\bs_\bo_\bc_\bi_\ba_\bt_\bi_\bv_\be_\bP_\br_\bo_\bp_\be_\br_\bt_\by_\bM_\ba_\bp\n+178 : _\bR_\bA_\bP_\br_\bo_\bp_\be_\br_\bt_\by_\bM_\ba_\bp_\bH_\be_\bl_\bp_\be_\br >\n+180 {\n+184 typedef T UniqueAssociativeContainer;\n+185\n+189 typedef typename UniqueAssociativeContainer::value_type::first_type\n+190 KeyType;\n+191\n+195 typedef typename UniqueAssociativeContainer::value_type::second_type\n+196 ValueType;\n+197\n+201 typedef ValueType& Reference;\n+202\n+206 typedef _\bL_\bv_\ba_\bl_\bu_\be_\bP_\br_\bo_\bp_\be_\br_\bt_\by_\bM_\ba_\bp_\bT_\ba_\bg _\bC_\ba_\bt_\be_\bg_\bo_\br_\by;\n+207\n+209 inline _\bA_\bs_\bs_\bo_\bc_\bi_\ba_\bt_\bi_\bv_\be_\bP_\br_\bo_\bp_\be_\br_\bt_\by_\bM_\ba_\bp()\n+210 : map_(0)\n+211 {}\n+212\n+214 inline _\bA_\bs_\bs_\bo_\bc_\bi_\ba_\bt_\bi_\bv_\be_\bP_\br_\bo_\bp_\be_\br_\bt_\by_\bM_\ba_\bp(UniqueAssociativeContainer& map)\n+215 : map_(&map)\n+216 {}\n+217\n+222 inline Reference operator[](KeyType key) const\n+223 {\n+224 return map_->find(key)->second;\n+225 }\n+226 private:\n+227 UniqueAssociativeContainer* map_;\n+228 };\n+229\n+234 template\n+_\b2_\b3_\b5 class _\bC_\bo_\bn_\bs_\bt_\bA_\bs_\bs_\bo_\bc_\bi_\ba_\bt_\bi_\bv_\be_\bP_\br_\bo_\bp_\be_\br_\bt_\by_\bM_\ba_\bp\n+236 : _\bR_\bA_\bP_\br_\bo_\bp_\be_\br_\bt_\by_\bM_\ba_\bp_\bH_\be_\bl_\bp_\be_\br >\n+238 {\n+242 typedef T UniqueAssociativeContainer;\n+243\n+247 typedef typename UniqueAssociativeContainer::value_type::first_type\n+248 KeyType;\n+249\n+253 typedef typename UniqueAssociativeContainer::value_type::second_type\n+254 ValueType;\n+255\n+259 typedef const ValueType& Reference;\n+260\n+264 typedef _\bL_\bv_\ba_\bl_\bu_\be_\bP_\br_\bo_\bp_\be_\br_\bt_\by_\bM_\ba_\bp_\bT_\ba_\bg _\bC_\ba_\bt_\be_\bg_\bo_\br_\by;\n+265\n+267 inline _\bC_\bo_\bn_\bs_\bt_\bA_\bs_\bs_\bo_\bc_\bi_\ba_\bt_\bi_\bv_\be_\bP_\br_\bo_\bp_\be_\br_\bt_\by_\bM_\ba_\bp()\n+268 : map_(0)\n+269 {}\n+270\n+272 inline _\bC_\bo_\bn_\bs_\bt_\bA_\bs_\bs_\bo_\bc_\bi_\ba_\bt_\bi_\bv_\be_\bP_\br_\bo_\bp_\be_\br_\bt_\by_\bM_\ba_\bp(const UniqueAssociativeContainer& map)\n+273 : map_(&map)\n+274 {}\n+275\n+280 inline Reference operator[](KeyType key) const\n+281 {\n+282 return map_->find(key)->second;\n+283 }\n+284 private:\n+285 const UniqueAssociativeContainer* map_;\n+286 };\n+287\n+_\b2_\b9_\b1 struct _\bI_\bd_\be_\bn_\bt_\bi_\bt_\by_\bM_\ba_\bp\n+292 : public _\bR_\bA_\bP_\br_\bo_\bp_\be_\br_\bt_\by_\bM_\ba_\bp_\bH_\be_\bl_\bp_\be_\br\n+293 {\n+_\b2_\b9_\b5 typedef std::size_t _\bK_\be_\by_\bT_\by_\bp_\be;\n+296\n+_\b2_\b9_\b8 typedef std::size_t _\bV_\ba_\bl_\bu_\be_\bT_\by_\bp_\be;\n+299\n+_\b3_\b0_\b1 typedef std::size_t _\bR_\be_\bf_\be_\br_\be_\bn_\bc_\be;\n+302\n+_\b3_\b0_\b4 typedef _\bR_\be_\ba_\bd_\ba_\bb_\bl_\be_\bP_\br_\bo_\bp_\be_\br_\bt_\by_\bM_\ba_\bp_\bT_\ba_\bg _\bC_\ba_\bt_\be_\bg_\bo_\br_\by;\n+305\n+_\b3_\b0_\b6 inline _\bV_\ba_\bl_\bu_\be_\bT_\by_\bp_\be _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b[_\b](const _\bK_\be_\by_\bT_\by_\bp_\be& key) const\n+307 {\n+308 return key;\n+309 }\n+310 };\n+311\n+312\n+318 template\n+_\b3_\b1_\b9 struct _\bP_\br_\bo_\bp_\be_\br_\bt_\by_\bM_\ba_\bp_\bT_\by_\bp_\be_\bS_\be_\bl_\be_\bc_\bt_\bo_\br\n+320 {\n+_\b3_\b2_\b4 typedef T _\bT_\ba_\bg;\n+_\b3_\b2_\b9 typedef C _\bC_\bo_\bn_\bt_\ba_\bi_\bn_\be_\br;\n+330 };\n+331\n+332}\n+333\n+334#endif\n+_\bD_\bu_\bn_\be\n+Dune namespace.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn alignedallocator.hh:13\n+_\bD_\bu_\bn_\be_\b:_\b:_\bp_\bu_\bt\n+void put(const RAPropertyMapHelper< Reference, PropertyMap > &pmap, const Key\n+&key, const Value &value)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn propertymap.hh:92\n+_\bD_\bu_\bn_\be_\b:_\b:_\bg_\be_\bt\n+constexpr auto get(std::integer_sequence< T, II... >, std::integral_constant<\n+std::size_t, pos >={})\n+Return the entry at position pos of the given sequence.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn integersequence.hh:22\n+_\bD_\bu_\bn_\be_\b:_\b:_\bP_\br_\bo_\bp_\be_\br_\bt_\by_\bM_\ba_\bp_\bT_\br_\ba_\bi_\bt_\bs\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn propertymap.hh:17\n+_\bD_\bu_\bn_\be_\b:_\b:_\bP_\br_\bo_\bp_\be_\br_\bt_\by_\bM_\ba_\bp_\bT_\br_\ba_\bi_\bt_\bs_\b:_\b:_\bV_\ba_\bl_\bu_\be_\bT_\by_\bp_\be\n+PM::ValueType ValueType\n+The type of the values of the property map.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn propertymap.hh:25\n+_\bD_\bu_\bn_\be_\b:_\b:_\bP_\br_\bo_\bp_\be_\br_\bt_\by_\bM_\ba_\bp_\bT_\br_\ba_\bi_\bt_\bs_\b:_\b:_\bC_\ba_\bt_\be_\bg_\bo_\br_\by\n+PM::Category Category\n+The category the property map belongs to.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn propertymap.hh:33\n+_\bD_\bu_\bn_\be_\b:_\b:_\bP_\br_\bo_\bp_\be_\br_\bt_\by_\bM_\ba_\bp_\bT_\br_\ba_\bi_\bt_\bs_\b:_\b:_\bR_\be_\bf_\be_\br_\be_\bn_\bc_\be\n+PM::Reference Reference\n+The type of the reference to the values.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn propertymap.hh:29\n+_\bD_\bu_\bn_\be_\b:_\b:_\bP_\br_\bo_\bp_\be_\br_\bt_\by_\bM_\ba_\bp_\bT_\br_\ba_\bi_\bt_\bs_\b:_\b:_\bK_\be_\by_\bT_\by_\bp_\be\n+PM::KeyType KeyType\n+The type of the key of the property map.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn propertymap.hh:21\n+_\bD_\bu_\bn_\be_\b:_\b:_\bR_\be_\ba_\bd_\ba_\bb_\bl_\be_\bP_\br_\bo_\bp_\be_\br_\bt_\by_\bM_\ba_\bp_\bT_\ba_\bg\n+Tag for the category of readable property maps.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn propertymap.hh:38\n+_\bD_\bu_\bn_\be_\b:_\b:_\bW_\br_\bi_\bt_\ba_\bb_\bl_\be_\bP_\br_\bo_\bp_\be_\br_\bt_\by_\bM_\ba_\bp_\bT_\ba_\bg\n+Tag for the category of writable property maps.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn propertymap.hh:42\n+_\bD_\bu_\bn_\be_\b:_\b:_\bR_\be_\ba_\bd_\bW_\br_\bi_\bt_\be_\bP_\br_\bo_\bp_\be_\br_\bt_\by_\bM_\ba_\bp_\bT_\ba_\bg\n+Tag for the category of readable and writable property maps.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn propertymap.hh:50\n+_\bD_\bu_\bn_\be_\b:_\b:_\bL_\bv_\ba_\bl_\bu_\be_\bP_\br_\bo_\bp_\be_\br_\bt_\by_\bM_\ba_\bp_\bT_\ba_\bg\n+Tag for the category of lvalue property maps.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn propertymap.hh:57\n+_\bD_\bu_\bn_\be_\b:_\b:_\bP_\br_\bo_\bp_\be_\br_\bt_\by_\bM_\ba_\bp_\bT_\br_\ba_\bi_\bt_\bs_\b<_\b _\bT_\b _\b*_\b _\b>_\b:_\b:_\bR_\be_\bf_\be_\br_\be_\bn_\bc_\be\n+ValueType & Reference\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn propertymap.hh:63\n+_\bD_\bu_\bn_\be_\b:_\b:_\bP_\br_\bo_\bp_\be_\br_\bt_\by_\bM_\ba_\bp_\bT_\br_\ba_\bi_\bt_\bs_\b<_\b _\bT_\b _\b*_\b _\b>_\b:_\b:_\bK_\be_\by_\bT_\by_\bp_\be\n+std::ptrdiff_t KeyType\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn propertymap.hh:64\n+_\bD_\bu_\bn_\be_\b:_\b:_\bP_\br_\bo_\bp_\be_\br_\bt_\by_\bM_\ba_\bp_\bT_\br_\ba_\bi_\bt_\bs_\b<_\b _\bT_\b _\b*_\b _\b>_\b:_\b:_\bV_\ba_\bl_\bu_\be_\bT_\by_\bp_\be\n+T ValueType\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn propertymap.hh:62\n+_\bD_\bu_\bn_\be_\b:_\b:_\bP_\br_\bo_\bp_\be_\br_\bt_\by_\bM_\ba_\bp_\bT_\br_\ba_\bi_\bt_\bs_\b<_\b _\bT_\b _\b*_\b _\b>_\b:_\b:_\bC_\ba_\bt_\be_\bg_\bo_\br_\by\n+LvaluePropertyMapTag Category\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn propertymap.hh:65\n+_\bD_\bu_\bn_\be_\b:_\b:_\bP_\br_\bo_\bp_\be_\br_\bt_\by_\bM_\ba_\bp_\bT_\br_\ba_\bi_\bt_\bs_\b<_\b _\bc_\bo_\bn_\bs_\bt_\b _\bT_\b _\b*_\b _\b>_\b:_\b:_\bK_\be_\by_\bT_\by_\bp_\be\n+std::ptrdiff_t KeyType\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn propertymap.hh:74\n+_\bD_\bu_\bn_\be_\b:_\b:_\bP_\br_\bo_\bp_\be_\br_\bt_\by_\bM_\ba_\bp_\bT_\br_\ba_\bi_\bt_\bs_\b<_\b _\bc_\bo_\bn_\bs_\bt_\b _\bT_\b _\b*_\b _\b>_\b:_\b:_\bR_\be_\bf_\be_\br_\be_\bn_\bc_\be\n+const ValueType & Reference\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn propertymap.hh:73\n+_\bD_\bu_\bn_\be_\b:_\b:_\bP_\br_\bo_\bp_\be_\br_\bt_\by_\bM_\ba_\bp_\bT_\br_\ba_\bi_\bt_\bs_\b<_\b _\bc_\bo_\bn_\bs_\bt_\b _\bT_\b _\b*_\b _\b>_\b:_\b:_\bV_\ba_\bl_\bu_\be_\bT_\by_\bp_\be\n+T ValueType\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn propertymap.hh:72\n+_\bD_\bu_\bn_\be_\b:_\b:_\bP_\br_\bo_\bp_\be_\br_\bt_\by_\bM_\ba_\bp_\bT_\br_\ba_\bi_\bt_\bs_\b<_\b _\bc_\bo_\bn_\bs_\bt_\b _\bT_\b _\b*_\b _\b>_\b:_\b:_\bC_\ba_\bt_\be_\bg_\bo_\br_\by\n+LvaluePropertyMapTag Category\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn propertymap.hh:75\n+_\bD_\bu_\bn_\be_\b:_\b:_\bR_\bA_\bP_\br_\bo_\bp_\be_\br_\bt_\by_\bM_\ba_\bp_\bH_\be_\bl_\bp_\be_\br\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn propertymap.hh:80\n+_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bP_\br_\bo_\bp_\be_\br_\bt_\by_\bM_\ba_\bp\n+Adapter to turn a random access iterator into a property map.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn propertymap.hh:108\n+_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bP_\br_\bo_\bp_\be_\br_\bt_\by_\bM_\ba_\bp_\b:_\b:_\bK_\be_\by_\bT_\by_\bp_\be\n+IndexMap::KeyType KeyType\n+The key type of the property map.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn propertymap.hh:125\n+_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bP_\br_\bo_\bp_\be_\br_\bt_\by_\bM_\ba_\bp_\b:_\b:_\bR_\be_\bf_\be_\br_\be_\bn_\bc_\be\n+R Reference\n+The reference type of the property map.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn propertymap.hh:135\n+_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bP_\br_\bo_\bp_\be_\br_\bt_\by_\bM_\ba_\bp_\b:_\b:_\bV_\ba_\bl_\bu_\be_\bT_\by_\bp_\be\n+T ValueType\n+The value type of the property map.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn propertymap.hh:130\n+_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bP_\br_\bo_\bp_\be_\br_\bt_\by_\bM_\ba_\bp_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b[_\b]\n+Reference operator[](KeyType key) const\n+Access the a value by reference.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn propertymap.hh:160\n+_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bP_\br_\bo_\bp_\be_\br_\bt_\by_\bM_\ba_\bp_\b:_\b:_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bP_\br_\bo_\bp_\be_\br_\bt_\by_\bM_\ba_\bp\n+IteratorPropertyMap(RandomAccessIterator iter, const IndexMap &im=IndexMap())\n+Constructor.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn propertymap.hh:149\n+_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bP_\br_\bo_\bp_\be_\br_\bt_\by_\bM_\ba_\bp_\b:_\b:_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bP_\br_\bo_\bp_\be_\br_\bt_\by_\bM_\ba_\bp\n+IteratorPropertyMap()\n+Constructor.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn propertymap.hh:155\n+_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bP_\br_\bo_\bp_\be_\br_\bt_\by_\bM_\ba_\bp_\b:_\b:_\bI_\bn_\bd_\be_\bx_\bM_\ba_\bp\n+IM IndexMap\n+The type of the index map.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn propertymap.hh:120\n+_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bP_\br_\bo_\bp_\be_\br_\bt_\by_\bM_\ba_\bp_\b:_\b:_\bR_\ba_\bn_\bd_\bo_\bm_\bA_\bc_\bc_\be_\bs_\bs_\bI_\bt_\be_\br_\ba_\bt_\bo_\br\n+RAI RandomAccessIterator\n+The type of the random access iterator.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn propertymap.hh:113\n+_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bP_\br_\bo_\bp_\be_\br_\bt_\by_\bM_\ba_\bp_\b:_\b:_\bC_\ba_\bt_\be_\bg_\bo_\br_\by\n+LvaluePropertyMapTag Category\n+The category of this property map.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn propertymap.hh:140\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bs_\bs_\bo_\bc_\bi_\ba_\bt_\bi_\bv_\be_\bP_\br_\bo_\bp_\be_\br_\bt_\by_\bM_\ba_\bp\n+An adapter to turn an unique associative container into a property map.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn propertymap.hh:180\n+_\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bn_\bs_\bt_\bA_\bs_\bs_\bo_\bc_\bi_\ba_\bt_\bi_\bv_\be_\bP_\br_\bo_\bp_\be_\br_\bt_\by_\bM_\ba_\bp\n+An adaptor to turn an unique associative container into a property map.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn propertymap.hh:238\n+_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bd_\be_\bn_\bt_\bi_\bt_\by_\bM_\ba_\bp\n+A property map that applies the identity function to integers.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn propertymap.hh:293\n+_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bd_\be_\bn_\bt_\bi_\bt_\by_\bM_\ba_\bp_\b:_\b:_\bV_\ba_\bl_\bu_\be_\bT_\by_\bp_\be\n+std::size_t ValueType\n+The value type of the map.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn propertymap.hh:298\n+_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bd_\be_\bn_\bt_\bi_\bt_\by_\bM_\ba_\bp_\b:_\b:_\bK_\be_\by_\bT_\by_\bp_\be\n+std::size_t KeyType\n+The key type of the map.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn propertymap.hh:295\n+_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bd_\be_\bn_\bt_\bi_\bt_\by_\bM_\ba_\bp_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b[_\b]\n+ValueType operator[](const KeyType &key) const\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn propertymap.hh:306\n+_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bd_\be_\bn_\bt_\bi_\bt_\by_\bM_\ba_\bp_\b:_\b:_\bR_\be_\bf_\be_\br_\be_\bn_\bc_\be\n+std::size_t Reference\n+The reference type of the map.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn propertymap.hh:301\n+_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bd_\be_\bn_\bt_\bi_\bt_\by_\bM_\ba_\bp_\b:_\b:_\bC_\ba_\bt_\be_\bg_\bo_\br_\by\n+ReadablePropertyMapTag Category\n+The category of the map.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn propertymap.hh:304\n+_\bD_\bu_\bn_\be_\b:_\b:_\bP_\br_\bo_\bp_\be_\br_\bt_\by_\bM_\ba_\bp_\bT_\by_\bp_\be_\bS_\be_\bl_\be_\bc_\bt_\bo_\br\n+Selector for the property map type.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn propertymap.hh:320\n+_\bD_\bu_\bn_\be_\b:_\b:_\bP_\br_\bo_\bp_\be_\br_\bt_\by_\bM_\ba_\bp_\bT_\by_\bp_\be_\bS_\be_\bl_\be_\bc_\bt_\bo_\br_\b:_\b:_\bT_\ba_\bg\n+T Tag\n+the tag identifying the property.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn propertymap.hh:324\n+_\bD_\bu_\bn_\be_\b:_\b:_\bP_\br_\bo_\bp_\be_\br_\bt_\by_\bM_\ba_\bp_\bT_\by_\bp_\be_\bS_\be_\bl_\be_\bc_\bt_\bo_\br_\b:_\b:_\bC_\bo_\bn_\bt_\ba_\bi_\bn_\be_\br\n+C Container\n+The container type to whose entries the properties are attached.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn propertymap.hh:329\n ===============================================================================\n Generated by\u00a0_\b[_\bd_\bo_\bx_\by_\bg_\be_\bn_\b] 1.9.8\n"}]}, {"source1": "./usr/share/doc/libdune-common-doc/doxygen/a00140.html", "source2": "./usr/share/doc/libdune-common-doc/doxygen/a00140.html", "unified_diff": "@@ -1,15 +1,15 @@\n \n \n \n \n \n \n \n-dune-common: extents.hh File Reference\n+dune-common: bartonnackmanifcheck.hh File Reference\n \n \n \n \n \n \n \n@@ -65,57 +65,80 @@\n \n \n \n \n \n \n \n
    \n \n-
    extents.hh File Reference
    \n+Macros
    \n+
    bartonnackmanifcheck.hh File Reference
    \n \n
    \n-
    #include <array>
    \n-#include <cassert>
    \n-#include <limits>
    \n-#include <type_traits>
    \n-#include <dune/common/indices.hh>
    \n-#include <dune/common/std/span.hh>
    \n-#include <dune/common/std/impl/fwd_layouts.hh>
    \n+\n+

    Provides check for implementation of interface methods when using static polymorphism, i.e. the Barton-Nackman trick. This is purely for debugging purposes. To check the correct implementation of interface methods (and pick up possible infinite loops) NDEBUG must be undefined and DUNE_INTERFACECHECK has to be defined. \n+More...

    \n+\n

    Go to the source code of this file.

    \n \n-\n-\n-\n-\n-

    \n-Classes

    class  Dune::Std::extents< IndexType, exts >
     Multidimensional index space with dynamic and static extents. More...
     
    \n-\n-\n-\n-\n-\n-\n-\n-

    \n-Namespaces

    namespace  Dune
     Dune namespace.
     
    namespace  Dune::Std
     Namespace for features backported from new C++ standards.
     
    \n-\n-\n-\n-\n-\n+\n+\n+\n+\n+\n

    \n-Typedefs

    template<class IndexType , std::size_t R>
    using Dune::Std::dextents = typename Impl::DExtentsImpl< IndexType, std::make_integer_sequence< std::size_t, R > >::type
     Alias of extents of given rank R and purely dynamic extents. See [mdspan.extents.dextents].
     

    \n+Macros

    #define CHECK_INTERFACE_IMPLEMENTATION(dummy)
     
    #define CHECK_AND_CALL_INTERFACE_IMPLEMENTATION(__interface_method_to_call__)    (__interface_method_to_call__)
     
    \n+

    Detailed Description

    \n+

    Provides check for implementation of interface methods when using static polymorphism, i.e. the Barton-Nackman trick. This is purely for debugging purposes. To check the correct implementation of interface methods (and pick up possible infinite loops) NDEBUG must be undefined and DUNE_INTERFACECHECK has to be defined.

    \n+
    Author
    Robert Kloefkorn
    \n+

    Use by invoking CHECK_INTERFACE_IMPLEMENTATION(asImp().methodToCheck()) and for template methods double (CHECK_INTERFACE_IMPLEMENTATION((asImp().template methodToCheck<param> ())). If either NDEBUG is defined or DUNE_INTERFACECHECK is undefined the CHECK_INTERFACE_IMPLEMENTATION macro is empty.

    \n+

    Note: adding the interface check to a method will cause the implementation of the method to be called twice, so before use make sure that this will not cause problems e.g. if internal counters are updated.

    \n+

    Macro Definition Documentation

    \n+\n+

    ◆ CHECK_AND_CALL_INTERFACE_IMPLEMENTATION

    \n+\n+
    \n+
    \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+
    #define CHECK_AND_CALL_INTERFACE_IMPLEMENTATION( __interface_method_to_call__)    (__interface_method_to_call__)
    \n+
    \n+

    The macro CHECK_AND_CALL_INTERFACE_IMPLEMENTATION throws an exception, if the interface method is not implemented and just calls the method otherwise. If NDEBUG is defined no checking is done and the method is just called.

    \n+\n+
    \n+
    \n+\n+

    ◆ CHECK_INTERFACE_IMPLEMENTATION

    \n+\n+
    \n+
    \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+
    #define CHECK_INTERFACE_IMPLEMENTATION( dummy)
    \n+
    \n+\n+
    \n+
    \n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,37 +1,47 @@\n dune-common\u00a02.10\n Loading...\n Searching...\n No Matches\n * _\bd_\bu_\bn_\be\n * _\bc_\bo_\bm_\bm_\bo_\bn\n- * _\bs_\bt_\bd\n-_\bC_\bl_\ba_\bs_\bs_\be_\bs | _\bN_\ba_\bm_\be_\bs_\bp_\ba_\bc_\be_\bs | _\bT_\by_\bp_\be_\bd_\be_\bf_\bs\n-extents.hh File Reference\n-#include \n-#include \n-#include \n-#include \n-#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bi_\bn_\bd_\bi_\bc_\be_\bs_\b._\bh_\bh>\n-#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bs_\bt_\bd_\b/_\bs_\bp_\ba_\bn_\b._\bh_\bh>\n-#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bs_\bt_\bd_\b/_\bi_\bm_\bp_\bl_\b/_\bf_\bw_\bd_\b__\bl_\ba_\by_\bo_\bu_\bt_\bs_\b._\bh_\bh>\n+_\bM_\ba_\bc_\br_\bo_\bs\n+bartonnackmanifcheck.hh File Reference\n+Provides check for implementation of interface methods when using static\n+polymorphism, i.e. the Barton-Nackman trick. This is purely for debugging\n+purposes. To check the correct implementation of interface methods (and pick up\n+possible infinite loops) NDEBUG must be undefined and DUNE_INTERFACECHECK has\n+to be defined. _\bM_\bo_\br_\be_\b._\b._\b.\n+#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\be_\bx_\bc_\be_\bp_\bt_\bi_\bo_\bn_\bs_\b._\bh_\bh>\n _\bG_\bo_\b _\bt_\bo_\b _\bt_\bh_\be_\b _\bs_\bo_\bu_\br_\bc_\be_\b _\bc_\bo_\bd_\be_\b _\bo_\bf_\b _\bt_\bh_\bi_\bs_\b _\bf_\bi_\bl_\be_\b.\n-C\bCl\bla\bas\bss\bse\bes\bs\n-class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bS_\bt_\bd_\b:_\b:_\be_\bx_\bt_\be_\bn_\bt_\bs_\b<_\b _\bI_\bn_\bd_\be_\bx_\bT_\by_\bp_\be_\b,_\b _\be_\bx_\bt_\bs_\b _\b>\n-\u00a0 Multidimensional index space with dynamic and static extents. _\bM_\bo_\br_\be_\b._\b._\b.\n+M\bMa\bac\bcr\bro\bos\bs\n+#define\u00a0 _\bC_\bH_\bE_\bC_\bK_\b__\bI_\bN_\bT_\bE_\bR_\bF_\bA_\bC_\bE_\b__\bI_\bM_\bP_\bL_\bE_\bM_\bE_\bN_\bT_\bA_\bT_\bI_\bO_\bN(dummy)\n \u00a0\n-N\bNa\bam\bme\bes\bsp\bpa\bac\bce\bes\bs\n-namespace \u00a0 _\bD_\bu_\bn_\be\n-\u00a0 _\bD_\bu_\bn_\be namespace.\n-\u00a0\n-namespace \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bS_\bt_\bd\n-\u00a0 Namespace for features backported from new C++ standards.\n-\u00a0\n-T\bTy\byp\bpe\bed\bde\bef\bfs\bs\n-template\n-using\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bS_\bt_\bd_\b:_\b:_\bd_\be_\bx_\bt_\be_\bn_\bt_\bs = typename Impl::DExtentsImpl< IndexType, std::\n- make_integer_sequence< std::size_t, R > >::type\n-\u00a0 Alias of extents of given rank R and purely dynamic extents. See\n- [mdspan.extents.dextents].\n+#define\u00a0 _\bC_\bH_\bE_\bC_\bK_\b__\bA_\bN_\bD_\b__\bC_\bA_\bL_\bL_\b__\bI_\bN_\bT_\bE_\bR_\bF_\bA_\bC_\bE_\b__\bI_\bM_\bP_\bL_\bE_\bM_\bE_\bN_\bT_\bA_\bT_\bI_\bO_\bN\n+ (__interface_method_to_call__)\u00a0\u00a0\u00a0 (__interface_method_to_call__)\n \u00a0\n+*\b**\b**\b**\b**\b* D\bDe\bet\bta\bai\bil\ble\bed\bd D\bDe\bes\bsc\bcr\bri\bip\bpt\bti\bio\bon\bn *\b**\b**\b**\b**\b*\n+Provides check for implementation of interface methods when using static\n+polymorphism, i.e. the Barton-Nackman trick. This is purely for debugging\n+purposes. To check the correct implementation of interface methods (and pick up\n+possible infinite loops) NDEBUG must be undefined and DUNE_INTERFACECHECK has\n+to be defined.\n+ Author\n+ Robert Kloefkorn\n+Use by invoking CHECK_INTERFACE_IMPLEMENTATION(asImp().methodToCheck()) and for\n+template methods double (CHECK_INTERFACE_IMPLEMENTATION((asImp().template\n+methodToCheck ())). If either NDEBUG is defined or DUNE_INTERFACECHECK\n+is undefined the CHECK_INTERFACE_IMPLEMENTATION macro is empty.\n+Note: adding the interface check to a method will cause the implementation of\n+the method to be called twice, so before use make sure that this will not cause\n+problems e.g. if internal counters are updated.\n+*\b**\b**\b**\b**\b* M\bMa\bac\bcr\bro\bo D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn D\bDo\boc\bcu\bum\bme\ben\bnt\bta\bat\bti\bio\bon\bn *\b**\b**\b**\b**\b*\n+*\b**\b**\b**\b**\b* _\b?\b\u25c6_\b?\b\u00a0C\bCH\bHE\bEC\bCK\bK_\b_A\bAN\bND\bD_\b_C\bCA\bAL\bLL\bL_\b_I\bIN\bNT\bTE\bER\bRF\bFA\bAC\bCE\bE_\b_I\bIM\bMP\bPL\bLE\bEM\bME\bEN\bNT\bTA\bAT\bTI\bIO\bON\bN *\b**\b**\b**\b**\b*\n+#define ( \u00a0 __interface_method_to_call__ ) \u00a0\u00a0\u00a0\n+CHECK_AND_CALL_INTERFACE_IMPLEMENTATION (__interface_method_to_call__)\n+The macro CHECK_AND_CALL_INTERFACE_IMPLEMENTATION throws an exception, if the\n+interface method is not implemented and just calls the method otherwise. If\n+NDEBUG is defined no checking is done and the method is just called.\n+*\b**\b**\b**\b**\b* _\b?\b\u25c6_\b?\b\u00a0C\bCH\bHE\bEC\bCK\bK_\b_I\bIN\bNT\bTE\bER\bRF\bFA\bAC\bCE\bE_\b_I\bIM\bMP\bPL\bLE\bEM\bME\bEN\bNT\bTA\bAT\bTI\bIO\bON\bN *\b**\b**\b**\b**\b*\n+#define CHECK_INTERFACE_IMPLEMENTATION ( \u00a0 dummy )\n ===============================================================================\n Generated by\u00a0_\b[_\bd_\bo_\bx_\by_\bg_\be_\bn_\b] 1.9.8\n"}]}, {"source1": "./usr/share/doc/libdune-common-doc/doxygen/a00140_source.html", "source2": "./usr/share/doc/libdune-common-doc/doxygen/a00140_source.html", "unified_diff": "@@ -1,15 +1,15 @@\n \n \n \n \n \n \n \n-dune-common: extents.hh Source File\n+dune-common: bartonnackmanifcheck.hh Source File\n \n \n \n \n \n \n \n@@ -70,289 +70,66 @@\n
    \n \n \n \n \n \n \n
    \n-
    extents.hh
    \n+
    bartonnackmanifcheck.hh
    \n
    \n
    \n Go to the documentation of this file.
    1// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
    \n
    2// vi: set et ts=4 sw=2 sts=2:
    \n
    3// SPDX-FileCopyrightInfo: Copyright \u00a9 DUNE Project contributors, see file LICENSE.md in module root
    \n
    4// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception
    \n-
    5#ifndef DUNE_COMMON_STD_EXTENTS_HH
    \n-
    6#define DUNE_COMMON_STD_EXTENTS_HH
    \n-
    7
    \n-
    8#include <array>
    \n-
    9#include <cassert>
    \n-
    10#include <limits>
    \n-
    11#include <type_traits>
    \n-
    12#if __has_include(<version>)
    \n-
    13 #include <version>
    \n-
    14#endif
    \n-
    15
    \n-\n-\n-\n-
    19
    \n-
    20namespace Dune::Std {
    \n-
    21namespace Impl {
    \n-
    22
    \n-
    23template <class IndexType, std::size_t n>
    \n-
    24struct DynamicExtentsArray
    \n-
    25{
    \n-
    26 using type = std::array<IndexType,n>;
    \n-
    27};
    \n-
    28
    \n-
    29template <class IndexType>
    \n-
    30struct DynamicExtentsArray<IndexType,0>
    \n-
    31{
    \n-
    32 // empty type with minimal array-like interface
    \n-
    33 struct type {
    \n-
    34 IndexType operator[](std::size_t /*i*/) const { return 0; }
    \n-
    35 };
    \n-
    36};
    \n-
    37
    \n-
    38} // end namespace Impl
    \n-
    39
    \n-
    40
    \n-
    52template <class IndexType, std::size_t... exts>
    \n-
    \n-\n-
    54{
    \n-
    55 static_assert(std::is_integral_v<IndexType>);
    \n-
    56
    \n-
    57private:
    \n-
    58 static constexpr std::size_t rank_ = sizeof...(exts);
    \n-
    59 static constexpr std::size_t rank_dynamic_ = ((exts == Std::dynamic_extent) + ... + 0);
    \n-
    60
    \n-
    61 // this type is used internally to extract the static extents by index
    \n-
    62 using array_type = std::array<std::size_t,rank_>;
    \n-
    63
    \n-
    64 // store at position i how many extents in {exts[0],...,exts[i]} are dynamic_extent
    \n-
    65 static constexpr std::array<std::size_t,rank_+1> make_dynamic_index()
    \n-
    66 {
    \n-
    67 std::array<std::size_t,rank_+1> di{{}};
    \n-
    68 for (std::size_t i = 0; i < rank_; ++i)
    \n-
    69 di[i+1] = di[i] + (array_type{exts...}[i] == Std::dynamic_extent);
    \n-
    70 return di;
    \n-
    71 }
    \n-
    72
    \n-
    73 // An index mapping computed by `make_dynamic_index()` to get the position of a dynamic
    \n-
    74 // extent in {exts...} within the array dynamic_extents.
    \n-
    75 static constexpr std::array<std::size_t,rank_+1> dynamic_index_{make_dynamic_index()};
    \n-
    76
    \n-
    77public:
    \n-
    78 using rank_type = std::size_t;
    \n-
    79 using index_type = IndexType;
    \n-
    80 using size_type = std::make_unsigned_t<index_type>;
    \n-
    81
    \n-
    85
    \n-
    87 static constexpr rank_type rank () noexcept { return rank_; }
    \n-
    88
    \n-
    90 static constexpr rank_type rank_dynamic () noexcept { return rank_dynamic_; }
    \n-
    91
    \n-
    \n-
    93 static constexpr std::size_t static_extent (rank_type r) noexcept
    \n-
    94 {
    \n-
    95 assert(rank() > 0 && r < rank());
    \n-
    96 return array_type{exts...}[r];
    \n-
    97 }
    \n-
    \n-
    98
    \n-
    \n-
    100 constexpr index_type extent (rank_type r) const noexcept
    \n-
    101 {
    \n-
    102 assert(rank() > 0 && r < rank());
    \n-
    103 if (std::size_t e = static_extent(r); e != Std::dynamic_extent)
    \n-
    104 return index_type(e);
    \n-
    105 else
    \n-
    106 return dynamic_extents_[dynamic_index_[r]];
    \n-
    107 }
    \n-
    \n-
    108
    \n-
    110
    \n-
    111public:
    \n-
    114
    \n-
    116 constexpr extents () noexcept = default;
    \n-
    117
    \n-
    120 template <class... IndexTypes,
    \n-
    121 std::enable_if_t<(... && std::is_convertible_v<IndexTypes,index_type>), int> = 0,
    \n-
    122 std::enable_if_t<(sizeof...(IndexTypes) == rank() || sizeof...(IndexTypes) == rank_dynamic()), int> = 0,
    \n-
    123 std::enable_if_t<(... && std::is_nothrow_constructible_v<index_type, IndexTypes>), int> = 0>
    \n-
    \n-
    124 constexpr explicit extents (IndexTypes... e) noexcept
    \n-
    125 {
    \n-
    126 init_dynamic_extents<sizeof...(e)>(std::array<index_type,sizeof...(e)>{index_type(e)...});
    \n-
    127 }
    \n-
    \n-
    128
    \n-
    131 template <class I, std::size_t N,
    \n-
    132 std::enable_if_t<std::is_convertible_v<I, index_type>, int> = 0,
    \n-
    133 std::enable_if_t<(N == rank() || N == rank_dynamic()), int> = 0>
    \n-
    134 #if __cpp_conditional_explicit >= 201806L
    \n-
    135 explicit(N != rank_dynamic())
    \n-
    136 #endif
    \n-
    \n-
    137 constexpr extents (const std::array<I,N>& e) noexcept
    \n-
    138 {
    \n-
    139 init_dynamic_extents<N>(e);
    \n-
    140 }
    \n-
    \n-
    141
    \n-
    144 template <class I, std::size_t N,
    \n-
    145 std::enable_if_t<std::is_convertible_v<I, index_type>, int> = 0,
    \n-
    146 std::enable_if_t<(N == rank() || N == rank_dynamic()), int> = 0,
    \n-
    147 std::enable_if_t<std::is_nothrow_constructible_v<index_type, const I&>, int> = 0>
    \n-
    148 #if __cpp_conditional_explicit >= 201806L
    \n-
    149 explicit(N != rank_dynamic())
    \n-
    150 #endif
    \n-
    \n-
    151 constexpr extents (Std::span<I,N> e) noexcept
    \n-
    152 {
    \n-
    153 init_dynamic_extents<N>(e);
    \n-
    154 }
    \n-
    \n-
    155
    \n-
    156 template <class I, std::size_t... e,
    \n-
    157 std::enable_if_t<(sizeof...(e) == rank()), int> = 0,
    \n-
    158 std::enable_if_t<((e == Std::dynamic_extent || exts == Std::dynamic_extent || e == exts) &&...), int> = 0>
    \n-
    159 #if __cpp_conditional_explicit >= 201806L
    \n-
    160 explicit(
    \n-
    161 (( (exts != Std::dynamic_extent) && (e == Std::dynamic_extent)) || ... ) ||
    \n-
    162 (std::numeric_limits<index_type>::max() < std::numeric_limits<I>::max()))
    \n-
    163 #endif
    \n-
    \n-
    164 constexpr extents (const extents<I,e...>& other) noexcept
    \n-
    165 {
    \n-
    166 init_dynamic_extents<sizeof...(e)>(as_array(other));
    \n-
    167 }
    \n-
    \n-
    168
    \n-
    170
    \n-
    171
    \n-
    173 template <class OtherIndexType, std::size_t... otherExts>
    \n-
    \n-
    174 friend constexpr bool operator== (const extents& a, const extents<OtherIndexType, otherExts...>& b) noexcept
    \n-
    175 {
    \n-
    176 if (a.rank() != b.rank())
    \n-
    177 return false;
    \n-
    178 using I = std::common_type_t<index_type, OtherIndexType>;
    \n-
    179 for (rank_type i = 0; i < rank(); ++i)
    \n-
    180 if (I(a.extent(i)) != I(b.extent(i)))
    \n-
    181 return false;
    \n-
    182 return true;
    \n-
    183 }
    \n-
    \n-
    184
    \n-
    185private:
    \n-
    186#ifndef DOXYGEN
    \n-
    187 // The product of all extents
    \n-
    188 constexpr size_type product () const noexcept
    \n-
    189 {
    \n-
    190 size_type prod = 1;
    \n-
    191 for (rank_type i = 0; i < rank(); ++i)
    \n-
    192 prod *= extent(i);
    \n-
    193 return prod;
    \n-
    194 }
    \n-
    195
    \n-
    196 // A representation of all extents as an array
    \n-
    197 template <class OtherIndexType, std::size_t... otherExts>
    \n-
    198 static constexpr std::array<index_type,sizeof...(otherExts)>
    \n-
    199 as_array (const Std::extents<OtherIndexType,otherExts...>& e) noexcept
    \n-
    200 {
    \n-
    201 return unpackIntegerSequence([&](auto... ii) {
    \n-
    202 return std::array<index_type,sizeof...(otherExts)>{index_type(e.extent(ii))...}; },
    \n-
    203 std::make_index_sequence<sizeof...(otherExts)>{});
    \n-
    204 }
    \n-
    205
    \n-
    206 // Copy only the dynamic extents from the container `e` into the `dynamic_extents_` storage
    \n-
    207 template <std::size_t N, class Container>
    \n-
    208 constexpr void init_dynamic_extents (const Container& e) noexcept
    \n-
    209 {
    \n-
    210 if constexpr(rank_dynamic() > 0) {
    \n-
    211 if constexpr(N == rank_dynamic()) {
    \n-
    212 assert(e.size() == rank_dynamic());
    \n-
    213 for (rank_type i = 0; i < rank_dynamic(); ++i)
    \n-
    214 dynamic_extents_[i] = e[i];
    \n-
    215 } else {
    \n-
    216 assert(e.size() == rank());
    \n-
    217 for (rank_type i = 0, j = 0; i < rank(); ++i) {
    \n-\n-
    219 dynamic_extents_[j++] = e[i];
    \n-
    220 }
    \n-
    221 }
    \n-
    222 }
    \n-
    223 }
    \n-
    224#endif // DOXYGEN
    \n-
    225
    \n-
    226private:
    \n-
    227 using dynamic_extents_type = typename Impl::DynamicExtentsArray<index_type,rank_dynamic()>::type;
    \n-
    228 [[no_unique_address]] dynamic_extents_type dynamic_extents_;
    \n-
    229
    \n-
    230 template <class, std::size_t...> friend class extents;
    \n-
    231 friend struct layout_left;
    \n-
    232 friend struct layout_right;
    \n-
    233 friend struct layout_stride;
    \n-
    234};
    \n-
    \n-
    235
    \n-
    236
    \n-
    237namespace Impl {
    \n-
    238
    \n-
    239template <class IndexType, class Seq>
    \n-
    240struct DExtentsImpl;
    \n-
    241
    \n-
    242template <class IndexType, std::size_t... I>
    \n-
    243struct DExtentsImpl<IndexType, std::integer_sequence<std::size_t,I...>>
    \n-
    244{
    \n-
    245 template <std::size_t>
    \n-
    246 using dynamic = std::integral_constant<std::size_t,Std::dynamic_extent>;
    \n-\n-
    248};
    \n-
    249
    \n-
    250} // end namespace Impl
    \n-
    251
    \n-
    252
    \n-
    258template <class IndexType, std::size_t R>
    \n-
    259using dextents = typename Impl::DExtentsImpl<IndexType, std::make_integer_sequence<std::size_t,R>>::type;
    \n-
    260
    \n-
    261} // end namespace Dune::Std
    \n-
    262
    \n-
    263#endif // DUNE_COMMON_STD_EXTENTS_HH
    \n-\n-\n-\n-
    decltype(auto) constexpr unpackIntegerSequence(F &&f, std::integer_sequence< I, i... > sequence)
    Unpack an std::integer_sequence<I,i...> to std::integral_constant<I,i>...
    Definition indices.hh:124
    \n-
    typename Impl::DExtentsImpl< IndexType, std::make_integer_sequence< std::size_t, R > >::type dextents
    Alias of extents of given rank R and purely dynamic extents. See [mdspan.extents.dextents].
    Definition extents.hh:259
    \n-
    STL namespace.
    \n-
    Namespace for features backported from new C++ standards.
    Definition default_accessor.hh:10
    \n-
    constexpr std::size_t dynamic_extent
    A constant of type std::size_t that is used to differentiate std::span of static and dynamic extent.
    Definition span.hh:26
    \n-
    Multidimensional index space with dynamic and static extents.
    Definition extents.hh:54
    \n-
    static constexpr rank_type rank_dynamic() noexcept
    The number of dimensions with dynamic extent.
    Definition extents.hh:90
    \n-
    constexpr extents(const extents< I, e... > &other) noexcept
    Definition extents.hh:164
    \n-
    std::size_t rank_type
    Definition extents.hh:78
    \n-
    constexpr extents() noexcept=default
    The default constructor requires that all exts are not Std::dynamic_extent.
    \n-
    static constexpr rank_type rank() noexcept
    The total number of dimensions.
    Definition extents.hh:87
    \n-
    friend struct layout_stride
    Definition extents.hh:233
    \n-
    friend struct layout_left
    Definition extents.hh:231
    \n-
    friend struct layout_right
    Definition extents.hh:232
    \n-
    friend constexpr bool operator==(const extents &a, const extents< OtherIndexType, otherExts... > &b) noexcept
    Compare two extents by their rank and all individual extents.
    Definition extents.hh:174
    \n-
    std::make_unsigned_t< index_type > size_type
    Definition extents.hh:80
    \n-
    static constexpr std::size_t static_extent(rank_type r) noexcept
    Return the static extent of dimension r or Std::dynamic_extent
    Definition extents.hh:93
    \n-
    friend class extents
    Definition extents.hh:230
    \n-
    constexpr index_type extent(rank_type r) const noexcept
    Return the extent of dimension i
    Definition extents.hh:100
    \n-
    IndexType index_type
    Definition extents.hh:79
    \n-
    A contiguous sequence of elements with static or dynamic extent.
    Definition span.hh:126
    \n+
    24//- Dune includes
    \n+\n+
    26
    \n+
    27#ifdef CHECK_INTERFACE_IMPLEMENTATION
    \n+
    28#undef CHECK_INTERFACE_IMPLEMENTATION
    \n+
    29#endif
    \n+
    30#ifdef CHECK_AND_CALL_INTERFACE_IMPLEMENTATION
    \n+
    31#undef CHECK_AND_CALL_INTERFACE_IMPLEMENTATION
    \n+
    32#endif
    \n+
    33
    \n+
    34#if defined NDEBUG || !defined DUNE_INTERFACECHECK
    \n+
    35#define CHECK_INTERFACE_IMPLEMENTATION(dummy)
    \n+
    36#else
    \n+
    37#define CHECK_INTERFACE_IMPLEMENTATION(__interface_method_to_call__) \\
    \n+
    38 {\\
    \n+
    39 static bool call = false; \\
    \n+
    40 if( call == true ) \\
    \n+
    41 DUNE_THROW(NotImplemented,"Interface method not implemented!");\\
    \n+
    42 call = true; \\
    \n+
    43 try { \\
    \n+
    44 (__interface_method_to_call__); \\
    \n+
    45 call = false; \\
    \n+
    46 } \\
    \n+
    47 catch ( ... ) \\
    \n+
    48 { \\
    \n+
    49 call = false; \\
    \n+
    50 throw; \\
    \n+
    51 } \\
    \n+
    52 }
    \n+
    53#endif
    \n+
    54
    \n+
    60#if defined NDEBUG || !defined DUNE_INTERFACECHECK
    \n+
    \n+
    61#define CHECK_AND_CALL_INTERFACE_IMPLEMENTATION(__interface_method_to_call__) \\
    \n+
    62 (__interface_method_to_call__)
    \n+
    \n+
    63#else
    \n+
    64#define CHECK_AND_CALL_INTERFACE_IMPLEMENTATION(__interface_method_to_call__) \\
    \n+
    65 CHECK_INTERFACE_IMPLEMENTATION(__interface_method_to_call__)
    \n+
    66#endif
    \n+
    A few common exception classes.
    \n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,334 +1,57 @@\n dune-common\u00a02.10\n Loading...\n Searching...\n No Matches\n * _\bd_\bu_\bn_\be\n * _\bc_\bo_\bm_\bm_\bo_\bn\n- * _\bs_\bt_\bd\n-extents.hh\n+bartonnackmanifcheck.hh\n _\bG_\bo_\b _\bt_\bo_\b _\bt_\bh_\be_\b _\bd_\bo_\bc_\bu_\bm_\be_\bn_\bt_\ba_\bt_\bi_\bo_\bn_\b _\bo_\bf_\b _\bt_\bh_\bi_\bs_\b _\bf_\bi_\bl_\be_\b.\n 1// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-\n 2// vi: set et ts=4 sw=2 sts=2:\n 3// SPDX-FileCopyrightInfo: Copyright \u00c2\u00a9 DUNE Project contributors, see file\n LICENSE.md in module root\n 4// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception\n-5#ifndef DUNE_COMMON_STD_EXTENTS_HH\n-6#define DUNE_COMMON_STD_EXTENTS_HH\n-7\n-8#include \n-9#include \n-10#include \n-11#include \n-12#if __has_include()\n-13 #include \n-14#endif\n-15\n-16#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bi_\bn_\bd_\bi_\bc_\be_\bs_\b._\bh_\bh>\n-17#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bs_\bt_\bd_\b/_\bs_\bp_\ba_\bn_\b._\bh_\bh>\n-18#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bs_\bt_\bd_\b/_\bi_\bm_\bp_\bl_\b/_\bf_\bw_\bd_\b__\bl_\ba_\by_\bo_\bu_\bt_\bs_\b._\bh_\bh>\n-19\n-20namespace _\bD_\bu_\bn_\be_\b:_\b:_\bS_\bt_\bd {\n-21namespace Impl {\n-22\n-23template \n-24struct DynamicExtentsArray\n-25{\n-26 using type = std::array;\n-27};\n-28\n-29template \n-30struct DynamicExtentsArray\n-31{\n-32 // empty type with minimal array-like interface\n-33 struct type {\n-34 IndexType operator[](std::size_t /*i*/) const { return 0; }\n-35 };\n-36};\n-37\n-38} // end namespace Impl\n-39\n-40\n-52template \n-_\b5_\b3class _\be_\bx_\bt_\be_\bn_\bt_\bs\n-54{\n-55 static_assert(std::is_integral_v);\n-56\n-57private:\n-58 static constexpr std::size_t rank_ = sizeof...(exts);\n-59 static constexpr std::size_t rank_dynamic_ = ((exts == _\bS_\bt_\bd_\b:_\b:_\bd_\by_\bn_\ba_\bm_\bi_\bc_\b__\be_\bx_\bt_\be_\bn_\bt)\n-+ ... + 0);\n-60\n-61 // this type is used internally to extract the static extents by index\n-62 using array_type = std::array;\n-63\n-64 // store at position i how many extents in {exts[0],...,exts[i]} are\n-dynamic_extent\n-65 static constexpr std::array make_dynamic_index()\n-66 {\n-67 std::array di{{}};\n-68 for (std::size_t i = 0; i < rank_; ++i)\n-69 di[i+1] = di[i] + (array_type{exts...}[i] == _\bS_\bt_\bd_\b:_\b:_\bd_\by_\bn_\ba_\bm_\bi_\bc_\b__\be_\bx_\bt_\be_\bn_\bt);\n-70 return di;\n-71 }\n-72\n-73 // An index mapping computed by `make_dynamic_index()` to get the position\n-of a dynamic\n-74 // extent in {exts...} within the array dynamic_extents.\n-75 static constexpr std::array dynamic_index_\n-{make_dynamic_index()};\n-76\n-77public:\n-_\b7_\b8 using _\br_\ba_\bn_\bk_\b__\bt_\by_\bp_\be = std::size_t;\n-_\b7_\b9 using _\bi_\bn_\bd_\be_\bx_\b__\bt_\by_\bp_\be = IndexType;\n-_\b8_\b0 using _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be = std::make_unsigned_t;\n-81\n-85\n-_\b8_\b7 static constexpr _\br_\ba_\bn_\bk_\b__\bt_\by_\bp_\be _\br_\ba_\bn_\bk () noexcept { return rank_; }\n-88\n-_\b9_\b0 static constexpr _\br_\ba_\bn_\bk_\b__\bt_\by_\bp_\be _\br_\ba_\bn_\bk_\b__\bd_\by_\bn_\ba_\bm_\bi_\bc () noexcept { return rank_dynamic_;\n-}\n-91\n-_\b9_\b3 static constexpr std::size_t _\bs_\bt_\ba_\bt_\bi_\bc_\b__\be_\bx_\bt_\be_\bn_\bt (_\br_\ba_\bn_\bk_\b__\bt_\by_\bp_\be r) noexcept\n-94 {\n-95 assert(_\br_\ba_\bn_\bk() > 0 && r < _\br_\ba_\bn_\bk());\n-96 return array_type{exts...}[r];\n-97 }\n-98\n-_\b1_\b0_\b0 constexpr _\bi_\bn_\bd_\be_\bx_\b__\bt_\by_\bp_\be _\be_\bx_\bt_\be_\bn_\bt (_\br_\ba_\bn_\bk_\b__\bt_\by_\bp_\be r) const noexcept\n-101 {\n-102 assert(_\br_\ba_\bn_\bk() > 0 && r < _\br_\ba_\bn_\bk());\n-103 if (std::size_t e = _\bs_\bt_\ba_\bt_\bi_\bc_\b__\be_\bx_\bt_\be_\bn_\bt(r); e != _\bS_\bt_\bd_\b:_\b:_\bd_\by_\bn_\ba_\bm_\bi_\bc_\b__\be_\bx_\bt_\be_\bn_\bt)\n-104 return _\bi_\bn_\bd_\be_\bx_\b__\bt_\by_\bp_\be(e);\n-105 else\n-106 return dynamic_extents_[dynamic_index_[r]];\n-107 }\n-108\n-110\n-111public:\n-114\n-_\b1_\b1_\b6 constexpr _\be_\bx_\bt_\be_\bn_\bt_\bs () noexcept = default;\n-117\n-120 template ),\n-int> = 0,\n-122 _\bs_\bt_\bd::enable_if_t<(sizeof...(IndexTypes) == _\br_\ba_\bn_\bk() || sizeof...(IndexTypes)\n-== _\br_\ba_\bn_\bk_\b__\bd_\by_\bn_\ba_\bm_\bi_\bc()), int> = 0,\n-123 _\bs_\bt_\bd::enable_if_t<(... && _\bs_\bt_\bd::is_nothrow_constructible_v<_\bi_\bn_\bd_\be_\bx_\b__\bt_\by_\bp_\be,\n-IndexTypes>), int> = 0>\n-_\b1_\b2_\b4 constexpr explicit _\be_\bx_\bt_\be_\bn_\bt_\bs (IndexTypes... e) noexcept\n-125 {\n-126 init_dynamic_extents(std::array<_\bi_\bn_\bd_\be_\bx_\b__\bt_\by_\bp_\be,sizeof...(e)>\n-{_\bi_\bn_\bd_\be_\bx_\b__\bt_\by_\bp_\be(e)...});\n-127 }\n-128\n-131 template , int> = 0,\n-133 std::enable_if_t<(N == _\br_\ba_\bn_\bk() || N == _\br_\ba_\bn_\bk_\b__\bd_\by_\bn_\ba_\bm_\bi_\bc()), int> = 0>\n-134 #if __cpp_conditional_explicit >= 201806L\n-135 explicit(N != _\br_\ba_\bn_\bk_\b__\bd_\by_\bn_\ba_\bm_\bi_\bc())\n-136 #endif\n-_\b1_\b3_\b7 constexpr _\be_\bx_\bt_\be_\bn_\bt_\bs (const std::array& e) noexcept\n-138 {\n-139 init_dynamic_extents(e);\n-140 }\n-141\n-144 template , int> = 0,\n-146 std::enable_if_t<(N == _\br_\ba_\bn_\bk() || N == _\br_\ba_\bn_\bk_\b__\bd_\by_\bn_\ba_\bm_\bi_\bc()), int> = 0,\n-147 std::enable_if_t,\n-int> = 0>\n-148 #if __cpp_conditional_explicit >= 201806L\n-149 explicit(N != _\br_\ba_\bn_\bk_\b__\bd_\by_\bn_\ba_\bm_\bi_\bc())\n-150 #endif\n-_\b1_\b5_\b1 constexpr _\be_\bx_\bt_\be_\bn_\bt_\bs (_\bS_\bt_\bd_\b:_\b:_\bs_\bp_\ba_\bn_\b<_\bI_\b,_\bN_\b> e) noexcept\n-152 {\n-153 init_dynamic_extents(e);\n-154 }\n-155\n-156 template = 0,\n-158 std::enable_if_t<((e == _\bS_\bt_\bd_\b:_\b:_\bd_\by_\bn_\ba_\bm_\bi_\bc_\b__\be_\bx_\bt_\be_\bn_\bt || exts == _\bS_\bt_\bd_\b:_\b:_\bd_\by_\bn_\ba_\bm_\bi_\bc_\b__\be_\bx_\bt_\be_\bn_\bt\n-|| e == exts) &&...), int> = 0>\n-159 #if __cpp_conditional_explicit >= 201806L\n-160 explicit(\n-161 (( (exts != _\bS_\bt_\bd_\b:_\b:_\bd_\by_\bn_\ba_\bm_\bi_\bc_\b__\be_\bx_\bt_\be_\bn_\bt) && (e == _\bS_\bt_\bd_\b:_\b:_\bd_\by_\bn_\ba_\bm_\bi_\bc_\b__\be_\bx_\bt_\be_\bn_\bt)) || ... ) ||\n-162 (std::numeric_limits::max() < std::numeric_limits::max()))\n-163 #endif\n-_\b1_\b6_\b4 constexpr _\be_\bx_\bt_\be_\bn_\bt_\bs (const _\be_\bx_\bt_\be_\bn_\bt_\bs_\b<_\bI_\b,_\be_\b._\b._\b._\b>& other) noexcept\n-165 {\n-166 init_dynamic_extents(as_array(other));\n-167 }\n-168\n-170\n-171\n-173 template \n-_\b1_\b7_\b4 friend constexpr bool _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b=_\b=_\b (const _\be_\bx_\bt_\be_\bn_\bt_\bs& a, const\n-_\be_\bx_\bt_\be_\bn_\bt_\bs_\b<_\bO_\bt_\bh_\be_\br_\bI_\bn_\bd_\be_\bx_\bT_\by_\bp_\be_\b,_\b _\bo_\bt_\bh_\be_\br_\bE_\bx_\bt_\bs_\b._\b._\b._\b>& b) noexcept\n-175 {\n-176 if (a.rank() != b.rank())\n-177 return false;\n-178 using I = std::common_type_t;\n-179 for (_\br_\ba_\bn_\bk_\b__\bt_\by_\bp_\be i = 0; i < _\br_\ba_\bn_\bk(); ++i)\n-180 if (I(a.extent(i)) != I(b.extent(i)))\n-181 return false;\n-182 return true;\n-183 }\n-184\n-185private:\n-186#ifndef DOXYGEN\n-187 // The product of all extents\n-188 constexpr _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be product () const noexcept\n-189 {\n-190 _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be prod = 1;\n-191 for (_\br_\ba_\bn_\bk_\b__\bt_\by_\bp_\be i = 0; i < _\br_\ba_\bn_\bk(); ++i)\n-192 prod *= _\be_\bx_\bt_\be_\bn_\bt(i);\n-193 return prod;\n-194 }\n-195\n-196 // A representation of all extents as an array\n-197 template \n-198 static constexpr std::array<_\bi_\bn_\bd_\be_\bx_\b__\bt_\by_\bp_\be,sizeof...(otherExts)>\n-199 as_array (const _\bS_\bt_\bd_\b:_\b:_\be_\bx_\bt_\be_\bn_\bt_\bs_\b<_\bO_\bt_\bh_\be_\br_\bI_\bn_\bd_\be_\bx_\bT_\by_\bp_\be_\b,_\bo_\bt_\bh_\be_\br_\bE_\bx_\bt_\bs_\b._\b._\b._\b>& e) noexcept\n-200 {\n-201 return _\bu_\bn_\bp_\ba_\bc_\bk_\bI_\bn_\bt_\be_\bg_\be_\br_\bS_\be_\bq_\bu_\be_\bn_\bc_\be([&](auto... ii) {\n-202 return std::array<_\bi_\bn_\bd_\be_\bx_\b__\bt_\by_\bp_\be,sizeof...(otherExts)>{_\bi_\bn_\bd_\be_\bx_\b__\bt_\by_\bp_\be(e._\be_\bx_\bt_\be_\bn_\bt\n-(ii))...}; },\n-203 std::make_index_sequence{});\n-204 }\n-205\n-206 // Copy only the dynamic extents from the container `e` into the\n-`dynamic_extents_` storage\n-207 template \n-208 constexpr void init_dynamic_extents (const Container& e) noexcept\n-209 {\n-210 if constexpr(_\br_\ba_\bn_\bk_\b__\bd_\by_\bn_\ba_\bm_\bi_\bc() > 0) {\n-211 if constexpr(N == _\br_\ba_\bn_\bk_\b__\bd_\by_\bn_\ba_\bm_\bi_\bc()) {\n-212 assert(e.size() == _\br_\ba_\bn_\bk_\b__\bd_\by_\bn_\ba_\bm_\bi_\bc());\n-213 for (_\br_\ba_\bn_\bk_\b__\bt_\by_\bp_\be i = 0; i < _\br_\ba_\bn_\bk_\b__\bd_\by_\bn_\ba_\bm_\bi_\bc(); ++i)\n-214 dynamic_extents_[i] = e[i];\n-215 } else {\n-216 assert(e.size() == _\br_\ba_\bn_\bk());\n-217 for (_\br_\ba_\bn_\bk_\b__\bt_\by_\bp_\be i = 0, j = 0; i < _\br_\ba_\bn_\bk(); ++i) {\n-218 if (_\bs_\bt_\ba_\bt_\bi_\bc_\b__\be_\bx_\bt_\be_\bn_\bt(i) == _\bS_\bt_\bd_\b:_\b:_\bd_\by_\bn_\ba_\bm_\bi_\bc_\b__\be_\bx_\bt_\be_\bn_\bt)\n-219 dynamic_extents_[j++] = e[i];\n-220 }\n-221 }\n-222 }\n-223 }\n-224#endif // DOXYGEN\n-225\n-226private:\n-227 using dynamic_extents_type = typename Impl::\n-DynamicExtentsArray<_\bi_\bn_\bd_\be_\bx_\b__\bt_\by_\bp_\be,_\br_\ba_\bn_\bk_\b__\bd_\by_\bn_\ba_\bm_\bi_\bc()>::type;\n-228 [[no_unique_address]] dynamic_extents_type dynamic_extents_;\n-229\n-_\b2_\b3_\b0 template friend class _\be_\bx_\bt_\be_\bn_\bt_\bs;\n-_\b2_\b3_\b1 friend struct _\bl_\ba_\by_\bo_\bu_\bt_\b__\bl_\be_\bf_\bt;\n-_\b2_\b3_\b2 friend struct _\bl_\ba_\by_\bo_\bu_\bt_\b__\br_\bi_\bg_\bh_\bt;\n-_\b2_\b3_\b3 friend struct _\bl_\ba_\by_\bo_\bu_\bt_\b__\bs_\bt_\br_\bi_\bd_\be;\n-234};\n-235\n-236\n-237namespace Impl {\n-238\n-239template \n-240struct DExtentsImpl;\n-241\n-242template \n-243struct DExtentsImpl>\n-244{\n-245 template \n-246 using dynamic = std::integral_constant;\n-247 using type = _\bS_\bt_\bd_\b:_\b:_\be_\bx_\bt_\be_\bn_\bt_\bs_\b<_\bI_\bn_\bd_\be_\bx_\bT_\by_\bp_\be_\b,_\b _\bd_\by_\bn_\ba_\bm_\bi_\bc_\b<_\bI_\b>_\b:_\b:_\bv_\ba_\bl_\bu_\be...>;\n-248};\n-249\n-250} // end namespace Impl\n-251\n-252\n-258template \n-_\b2_\b5_\b9using _\bd_\be_\bx_\bt_\be_\bn_\bt_\bs = typename Impl::DExtentsImpl>::type;\n-260\n-261} // end namespace Dune::Std\n-262\n-263#endif // DUNE_COMMON_STD_EXTENTS_HH\n-_\bf_\bw_\bd_\b__\bl_\ba_\by_\bo_\bu_\bt_\bs_\b._\bh_\bh\n-_\bs_\bp_\ba_\bn_\b._\bh_\bh\n-_\bi_\bn_\bd_\bi_\bc_\be_\bs_\b._\bh_\bh\n-_\bD_\bu_\bn_\be_\b:_\b:_\bu_\bn_\bp_\ba_\bc_\bk_\bI_\bn_\bt_\be_\bg_\be_\br_\bS_\be_\bq_\bu_\be_\bn_\bc_\be\n-decltype(auto) constexpr unpackIntegerSequence(F &&f, std::integer_sequence< I,\n-i... > sequence)\n-Unpack an std::integer_sequence to std::integral_constant...\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn indices.hh:124\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bt_\bd_\b:_\b:_\bd_\be_\bx_\bt_\be_\bn_\bt_\bs\n-typename Impl::DExtentsImpl< IndexType, std::make_integer_sequence< std::\n-size_t, R > >::type dextents\n-Alias of extents of given rank R and purely dynamic extents. See\n-[mdspan.extents.dextents].\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn extents.hh:259\n-_\bs_\bt_\bd\n-STL namespace.\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bt_\bd\n-Namespace for features backported from new C++ standards.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn default_accessor.hh:10\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bt_\bd_\b:_\b:_\bd_\by_\bn_\ba_\bm_\bi_\bc_\b__\be_\bx_\bt_\be_\bn_\bt\n-constexpr std::size_t dynamic_extent\n-A constant of type std::size_t that is used to differentiate std::span of\n-static and dynamic extent.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn span.hh:26\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bt_\bd_\b:_\b:_\be_\bx_\bt_\be_\bn_\bt_\bs\n-Multidimensional index space with dynamic and static extents.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn extents.hh:54\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bt_\bd_\b:_\b:_\be_\bx_\bt_\be_\bn_\bt_\bs_\b:_\b:_\br_\ba_\bn_\bk_\b__\bd_\by_\bn_\ba_\bm_\bi_\bc\n-static constexpr rank_type rank_dynamic() noexcept\n-The number of dimensions with dynamic extent.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn extents.hh:90\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bt_\bd_\b:_\b:_\be_\bx_\bt_\be_\bn_\bt_\bs_\b:_\b:_\be_\bx_\bt_\be_\bn_\bt_\bs\n-constexpr extents(const extents< I, e... > &other) noexcept\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn extents.hh:164\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bt_\bd_\b:_\b:_\be_\bx_\bt_\be_\bn_\bt_\bs_\b:_\b:_\br_\ba_\bn_\bk_\b__\bt_\by_\bp_\be\n-std::size_t rank_type\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn extents.hh:78\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bt_\bd_\b:_\b:_\be_\bx_\bt_\be_\bn_\bt_\bs_\b:_\b:_\be_\bx_\bt_\be_\bn_\bt_\bs\n-constexpr extents() noexcept=default\n-The default constructor requires that all exts are not Std::dynamic_extent.\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bt_\bd_\b:_\b:_\be_\bx_\bt_\be_\bn_\bt_\bs_\b:_\b:_\br_\ba_\bn_\bk\n-static constexpr rank_type rank() noexcept\n-The total number of dimensions.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn extents.hh:87\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bt_\bd_\b:_\b:_\be_\bx_\bt_\be_\bn_\bt_\bs_\b:_\b:_\bl_\ba_\by_\bo_\bu_\bt_\b__\bs_\bt_\br_\bi_\bd_\be\n-friend struct layout_stride\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn extents.hh:233\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bt_\bd_\b:_\b:_\be_\bx_\bt_\be_\bn_\bt_\bs_\b:_\b:_\bl_\ba_\by_\bo_\bu_\bt_\b__\bl_\be_\bf_\bt\n-friend struct layout_left\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn extents.hh:231\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bt_\bd_\b:_\b:_\be_\bx_\bt_\be_\bn_\bt_\bs_\b:_\b:_\bl_\ba_\by_\bo_\bu_\bt_\b__\br_\bi_\bg_\bh_\bt\n-friend struct layout_right\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn extents.hh:232\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bt_\bd_\b:_\b:_\be_\bx_\bt_\be_\bn_\bt_\bs_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b=_\b=\n-friend constexpr bool operator==(const extents &a, const extents<\n-OtherIndexType, otherExts... > &b) noexcept\n-Compare two extents by their rank and all individual extents.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn extents.hh:174\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bt_\bd_\b:_\b:_\be_\bx_\bt_\be_\bn_\bt_\bs_\b:_\b:_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be\n-std::make_unsigned_t< index_type > size_type\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn extents.hh:80\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bt_\bd_\b:_\b:_\be_\bx_\bt_\be_\bn_\bt_\bs_\b:_\b:_\bs_\bt_\ba_\bt_\bi_\bc_\b__\be_\bx_\bt_\be_\bn_\bt\n-static constexpr std::size_t static_extent(rank_type r) noexcept\n-Return the static extent of dimension r or Std::dynamic_extent\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn extents.hh:93\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bt_\bd_\b:_\b:_\be_\bx_\bt_\be_\bn_\bt_\bs_\b:_\b:_\be_\bx_\bt_\be_\bn_\bt_\bs\n-friend class extents\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn extents.hh:230\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bt_\bd_\b:_\b:_\be_\bx_\bt_\be_\bn_\bt_\bs_\b:_\b:_\be_\bx_\bt_\be_\bn_\bt\n-constexpr index_type extent(rank_type r) const noexcept\n-Return the extent of dimension i\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn extents.hh:100\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bt_\bd_\b:_\b:_\be_\bx_\bt_\be_\bn_\bt_\bs_\b:_\b:_\bi_\bn_\bd_\be_\bx_\b__\bt_\by_\bp_\be\n-IndexType index_type\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn extents.hh:79\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bt_\bd_\b:_\b:_\bs_\bp_\ba_\bn\n-A contiguous sequence of elements with static or dynamic extent.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn span.hh:126\n+24//- Dune includes\n+25#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\be_\bx_\bc_\be_\bp_\bt_\bi_\bo_\bn_\bs_\b._\bh_\bh>\n+26\n+27#ifdef CHECK_INTERFACE_IMPLEMENTATION\n+28#undef CHECK_INTERFACE_IMPLEMENTATION\n+29#endif\n+30#ifdef CHECK_AND_CALL_INTERFACE_IMPLEMENTATION\n+31#undef CHECK_AND_CALL_INTERFACE_IMPLEMENTATION\n+32#endif\n+33\n+34#if defined NDEBUG || !defined DUNE_INTERFACECHECK\n+_\b3_\b5#define CHECK_INTERFACE_IMPLEMENTATION(dummy)\n+36#else\n+37#define CHECK_INTERFACE_IMPLEMENTATION(__interface_method_to_call__) \\\n+38 {\\\n+39 static bool call = false; \\\n+40 if( call == true ) \\\n+41 DUNE_THROW(NotImplemented,\"Interface method not implemented!\");\\\n+42 call = true; \\\n+43 try { \\\n+44 (__interface_method_to_call__); \\\n+45 call = false; \\\n+46 } \\\n+47 catch ( ... ) \\\n+48 { \\\n+49 call = false; \\\n+50 throw; \\\n+51 } \\\n+52 }\n+53#endif\n+54\n+60#if defined NDEBUG || !defined DUNE_INTERFACECHECK\n+_\b6_\b1#define CHECK_AND_CALL_INTERFACE_IMPLEMENTATION(__interface_method_to_call__)\n+\\\n+62 (__interface_method_to_call__)\n+63#else\n+64#define CHECK_AND_CALL_INTERFACE_IMPLEMENTATION(__interface_method_to_call__)\n+\\\n+65 CHECK_INTERFACE_IMPLEMENTATION(__interface_method_to_call__)\n+66#endif\n+_\be_\bx_\bc_\be_\bp_\bt_\bi_\bo_\bn_\bs_\b._\bh_\bh\n+A few common exception classes.\n ===============================================================================\n Generated by\u00a0_\b[_\bd_\bo_\bx_\by_\bg_\be_\bn_\b] 1.9.8\n"}]}, {"source1": "./usr/share/doc/libdune-common-doc/doxygen/a00143.html", "source2": "./usr/share/doc/libdune-common-doc/doxygen/a00143.html", "unified_diff": "@@ -1,15 +1,15 @@\n \n \n \n \n \n \n \n-dune-common: containerconstructiontraits.hh File Reference\n+dune-common: concepts.hh File Reference\n \n \n \n \n \n \n \n@@ -65,38 +65,23 @@\n \n \n \n \n \n \n \n
    \n- \n-
    containerconstructiontraits.hh File Reference
    \n+
    concepts.hh File Reference
    \n
    \n
    \n-
    #include <array>
    \n-#include <cassert>
    \n-#include <cstddef>
    \n-
    \n+\n

    Go to the source code of this file.

    \n-\n-\n-\n-\n-\n-\n-\n-\n-

    \n-Namespaces

    namespace  Dune
     Dune namespace.
     
    namespace  Dune::Std
     Namespace for features backported from new C++ standards.
     
    \n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,23 +1,10 @@\n dune-common\u00a02.10\n Loading...\n Searching...\n No Matches\n * _\bd_\bu_\bn_\be\n * _\bc_\bo_\bm_\bm_\bo_\bn\n- * _\bs_\bt_\bd\n- * _\bi_\bm_\bp_\bl\n-_\bN_\ba_\bm_\be_\bs_\bp_\ba_\bc_\be_\bs\n-containerconstructiontraits.hh File Reference\n-#include \n-#include \n-#include \n+concepts.hh File Reference\n _\bG_\bo_\b _\bt_\bo_\b _\bt_\bh_\be_\b _\bs_\bo_\bu_\br_\bc_\be_\b _\bc_\bo_\bd_\be_\b _\bo_\bf_\b _\bt_\bh_\bi_\bs_\b _\bf_\bi_\bl_\be_\b.\n-N\bNa\bam\bme\bes\bsp\bpa\bac\bce\bes\bs\n-namespace \u00a0 _\bD_\bu_\bn_\be\n-\u00a0 _\bD_\bu_\bn_\be namespace.\n-\u00a0\n-namespace \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bS_\bt_\bd\n-\u00a0 Namespace for features backported from new C++ standards.\n-\u00a0\n ===============================================================================\n Generated by\u00a0_\b[_\bd_\bo_\bx_\by_\bg_\be_\bn_\b] 1.9.8\n"}]}, {"source1": "./usr/share/doc/libdune-common-doc/doxygen/a00143_source.html", "source2": "./usr/share/doc/libdune-common-doc/doxygen/a00143_source.html", "unified_diff": "@@ -1,15 +1,15 @@\n \n \n \n \n \n \n \n-dune-common: containerconstructiontraits.hh Source File\n+dune-common: concepts.hh Source File\n \n \n \n \n \n \n \n@@ -70,81 +70,48 @@\n \n \n \n \n \n \n \n
    \n-
    containerconstructiontraits.hh
    \n+
    concepts.hh
    \n
    \n
    \n-Go to the documentation of this file.
    1// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
    \n-
    2// vi: set et ts=4 sw=2 sts=2:
    \n-
    3// SPDX-FileCopyrightInfo: Copyright \u00a9 DUNE Project contributors, see file LICENSE.md in module root
    \n-
    4// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception
    \n-
    5#ifndef DUNE_COMMON_STD_IMPL_CONTAINER_CONSTRUCTION_TRAITS_HH
    \n-
    6#define DUNE_COMMON_STD_IMPL_CONTAINER_CONSTRUCTION_TRAITS_HH
    \n+Go to the documentation of this file.
    1// SPDX-FileCopyrightText: Copyright \u00a9 DUNE Project contributors, see file LICENSE.md in module root
    \n+
    2// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception
    \n+
    3// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
    \n+
    4// vi: set et ts=4 sw=2 sts=2:
    \n+
    5#ifndef DUNE_COMMON_CONCEPTS_HH
    \n+
    6#define DUNE_COMMON_CONCEPTS_HH
    \n
    7
    \n-
    8#include <array>
    \n-
    9#include <cassert>
    \n-
    10#include <cstddef>
    \n-
    11
    \n-
    12namespace Dune::Std {
    \n-
    13namespace Impl {
    \n-
    14
    \n-
    20template <class Container>
    \n-
    21struct ContainerConstructionTraits
    \n-
    22{
    \n-
    23 using container_type = Container;
    \n-
    24 using value_type = typename container_type::value_type;
    \n-
    25
    \n-
    26 static constexpr container_type construct (std::size_t size)
    \n-
    27 {
    \n-
    28 return container_type(size);
    \n-
    29 }
    \n-
    30
    \n-
    31 static constexpr container_type construct (std::size_t size, value_type value)
    \n-
    32 {
    \n-
    33 return container_type(size, value);
    \n-
    34 }
    \n-
    35};
    \n-
    36
    \n-
    37template <class Value, std::size_t N>
    \n-
    38struct ContainerConstructionTraits<std::array<Value,N>>
    \n-
    39{
    \n-
    40 using container_type = std::array<Value,N>;
    \n-
    41 using value_type = typename container_type::value_type;
    \n-
    42
    \n-
    43 static constexpr container_type construct ([[maybe_unused]] std::size_t size)
    \n-
    44 {
    \n-
    45 assert(size <= N);
    \n-
    46 return container_type{};
    \n-
    47 }
    \n-
    48
    \n-
    49 static constexpr container_type construct ([[maybe_unused]] std::size_t size, value_type value)
    \n-
    50 {
    \n-
    51 assert(size <= N);
    \n-
    52 container_type c{};
    \n-
    53 for (auto& c_i : c)
    \n-
    54 c_i = value;
    \n-
    55 return c;
    \n-
    56 }
    \n-
    57};
    \n-
    58
    \n-
    59} // end namespace Impl
    \n-
    60} // end namespace Dune::Std
    \n-
    61
    \n-
    62#endif // DUNE_COMMON_STD_IMPL_CONTAINER_CONSTRUCTION_TRAITS_HH
    \n-
    STL namespace.
    \n-
    constexpr std::integral_constant< std::size_t, sizeof...(II)> size(std::integer_sequence< T, II... >)
    Return the size of the sequence.
    Definition integersequence.hh:75
    \n-
    Namespace for features backported from new C++ standards.
    Definition default_accessor.hh:10
    \n+
    8// check whether c++20 concept can be used
    \n+
    9#if __has_include(<version>) && __has_include(<concepts>)
    \n+
    10 #include <version>
    \n+
    11 #if __cpp_concepts >= 201907L && __cpp_lib_concepts >= 202002L
    \n+
    12 #ifndef DUNE_ENABLE_CONCEPTS
    \n+
    13 #define DUNE_ENABLE_CONCEPTS 1
    \n+
    14 #endif
    \n+
    15 #endif
    \n+
    16#endif
    \n+
    17
    \n+
    18#if DUNE_ENABLE_CONCEPTS
    \n+
    19
    \n+\n+\n+
    22
    \n+
    23#endif // DUNE_ENABLE_CONCEPTS
    \n+
    24
    \n+
    25#endif // DUNE_COMMON_CONCEPTS_HH
    \n+\n+\n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,83 +1,38 @@\n dune-common\u00a02.10\n Loading...\n Searching...\n No Matches\n * _\bd_\bu_\bn_\be\n * _\bc_\bo_\bm_\bm_\bo_\bn\n- * _\bs_\bt_\bd\n- * _\bi_\bm_\bp_\bl\n-containerconstructiontraits.hh\n+concepts.hh\n _\bG_\bo_\b _\bt_\bo_\b _\bt_\bh_\be_\b _\bd_\bo_\bc_\bu_\bm_\be_\bn_\bt_\ba_\bt_\bi_\bo_\bn_\b _\bo_\bf_\b _\bt_\bh_\bi_\bs_\b _\bf_\bi_\bl_\be_\b.\n-1// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-\n-2// vi: set et ts=4 sw=2 sts=2:\n-3// SPDX-FileCopyrightInfo: Copyright \u00c2\u00a9 DUNE Project contributors, see file\n+1// SPDX-FileCopyrightText: Copyright \u00c2\u00a9 DUNE Project contributors, see file\n LICENSE.md in module root\n-4// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception\n-5#ifndef DUNE_COMMON_STD_IMPL_CONTAINER_CONSTRUCTION_TRAITS_HH\n-6#define DUNE_COMMON_STD_IMPL_CONTAINER_CONSTRUCTION_TRAITS_HH\n+2// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception\n+3// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-\n+4// vi: set et ts=4 sw=2 sts=2:\n+5#ifndef DUNE_COMMON_CONCEPTS_HH\n+6#define DUNE_COMMON_CONCEPTS_HH\n 7\n-8#include \n-9#include \n-10#include \n-11\n-12namespace _\bD_\bu_\bn_\be_\b:_\b:_\bS_\bt_\bd {\n-13namespace Impl {\n-14\n-20template \n-21struct ContainerConstructionTraits\n-22{\n-23 using container_type = Container;\n-24 using value_type = typename container_type::value_type;\n-25\n-26 static constexpr container_type construct (std::size_t _\bs_\bi_\bz_\be)\n-27 {\n-28 return container_type(_\bs_\bi_\bz_\be);\n-29 }\n-30\n-31 static constexpr container_type construct (std::size_t _\bs_\bi_\bz_\be, value_type\n-value)\n-32 {\n-33 return container_type(_\bs_\bi_\bz_\be, value);\n-34 }\n-35};\n-36\n-37template \n-38struct ContainerConstructionTraits<_\bs_\bt_\bd::array>\n-39{\n-40 using container_type = std::array;\n-41 using value_type = typename container_type::value_type;\n-42\n-43 static constexpr container_type construct ([[maybe_unused]] std::size_t\n-_\bs_\bi_\bz_\be)\n-44 {\n-45 assert(_\bs_\bi_\bz_\be <= N);\n-46 return container_type{};\n-47 }\n-48\n-49 static constexpr container_type construct ([[maybe_unused]] std::size_t\n-_\bs_\bi_\bz_\be, value_type value)\n-50 {\n-51 assert(_\bs_\bi_\bz_\be <= N);\n-52 container_type c{};\n-53 for (auto& c_i : c)\n-54 c_i = value;\n-55 return c;\n-56 }\n-57};\n-58\n-59} // end namespace Impl\n-60} // end namespace Dune::Std\n-61\n-62#endif // DUNE_COMMON_STD_IMPL_CONTAINER_CONSTRUCTION_TRAITS_HH\n-_\bs_\bt_\bd\n-STL namespace.\n-_\bD_\bu_\bn_\be_\b:_\b:_\bs_\bi_\bz_\be\n-constexpr std::integral_constant< std::size_t, sizeof...(II)> size(std::\n-integer_sequence< T, II... >)\n-Return the size of the sequence.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn integersequence.hh:75\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bt_\bd\n-Namespace for features backported from new C++ standards.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn default_accessor.hh:10\n+8// check whether c++20 concept can be used\n+9#if __has_include() && __has_include()\n+10 #include \n+11 #if __cpp_concepts >= 201907L && __cpp_lib_concepts >= 202002L\n+12 #ifndef DUNE_ENABLE_CONCEPTS\n+13 #define DUNE_ENABLE_CONCEPTS 1\n+14 #endif\n+15 #endif\n+16#endif\n+17\n+18#if DUNE_ENABLE_CONCEPTS\n+19\n+20#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bc_\bo_\bn_\bc_\be_\bp_\bt_\bs_\b/_\bc_\bo_\bn_\bt_\ba_\bi_\bn_\be_\br_\b._\bh_\bh>\n+21#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bc_\bo_\bn_\bc_\be_\bp_\bt_\bs_\b/_\bh_\ba_\bs_\bh_\ba_\bb_\bl_\be_\b._\bh_\bh>\n+22\n+23#endif // DUNE_ENABLE_CONCEPTS\n+24\n+25#endif // DUNE_COMMON_CONCEPTS_HH\n+_\bc_\bo_\bn_\bt_\ba_\bi_\bn_\be_\br_\b._\bh_\bh\n+_\bh_\ba_\bs_\bh_\ba_\bb_\bl_\be_\b._\bh_\bh\n ===============================================================================\n Generated by\u00a0_\b[_\bd_\bo_\bx_\by_\bg_\be_\bn_\b] 1.9.8\n"}]}, {"source1": "./usr/share/doc/libdune-common-doc/doxygen/a00146.html", "source2": "./usr/share/doc/libdune-common-doc/doxygen/a00146.html", "unified_diff": "@@ -1,15 +1,15 @@\n \n \n \n \n \n \n \n-dune-common: fwd_layouts.hh File Reference\n+dune-common: densematrix.hh File Reference\n \n \n \n \n \n \n \n@@ -65,48 +65,78 @@\n
    \n \n \n \n \n \n \n
    \n \n-
    fwd_layouts.hh File Reference
    \n+Namespaces |\n+Functions
    \n+
    densematrix.hh File Reference
    \n \n
    \n \n+

    Implements a matrix constructed from a given type representing a field and a compile-time given number of rows and columns. \n+More...

    \n+
    #include <cmath>
    \n+#include <cstddef>
    \n+#include <iostream>
    \n+#include <type_traits>
    \n+#include <utility>
    \n+#include <vector>
    \n+#include <dune/common/boundschecking.hh>
    \n+#include <dune/common/classname.hh>
    \n+#include <dune/common/exceptions.hh>
    \n+#include <dune/common/fvector.hh>
    \n+#include <dune/common/math.hh>
    \n+#include <dune/common/precision.hh>
    \n+#include <dune/common/simd/simd.hh>
    \n+#include <dune/common/typetraits.hh>
    \n+#include <dune/common/scalarvectorview.hh>
    \n+
    \n

    Go to the source code of this file.

    \n \n \n-\n-\n+\n \n-\n-\n+\n+\n \n-\n-\n+\n+\n \n

    \n Classes

    struct  Dune::Std::layout_left
     A layout where the leftmost extent has stride 1. More...
    struct  Dune::FieldTraits< DenseMatrix< M > >
     
    struct  Dune::Std::layout_right
     A layout where the rightmost extent has stride 1, and strides increase right-to-left as the product of extents. More...
    class  Dune::FMatrixError
     Error thrown if operations of a FieldMatrix fail. More...
     
    struct  Dune::Std::layout_stride
     A layout mapping where the strides are user-defined. More...
    class  Dune::DenseMatrix< MAT >
     A dense n x m matrix. More...
     
    \n \n \n \n \n-\n-\n+\n \n+

    \n Namespaces

    namespace  Dune
     Dune namespace.
     
    namespace  Dune::Std
     Namespace for features backported from new C++ standards.
    namespace  Dune::DenseMatrixHelp
     
    \n+\n+\n+\n+\n+\n+\n+\n+\n+\n

    \n+Functions

    template<typename MAT , typename V1 , typename V2 >
    static void Dune::DenseMatrixHelp::multAssign (const DenseMatrix< MAT > &matrix, const DenseVector< V1 > &x, DenseVector< V2 > &ret)
     calculates ret = matrix * x
     
    template<typename MAT >
    std::ostream & Dune::operator<< (std::ostream &s, const DenseMatrix< MAT > &a)
     Sends the matrix to an output stream.
     
    \n-
    \n+

    Detailed Description

    \n+

    Implements a matrix constructed from a given type representing a field and a compile-time given number of rows and columns.

    \n+
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,31 +1,57 @@\n dune-common\u00a02.10\n Loading...\n Searching...\n No Matches\n * _\bd_\bu_\bn_\be\n * _\bc_\bo_\bm_\bm_\bo_\bn\n- * _\bs_\bt_\bd\n- * _\bi_\bm_\bp_\bl\n-_\bC_\bl_\ba_\bs_\bs_\be_\bs | _\bN_\ba_\bm_\be_\bs_\bp_\ba_\bc_\be_\bs\n-fwd_layouts.hh File Reference\n+_\bC_\bl_\ba_\bs_\bs_\be_\bs | _\bN_\ba_\bm_\be_\bs_\bp_\ba_\bc_\be_\bs | _\bF_\bu_\bn_\bc_\bt_\bi_\bo_\bn_\bs\n+densematrix.hh File Reference\n+_\bC_\bo_\bm_\bm_\bo_\bn \u00bb _\bD_\be_\bn_\bs_\be_\b _\bM_\ba_\bt_\br_\bi_\bx_\b _\ba_\bn_\bd_\b _\bV_\be_\bc_\bt_\bo_\br_\b _\bT_\be_\bm_\bp_\bl_\ba_\bt_\be_\b _\bL_\bi_\bb_\br_\ba_\br_\by\n+Implements a matrix constructed from a given type representing a field and a\n+compile-time given number of rows and columns. _\bM_\bo_\br_\be_\b._\b._\b.\n+#include \n+#include \n+#include \n+#include \n+#include \n+#include \n+#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bb_\bo_\bu_\bn_\bd_\bs_\bc_\bh_\be_\bc_\bk_\bi_\bn_\bg_\b._\bh_\bh>\n+#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bc_\bl_\ba_\bs_\bs_\bn_\ba_\bm_\be_\b._\bh_\bh>\n+#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\be_\bx_\bc_\be_\bp_\bt_\bi_\bo_\bn_\bs_\b._\bh_\bh>\n+#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bf_\bv_\be_\bc_\bt_\bo_\br_\b._\bh_\bh>\n+#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bm_\ba_\bt_\bh_\b._\bh_\bh>\n+#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bp_\br_\be_\bc_\bi_\bs_\bi_\bo_\bn_\b._\bh_\bh>\n+#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bs_\bi_\bm_\bd_\b/_\bs_\bi_\bm_\bd_\b._\bh_\bh>\n+#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bt_\by_\bp_\be_\bt_\br_\ba_\bi_\bt_\bs_\b._\bh_\bh>\n+#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bs_\bc_\ba_\bl_\ba_\br_\bv_\be_\bc_\bt_\bo_\br_\bv_\bi_\be_\bw_\b._\bh_\bh>\n _\bG_\bo_\b _\bt_\bo_\b _\bt_\bh_\be_\b _\bs_\bo_\bu_\br_\bc_\be_\b _\bc_\bo_\bd_\be_\b _\bo_\bf_\b _\bt_\bh_\bi_\bs_\b _\bf_\bi_\bl_\be_\b.\n C\bCl\bla\bas\bss\bse\bes\bs\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bS_\bt_\bd_\b:_\b:_\bl_\ba_\by_\bo_\bu_\bt_\b__\bl_\be_\bf_\bt\n-\u00a0 A layout where the leftmost extent has stride 1. _\bM_\bo_\br_\be_\b._\b._\b.\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bF_\bi_\be_\bl_\bd_\bT_\br_\ba_\bi_\bt_\bs_\b<_\b _\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bM_\b _\b>_\b _\b>\n \u00a0\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bS_\bt_\bd_\b:_\b:_\bl_\ba_\by_\bo_\bu_\bt_\b__\br_\bi_\bg_\bh_\bt\n-\u00a0 A layout where the rightmost extent has stride 1, and strides increase\n- right-to-left as the product of extents. _\bM_\bo_\br_\be_\b._\b._\b.\n+ class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bF_\bM_\ba_\bt_\br_\bi_\bx_\bE_\br_\br_\bo_\br\n+\u00a0 Error thrown if operations of a _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx fail. _\bM_\bo_\br_\be_\b._\b._\b.\n \u00a0\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bS_\bt_\bd_\b:_\b:_\bl_\ba_\by_\bo_\bu_\bt_\b__\bs_\bt_\br_\bi_\bd_\be\n-\u00a0 A layout mapping where the strides are user-defined. _\bM_\bo_\br_\be_\b._\b._\b.\n+ class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bM_\bA_\bT_\b _\b>\n+\u00a0 A dense n x m matrix. _\bM_\bo_\br_\be_\b._\b._\b.\n \u00a0\n N\bNa\bam\bme\bes\bsp\bpa\bac\bce\bes\bs\n namespace \u00a0 _\bD_\bu_\bn_\be\n \u00a0 _\bD_\bu_\bn_\be namespace.\n \u00a0\n-namespace \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bS_\bt_\bd\n-\u00a0 Namespace for features backported from new C++ standards.\n+namespace \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\bH_\be_\bl_\bp\n \u00a0\n+F\bFu\bun\bnc\bct\bti\bio\bon\bns\bs\n+template\n+ static void\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\bH_\be_\bl_\bp_\b:_\b:_\bm_\bu_\bl_\bt_\bA_\bs_\bs_\bi_\bg_\bn (const _\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx< MAT >\n+ &matrix, const _\bD_\be_\bn_\bs_\be_\bV_\be_\bc_\bt_\bo_\br< V1 > &x, _\bD_\be_\bn_\bs_\be_\bV_\be_\bc_\bt_\bo_\br< V2 > &ret)\n+\u00a0 calculates ret = matrix * x\n+\u00a0\n+template\n+std::ostream &\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b<_\b< (std::ostream &s, const _\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx< MAT > &a)\n+\u00a0 Sends the matrix to an output stream.\n+\u00a0\n+*\b**\b**\b**\b**\b* D\bDe\bet\bta\bai\bil\ble\bed\bd D\bDe\bes\bsc\bcr\bri\bip\bpt\bti\bio\bon\bn *\b**\b**\b**\b**\b*\n+Implements a matrix constructed from a given type representing a field and a\n+compile-time given number of rows and columns.\n ===============================================================================\n Generated by\u00a0_\b[_\bd_\bo_\bx_\by_\bg_\be_\bn_\b] 1.9.8\n"}]}, {"source1": "./usr/share/doc/libdune-common-doc/doxygen/a00146_source.html", "source2": "./usr/share/doc/libdune-common-doc/doxygen/a00146_source.html", "unified_diff": "@@ -1,15 +1,15 @@\n \n \n \n \n \n \n \n-dune-common: fwd_layouts.hh Source File\n+dune-common: densematrix.hh Source File\n \n \n \n \n \n \n \n@@ -70,64 +70,1308 @@\n \n \n \n \n \n \n \n
    \n-
    fwd_layouts.hh
    \n+
    densematrix.hh
    \n
    \n
    \n Go to the documentation of this file.
    1// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
    \n
    2// vi: set et ts=4 sw=2 sts=2:
    \n
    3// SPDX-FileCopyrightInfo: Copyright \u00a9 DUNE Project contributors, see file LICENSE.md in module root
    \n
    4// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception
    \n-
    5#ifndef DUNE_COMMON_STD_IMPL_FWD_LAYOUTS_HH
    \n-
    6#define DUNE_COMMON_STD_IMPL_FWD_LAYOUTS_HH
    \n+
    5#ifndef DUNE_DENSEMATRIX_HH
    \n+
    6#define DUNE_DENSEMATRIX_HH
    \n
    7
    \n-
    8namespace Dune::Std {
    \n-
    9
    \n-
    \n-\n-
    17{
    \n-
    18 template <class Extents>
    \n-
    19 class mapping;
    \n-
    20};
    \n-
    \n-
    21
    \n-
    \n-\n-
    30{
    \n-
    31 template <class Extents>
    \n-
    32 class mapping;
    \n-
    33};
    \n-
    \n-
    34
    \n-
    \n-\n-
    40{
    \n-
    41 template <class Extents>
    \n-
    42 class mapping;
    \n-
    43};
    \n-
    \n-
    44
    \n-
    45} // end namespace Dune::Std
    \n-
    46
    \n-
    47#endif // DUNE_COMMON_STD_IMPL_FWD_LAYOUTS_HH
    \n-
    Namespace for features backported from new C++ standards.
    Definition default_accessor.hh:10
    \n-
    A layout where the leftmost extent has stride 1.
    Definition fwd_layouts.hh:17
    \n-
    A layout mapping where the leftmost extent has stride 1.
    Definition layout_left.hh:19
    \n-
    A layout where the rightmost extent has stride 1, and strides increase right-to-left as the product o...
    Definition fwd_layouts.hh:30
    \n-
    A layout mapping where the rightmost extent has stride 1.
    Definition layout_right.hh:19
    \n-
    A layout mapping where the strides are user-defined.
    Definition fwd_layouts.hh:40
    \n-
    A layout mapping where the strides are user-defined.
    Definition layout_stride.hh:19
    \n+
    8#include <cmath>
    \n+
    9#include <cstddef>
    \n+
    10#include <iostream>
    \n+
    11#include <type_traits>
    \n+
    12#include <utility>
    \n+
    13#include <vector>
    \n+
    14
    \n+\n+\n+\n+\n+
    19#include <dune/common/math.hh>
    \n+\n+\n+\n+\n+
    24
    \n+
    25namespace Dune
    \n+
    26{
    \n+
    27
    \n+
    28 template<typename M> class DenseMatrix;
    \n+
    29
    \n+
    30 template<typename M>
    \n+\n+
    36
    \n+
    37 template<class K, int N, int M> class FieldMatrix;
    \n+
    38 template<class K, int N> class FieldVector;
    \n+
    39
    \n+
    58 template< class DenseMatrix, class RHS >
    \n+\n+
    60
    \n+
    61#ifndef DOXYGEN
    \n+
    62 namespace Impl
    \n+
    63 {
    \n+
    64
    \n+
    65 template< class DenseMatrix, class RHS, class = void >
    \n+\n+
    67 {};
    \n+
    68
    \n+
    69 template< class DenseMatrix, class RHS >
    \n+
    70 class DenseMatrixAssigner< DenseMatrix, RHS, std::enable_if_t< Dune::IsNumber< RHS >::value > >
    \n+
    71 {
    \n+
    72 public:
    \n+
    73 static void apply ( DenseMatrix &denseMatrix, const RHS &rhs )
    \n+
    74 {
    \n+
    75 typedef typename DenseMatrix::field_type field_type;
    \n+
    76 std::fill( denseMatrix.begin(), denseMatrix.end(), static_cast< field_type >( rhs ) );
    \n+
    77 }
    \n+
    78 };
    \n+
    79
    \n+
    80 template< class DenseMatrix, class RHS >
    \n+
    81 class DenseMatrixAssigner< DenseMatrix, RHS, std::enable_if_t< !std::is_same< typename RHS::const_iterator, void >::value
    \n+
    82 && std::is_convertible< typename RHS::const_iterator::value_type, typename DenseMatrix::iterator::value_type >::value > >
    \n+
    83 {
    \n+
    84 public:
    \n+
    85 static void apply ( DenseMatrix &denseMatrix, const RHS &rhs )
    \n+
    86 {
    \n+
    87 DUNE_ASSERT_BOUNDS(rhs.N() == denseMatrix.N());
    \n+
    88 DUNE_ASSERT_BOUNDS(rhs.M() == denseMatrix.M());
    \n+
    89 typename DenseMatrix::iterator tIt = std::begin(denseMatrix);
    \n+
    90 typename RHS::const_iterator sIt = std::begin(rhs);
    \n+
    91 for(; sIt != std::end(rhs); ++tIt, ++sIt)
    \n+
    92 std::copy(std::begin(*sIt), std::end(*sIt), std::begin(*tIt));
    \n+
    93 }
    \n+
    94 };
    \n+
    95
    \n+
    96 } // namespace Impl
    \n+
    97
    \n+
    98
    \n+
    99
    \n+
    100 template< class DenseMatrix, class RHS >
    \n+
    101 struct DenseMatrixAssigner
    \n+
    102 : public Impl::DenseMatrixAssigner< DenseMatrix, RHS >
    \n+
    103 {};
    \n+
    104
    \n+
    105
    \n+
    106 namespace Impl
    \n+
    107 {
    \n+
    108
    \n+
    109 template< class DenseMatrix, class RHS >
    \n+
    110 std::true_type hasDenseMatrixAssigner ( DenseMatrix &, const RHS &, decltype( Dune::DenseMatrixAssigner< DenseMatrix, RHS >::apply( std::declval< DenseMatrix & >(), std::declval< const RHS & >() ) ) * = nullptr );
    \n+
    111
    \n+
    112 std::false_type hasDenseMatrixAssigner ( ... );
    \n+
    113
    \n+
    114 } // namespace Impl
    \n+
    115
    \n+
    116 template< class DenseMatrix, class RHS >
    \n+
    117 struct HasDenseMatrixAssigner
    \n+
    118 : public decltype( Impl::hasDenseMatrixAssigner( std::declval< DenseMatrix & >(), std::declval< const RHS & >() ) )
    \n+
    119 {};
    \n+
    120
    \n+
    121#endif // #ifndef DOXYGEN
    \n+
    122
    \n+
    123
    \n+
    124
    \n+
    126 class FMatrixError : public MathError {};
    \n+
    127
    \n+
    138 template<typename MAT>
    \n+
    \n+\n+
    140 {
    \n+\n+
    142
    \n+
    143 // Curiously recurring template pattern
    \n+
    144 constexpr MAT & asImp() { return static_cast<MAT&>(*this); }
    \n+
    145 constexpr const MAT & asImp() const { return static_cast<const MAT&>(*this); }
    \n+
    146
    \n+
    147 template <class>
    \n+
    148 friend class DenseMatrix;
    \n+
    149
    \n+
    150 public:
    \n+
    151 //===== type definitions and constants
    \n+
    152
    \n+
    154 typedef typename Traits::derived_type derived_type;
    \n+
    155
    \n+
    157 typedef typename Traits::value_type value_type;
    \n+
    158
    \n+
    160 typedef typename Traits::value_type field_type;
    \n+
    161
    \n+
    163 typedef typename Traits::value_type block_type;
    \n+
    164
    \n+
    166 typedef typename Traits::size_type size_type;
    \n+
    167
    \n+
    169 typedef typename Traits::row_type row_type;
    \n+
    170
    \n+
    172 typedef typename Traits::row_reference row_reference;
    \n+
    173
    \n+
    175 typedef typename Traits::const_row_reference const_row_reference;
    \n+
    176
    \n+
    178 constexpr static int blocklevel = 1;
    \n+
    179
    \n+
    180 private:
    \n+
    183 using simd_index_type = Simd::Rebind<std::size_t, value_type>;
    \n+
    184
    \n+
    185 public:
    \n+
    186 //===== access to components
    \n+
    187
    \n+
    \n+\n+
    190 {
    \n+
    191 return asImp().mat_access(i);
    \n+
    192 }
    \n+
    \n+
    193
    \n+
    \n+\n+
    195 {
    \n+
    196 return asImp().mat_access(i);
    \n+
    197 }
    \n+
    \n+
    198
    \n+
    \n+\n+
    201 {
    \n+
    202 return rows();
    \n+
    203 }
    \n+
    \n+
    204
    \n+
    205 //===== iterator interface to rows of the matrix
    \n+\n+\n+\n+
    213 typedef typename std::remove_reference<row_reference>::type::Iterator ColIterator;
    \n+
    214
    \n+
    \n+\n+
    217 {
    \n+
    218 return Iterator(*this,0);
    \n+
    219 }
    \n+
    \n+
    220
    \n+
    \n+\n+
    223 {
    \n+
    224 return Iterator(*this,rows());
    \n+
    225 }
    \n+
    \n+
    226
    \n+
    \n+\n+
    230 {
    \n+
    231 return Iterator(*this,rows()-1);
    \n+
    232 }
    \n+
    \n+
    233
    \n+
    \n+\n+
    237 {
    \n+
    238 return Iterator(*this,-1);
    \n+
    239 }
    \n+
    \n+
    240
    \n+\n+\n+\n+
    248 typedef typename std::remove_reference<const_row_reference>::type::ConstIterator ConstColIterator;
    \n+
    249
    \n+
    \n+\n+
    252 {
    \n+
    253 return ConstIterator(*this,0);
    \n+
    254 }
    \n+
    \n+
    255
    \n+
    \n+\n+
    258 {
    \n+
    259 return ConstIterator(*this,rows());
    \n+
    260 }
    \n+
    \n+
    261
    \n+
    \n+\n+
    265 {
    \n+
    266 return ConstIterator(*this,rows()-1);
    \n+
    267 }
    \n+
    \n+
    268
    \n+
    \n+\n+
    272 {
    \n+
    273 return ConstIterator(*this,-1);
    \n+
    274 }
    \n+
    \n+
    275
    \n+
    276 //===== assignment
    \n+
    277
    \n+
    278 template< class RHS, class = std::enable_if_t< HasDenseMatrixAssigner< MAT, RHS >::value > >
    \n+
    \n+
    279 derived_type &operator= ( const RHS &rhs )
    \n+
    280 {
    \n+\n+
    282 return asImp();
    \n+
    283 }
    \n+
    \n+
    284
    \n+
    285 //===== vector space arithmetic
    \n+
    286
    \n+
    288 template <class Other>
    \n+
    \n+\n+
    290 {
    \n+
    291 DUNE_ASSERT_BOUNDS(rows() == x.rows());
    \n+
    292 for (size_type i=0; i<rows(); i++)
    \n+
    293 (*this)[i] += x[i];
    \n+
    294 return asImp();
    \n+
    295 }
    \n+
    \n+
    296
    \n+
    \n+\n+
    299 {
    \n+
    300 MAT result;
    \n+
    301 using idx_type = typename decltype(result)::size_type;
    \n+
    302
    \n+
    303 for (idx_type i = 0; i < rows(); ++i)
    \n+
    304 for (idx_type j = 0; j < cols(); ++j)
    \n+
    305 result[i][j] = - asImp()[i][j];
    \n+
    306
    \n+
    307 return result;
    \n+
    308 }
    \n+
    \n+
    309
    \n+
    311 template <class Other>
    \n+
    \n+\n+
    313 {
    \n+
    314 DUNE_ASSERT_BOUNDS(rows() == x.rows());
    \n+
    315 for (size_type i=0; i<rows(); i++)
    \n+
    316 (*this)[i] -= x[i];
    \n+
    317 return asImp();
    \n+
    318 }
    \n+
    \n+
    319
    \n+
    \n+\n+
    322 {
    \n+
    323 for (size_type i=0; i<rows(); i++)
    \n+
    324 (*this)[i] *= k;
    \n+
    325 return asImp();
    \n+
    326 }
    \n+
    \n+
    327
    \n+
    \n+\n+
    330 {
    \n+
    331 for (size_type i=0; i<rows(); i++)
    \n+
    332 (*this)[i] /= k;
    \n+
    333 return asImp();
    \n+
    334 }
    \n+
    \n+
    335
    \n+
    337 template <class Other>
    \n+
    \n+\n+
    339 {
    \n+
    340 DUNE_ASSERT_BOUNDS(rows() == x.rows());
    \n+
    341 for( size_type i = 0; i < rows(); ++i )
    \n+
    342 (*this)[ i ].axpy( a, x[ i ] );
    \n+
    343 return asImp();
    \n+
    344 }
    \n+
    \n+
    345
    \n+
    347 template <class Other>
    \n+
    \n+
    348 bool operator== (const DenseMatrix<Other>& x) const
    \n+
    349 {
    \n+
    350 DUNE_ASSERT_BOUNDS(rows() == x.rows());
    \n+
    351 for (size_type i=0; i<rows(); i++)
    \n+
    352 if ((*this)[i]!=x[i])
    \n+
    353 return false;
    \n+
    354 return true;
    \n+
    355 }
    \n+
    \n+
    357 template <class Other>
    \n+
    \n+
    358 bool operator!= (const DenseMatrix<Other>& x) const
    \n+
    359 {
    \n+
    360 return !operator==(x);
    \n+
    361 }
    \n+
    \n+
    362
    \n+
    363
    \n+
    364 //===== linear maps
    \n+
    365
    \n+
    367 template<class X, class Y>
    \n+
    \n+
    368 void mv (const X& x, Y& y) const
    \n+
    369 {
    \n+
    370 auto&& xx = Impl::asVector(x);
    \n+
    371 auto&& yy = Impl::asVector(y);
    \n+
    372 DUNE_ASSERT_BOUNDS((void*)(&x) != (void*)(&y));
    \n+
    373 DUNE_ASSERT_BOUNDS(xx.N() == M());
    \n+
    374 DUNE_ASSERT_BOUNDS(yy.N() == N());
    \n+
    375
    \n+
    376 using y_field_type = typename FieldTraits<Y>::field_type;
    \n+
    377 for (size_type i=0; i<rows(); ++i)
    \n+
    378 {
    \n+
    379 yy[i] = y_field_type(0);
    \n+
    380 for (size_type j=0; j<cols(); j++)
    \n+
    381 yy[i] += (*this)[i][j] * xx[j];
    \n+
    382 }
    \n+
    383 }
    \n+
    \n+
    384
    \n+
    386 template< class X, class Y >
    \n+
    \n+
    387 void mtv ( const X &x, Y &y ) const
    \n+
    388 {
    \n+
    389 auto&& xx = Impl::asVector(x);
    \n+
    390 auto&& yy = Impl::asVector(y);
    \n+
    391 DUNE_ASSERT_BOUNDS((void*)(&x) != (void*)(&y));
    \n+
    392 DUNE_ASSERT_BOUNDS(xx.N() == N());
    \n+
    393 DUNE_ASSERT_BOUNDS(yy.N() == M());
    \n+
    394
    \n+
    395 using y_field_type = typename FieldTraits<Y>::field_type;
    \n+
    396 for(size_type i = 0; i < cols(); ++i)
    \n+
    397 {
    \n+
    398 yy[i] = y_field_type(0);
    \n+
    399 for(size_type j = 0; j < rows(); ++j)
    \n+
    400 yy[i] += (*this)[j][i] * xx[j];
    \n+
    401 }
    \n+
    402 }
    \n+
    \n+
    403
    \n+
    405 template<class X, class Y>
    \n+
    \n+
    406 void umv (const X& x, Y& y) const
    \n+
    407 {
    \n+
    408 auto&& xx = Impl::asVector(x);
    \n+
    409 auto&& yy = Impl::asVector(y);
    \n+
    410 DUNE_ASSERT_BOUNDS(xx.N() == M());
    \n+
    411 DUNE_ASSERT_BOUNDS(yy.N() == N());
    \n+
    412 for (size_type i=0; i<rows(); ++i)
    \n+
    413 for (size_type j=0; j<cols(); j++)
    \n+
    414 yy[i] += (*this)[i][j] * xx[j];
    \n+
    415 }
    \n+
    \n+
    416
    \n+
    418 template<class X, class Y>
    \n+
    \n+
    419 void umtv (const X& x, Y& y) const
    \n+
    420 {
    \n+
    421 auto&& xx = Impl::asVector(x);
    \n+
    422 auto&& yy = Impl::asVector(y);
    \n+
    423 DUNE_ASSERT_BOUNDS(xx.N() == N());
    \n+
    424 DUNE_ASSERT_BOUNDS(yy.N() == M());
    \n+
    425 for(size_type i = 0; i<rows(); ++i)
    \n+
    426 for (size_type j=0; j<cols(); j++)
    \n+
    427 yy[j] += (*this)[i][j]*xx[i];
    \n+
    428 }
    \n+
    \n+
    429
    \n+
    431 template<class X, class Y>
    \n+
    \n+
    432 void umhv (const X& x, Y& y) const
    \n+
    433 {
    \n+
    434 auto&& xx = Impl::asVector(x);
    \n+
    435 auto&& yy = Impl::asVector(y);
    \n+
    436 DUNE_ASSERT_BOUNDS(xx.N() == N());
    \n+
    437 DUNE_ASSERT_BOUNDS(yy.N() == M());
    \n+
    438 for (size_type i=0; i<rows(); i++)
    \n+
    439 for (size_type j=0; j<cols(); j++)
    \n+
    440 yy[j] += conjugateComplex((*this)[i][j])*xx[i];
    \n+
    441 }
    \n+
    \n+
    442
    \n+
    444 template<class X, class Y>
    \n+
    \n+
    445 void mmv (const X& x, Y& y) const
    \n+
    446 {
    \n+
    447 auto&& xx = Impl::asVector(x);
    \n+
    448 auto&& yy = Impl::asVector(y);
    \n+
    449 DUNE_ASSERT_BOUNDS(xx.N() == M());
    \n+
    450 DUNE_ASSERT_BOUNDS(yy.N() == N());
    \n+
    451 for (size_type i=0; i<rows(); i++)
    \n+
    452 for (size_type j=0; j<cols(); j++)
    \n+
    453 yy[i] -= (*this)[i][j] * xx[j];
    \n+
    454 }
    \n+
    \n+
    455
    \n+
    457 template<class X, class Y>
    \n+
    \n+
    458 void mmtv (const X& x, Y& y) const
    \n+
    459 {
    \n+
    460 auto&& xx = Impl::asVector(x);
    \n+
    461 auto&& yy = Impl::asVector(y);
    \n+
    462 DUNE_ASSERT_BOUNDS(xx.N() == N());
    \n+
    463 DUNE_ASSERT_BOUNDS(yy.N() == M());
    \n+
    464 for (size_type i=0; i<rows(); i++)
    \n+
    465 for (size_type j=0; j<cols(); j++)
    \n+
    466 yy[j] -= (*this)[i][j]*xx[i];
    \n+
    467 }
    \n+
    \n+
    468
    \n+
    470 template<class X, class Y>
    \n+
    \n+
    471 void mmhv (const X& x, Y& y) const
    \n+
    472 {
    \n+
    473 auto&& xx = Impl::asVector(x);
    \n+
    474 auto&& yy = Impl::asVector(y);
    \n+
    475 DUNE_ASSERT_BOUNDS(xx.N() == N());
    \n+
    476 DUNE_ASSERT_BOUNDS(yy.N() == M());
    \n+
    477 for (size_type i=0; i<rows(); i++)
    \n+
    478 for (size_type j=0; j<cols(); j++)
    \n+
    479 yy[j] -= conjugateComplex((*this)[i][j])*xx[i];
    \n+
    480 }
    \n+
    \n+
    481
    \n+
    483 template<class X, class Y>
    \n+
    \n+
    484 void usmv (const typename FieldTraits<Y>::field_type & alpha,
    \n+
    485 const X& x, Y& y) const
    \n+
    486 {
    \n+
    487 auto&& xx = Impl::asVector(x);
    \n+
    488 auto&& yy = Impl::asVector(y);
    \n+
    489 DUNE_ASSERT_BOUNDS(xx.N() == M());
    \n+
    490 DUNE_ASSERT_BOUNDS(yy.N() == N());
    \n+
    491 for (size_type i=0; i<rows(); i++)
    \n+
    492 for (size_type j=0; j<cols(); j++)
    \n+
    493 yy[i] += alpha * (*this)[i][j] * xx[j];
    \n+
    494 }
    \n+
    \n+
    495
    \n+
    497 template<class X, class Y>
    \n+
    \n+
    498 void usmtv (const typename FieldTraits<Y>::field_type & alpha,
    \n+
    499 const X& x, Y& y) const
    \n+
    500 {
    \n+
    501 auto&& xx = Impl::asVector(x);
    \n+
    502 auto&& yy = Impl::asVector(y);
    \n+
    503 DUNE_ASSERT_BOUNDS(xx.N() == N());
    \n+
    504 DUNE_ASSERT_BOUNDS(yy.N() == M());
    \n+
    505 for (size_type i=0; i<rows(); i++)
    \n+
    506 for (size_type j=0; j<cols(); j++)
    \n+
    507 yy[j] += alpha*(*this)[i][j]*xx[i];
    \n+
    508 }
    \n+
    \n+
    509
    \n+
    511 template<class X, class Y>
    \n+
    \n+
    512 void usmhv (const typename FieldTraits<Y>::field_type & alpha,
    \n+
    513 const X& x, Y& y) const
    \n+
    514 {
    \n+
    515 auto&& xx = Impl::asVector(x);
    \n+
    516 auto&& yy = Impl::asVector(y);
    \n+
    517 DUNE_ASSERT_BOUNDS(xx.N() == N());
    \n+
    518 DUNE_ASSERT_BOUNDS(yy.N() == M());
    \n+
    519 for (size_type i=0; i<rows(); i++)
    \n+
    520 for (size_type j=0; j<cols(); j++)
    \n+
    521 yy[j] +=
    \n+
    522 alpha*conjugateComplex((*this)[i][j])*xx[i];
    \n+
    523 }
    \n+
    \n+
    524
    \n+
    525 //===== norms
    \n+
    526
    \n+
    \n+\n+
    529 {
    \n+
    530 typename FieldTraits<value_type>::real_type sum=(0.0);
    \n+
    531 for (size_type i=0; i<rows(); ++i) sum += (*this)[i].two_norm2();
    \n+
    532 return fvmeta::sqrt(sum);
    \n+
    533 }
    \n+
    \n+
    534
    \n+
    \n+\n+
    537 {
    \n+
    538 typename FieldTraits<value_type>::real_type sum=(0.0);
    \n+
    539 for (size_type i=0; i<rows(); ++i) sum += (*this)[i].two_norm2();
    \n+
    540 return sum;
    \n+
    541 }
    \n+
    \n+
    542
    \n+
    544 template <typename vt = value_type,
    \n+
    545 typename std::enable_if<!HasNaN<vt>::value, int>::type = 0>
    \n+
    \n+\n+
    547 using real_type = typename FieldTraits<vt>::real_type;
    \n+
    548 using std::max;
    \n+
    549
    \n+
    550 real_type norm = 0;
    \n+
    551 for (auto const &x : *this) {
    \n+
    552 real_type const a = x.one_norm();
    \n+
    553 norm = max(a, norm);
    \n+
    554 }
    \n+
    555 return norm;
    \n+
    556 }
    \n+
    \n+
    557
    \n+
    559 template <typename vt = value_type,
    \n+
    560 typename std::enable_if<!HasNaN<vt>::value, int>::type = 0>
    \n+
    \n+\n+
    562 using real_type = typename FieldTraits<vt>::real_type;
    \n+
    563 using std::max;
    \n+
    564
    \n+
    565 real_type norm = 0;
    \n+
    566 for (auto const &x : *this) {
    \n+
    567 real_type const a = x.one_norm_real();
    \n+
    568 norm = max(a, norm);
    \n+
    569 }
    \n+
    570 return norm;
    \n+
    571 }
    \n+
    \n+
    572
    \n+
    574 template <typename vt = value_type,
    \n+
    575 typename std::enable_if<HasNaN<vt>::value, int>::type = 0>
    \n+
    \n+\n+
    577 using real_type = typename FieldTraits<vt>::real_type;
    \n+
    578 using std::max;
    \n+
    579
    \n+
    580 real_type norm = 0;
    \n+
    581 real_type isNaN = 1;
    \n+
    582 for (auto const &x : *this) {
    \n+
    583 real_type const a = x.one_norm();
    \n+
    584 norm = max(a, norm);
    \n+
    585 isNaN += a;
    \n+
    586 }
    \n+
    587 return norm * (isNaN / isNaN);
    \n+
    588 }
    \n+
    \n+
    589
    \n+
    591 template <typename vt = value_type,
    \n+
    592 typename std::enable_if<HasNaN<vt>::value, int>::type = 0>
    \n+
    \n+\n+
    594 using real_type = typename FieldTraits<vt>::real_type;
    \n+
    595 using std::max;
    \n+
    596
    \n+
    597 real_type norm = 0;
    \n+
    598 real_type isNaN = 1;
    \n+
    599 for (auto const &x : *this) {
    \n+
    600 real_type const a = x.one_norm_real();
    \n+
    601 norm = max(a, norm);
    \n+
    602 isNaN += a;
    \n+
    603 }
    \n+
    604 return norm * (isNaN / isNaN);
    \n+
    605 }
    \n+
    \n+
    606
    \n+
    607 //===== solve
    \n+
    608
    \n+
    613 template <class V1, class V2>
    \n+
    614 void solve (V1& x, const V2& b, bool doPivoting = true) const;
    \n+
    615
    \n+
    620 void invert(bool doPivoting = true);
    \n+
    621
    \n+
    623 field_type determinant (bool doPivoting = true) const;
    \n+
    624
    \n+
    626 template<typename M2>
    \n+
    \n+\n+
    628 {
    \n+
    629 DUNE_ASSERT_BOUNDS(M.rows() == M.cols());
    \n+
    630 DUNE_ASSERT_BOUNDS(M.rows() == rows());
    \n+
    631 AutonomousValue<MAT> C(asImp());
    \n+
    632
    \n+
    633 for (size_type i=0; i<rows(); i++)
    \n+
    634 for (size_type j=0; j<cols(); j++) {
    \n+
    635 (*this)[i][j] = 0;
    \n+
    636 for (size_type k=0; k<rows(); k++)
    \n+
    637 (*this)[i][j] += M[i][k]*C[k][j];
    \n+
    638 }
    \n+
    639
    \n+
    640 return asImp();
    \n+
    641 }
    \n+
    \n+
    642
    \n+
    644 template<typename M2>
    \n+
    \n+\n+
    646 {
    \n+
    647 DUNE_ASSERT_BOUNDS(M.rows() == M.cols());
    \n+
    648 DUNE_ASSERT_BOUNDS(M.cols() == cols());
    \n+
    649 AutonomousValue<MAT> C(asImp());
    \n+
    650
    \n+
    651 for (size_type i=0; i<rows(); i++)
    \n+
    652 for (size_type j=0; j<cols(); j++) {
    \n+
    653 (*this)[i][j] = 0;
    \n+
    654 for (size_type k=0; k<cols(); k++)
    \n+
    655 (*this)[i][j] += C[i][k]*M[k][j];
    \n+
    656 }
    \n+
    657 return asImp();
    \n+
    658 }
    \n+
    \n+
    659
    \n+
    660#if 0
    \n+
    662 template<int l>
    \n+
    663 DenseMatrix<K,l,cols> leftmultiplyany (const FieldMatrix<K,l,rows>& M) const
    \n+
    664 {
    \n+\n+
    666
    \n+
    667 for (size_type i=0; i<l; i++) {
    \n+
    668 for (size_type j=0; j<cols(); j++) {
    \n+
    669 C[i][j] = 0;
    \n+
    670 for (size_type k=0; k<rows(); k++)
    \n+
    671 C[i][j] += M[i][k]*(*this)[k][j];
    \n+
    672 }
    \n+
    673 }
    \n+
    674 return C;
    \n+
    675 }
    \n+
    676
    \n+
    678 template<int l>
    \n+
    679 FieldMatrix<K,rows,l> rightmultiplyany (const FieldMatrix<K,cols,l>& M) const
    \n+
    680 {
    \n+
    681 FieldMatrix<K,rows,l> C;
    \n+
    682
    \n+
    683 for (size_type i=0; i<rows(); i++) {
    \n+
    684 for (size_type j=0; j<l; j++) {
    \n+
    685 C[i][j] = 0;
    \n+
    686 for (size_type k=0; k<cols(); k++)
    \n+
    687 C[i][j] += (*this)[i][k]*M[k][j];
    \n+
    688 }
    \n+
    689 }
    \n+
    690 return C;
    \n+
    691 }
    \n+
    692#endif
    \n+
    693
    \n+
    694 //===== sizes
    \n+
    695
    \n+
    \n+
    697 constexpr size_type N () const
    \n+
    698 {
    \n+
    699 return rows();
    \n+
    700 }
    \n+
    \n+
    701
    \n+
    \n+
    703 constexpr size_type M () const
    \n+
    704 {
    \n+
    705 return cols();
    \n+
    706 }
    \n+
    \n+
    707
    \n+
    \n+
    709 constexpr size_type rows() const
    \n+
    710 {
    \n+
    711 return asImp().mat_rows();
    \n+
    712 }
    \n+
    \n+
    713
    \n+
    \n+
    715 constexpr size_type cols() const
    \n+
    716 {
    \n+
    717 return asImp().mat_cols();
    \n+
    718 }
    \n+
    \n+
    719
    \n+
    720 //===== query
    \n+
    721
    \n+
    \n+
    723 bool exists ([[maybe_unused]] size_type i, [[maybe_unused]] size_type j) const
    \n+
    724 {
    \n+
    725 DUNE_ASSERT_BOUNDS(i >= 0 && i < rows());
    \n+
    726 DUNE_ASSERT_BOUNDS(j >= 0 && j < cols());
    \n+
    727 return true;
    \n+
    728 }
    \n+
    \n+
    729
    \n+
    730 protected:
    \n+
    731
    \n+
    732#ifndef DOXYGEN
    \n+
    733 struct ElimPivot
    \n+
    734 {
    \n+
    735 ElimPivot(std::vector<simd_index_type> & pivot);
    \n+
    736
    \n+
    737 void swap(std::size_t i, simd_index_type j);
    \n+
    738
    \n+
    739 template<typename T>
    \n+
    740 void operator()(const T&, int, int)
    \n+
    741 {}
    \n+
    742
    \n+
    743 std::vector<simd_index_type> & pivot_;
    \n+
    744 };
    \n+
    745
    \n+
    746 template<typename V>
    \n+
    747 struct Elim
    \n+
    748 {
    \n+
    749 Elim(V& rhs);
    \n+
    750
    \n+
    751 void swap(std::size_t i, simd_index_type j);
    \n+
    752
    \n+
    753 void operator()(const typename V::field_type& factor, int k, int i);
    \n+
    754
    \n+
    755 V* rhs_;
    \n+
    756 };
    \n+
    757
    \n+
    758 struct ElimDet
    \n+
    759 {
    \n+
    760 ElimDet(field_type& sign) : sign_(sign)
    \n+
    761 { sign_ = 1; }
    \n+
    762
    \n+
    763 void swap(std::size_t i, simd_index_type j)
    \n+
    764 {
    \n+
    765 sign_ *=
    \n+
    766 Simd::cond(simd_index_type(i) == j, field_type(1), field_type(-1));
    \n+
    767 }
    \n+
    768
    \n+
    769 void operator()(const field_type&, int, int)
    \n+
    770 {}
    \n+
    771
    \n+
    772 field_type& sign_;
    \n+
    773 };
    \n+
    774#endif // DOXYGEN
    \n+
    775
    \n+
    777
    \n+
    815 template<class Func, class Mask>
    \n+
    816 static void luDecomposition(DenseMatrix<MAT>& A, Func func,
    \n+
    817 Mask &nonsingularLanes, bool throwEarly, bool doPivoting);
    \n+
    818 };
    \n+
    \n+
    819
    \n+
    820#ifndef DOXYGEN
    \n+
    821 template<typename MAT>
    \n+
    822 DenseMatrix<MAT>::ElimPivot::ElimPivot(std::vector<simd_index_type> & pivot)
    \n+
    823 : pivot_(pivot)
    \n+
    824 {
    \n+
    825 typedef typename std::vector<size_type>::size_type size_type;
    \n+
    826 for(size_type i=0; i < pivot_.size(); ++i) pivot_[i]=i;
    \n+
    827 }
    \n+
    828
    \n+
    829 template<typename MAT>
    \n+
    830 void DenseMatrix<MAT>::ElimPivot::swap(std::size_t i, simd_index_type j)
    \n+
    831 {
    \n+
    832 pivot_[i] =
    \n+
    833 Simd::cond(Simd::Scalar<simd_index_type>(i) == j, pivot_[i], j);
    \n+
    834 }
    \n+
    835
    \n+
    836 template<typename MAT>
    \n+
    837 template<typename V>
    \n+
    838 DenseMatrix<MAT>::Elim<V>::Elim(V& rhs)
    \n+
    839 : rhs_(&rhs)
    \n+
    840 {}
    \n+
    841
    \n+
    842 template<typename MAT>
    \n+
    843 template<typename V>
    \n+
    844 void DenseMatrix<MAT>::Elim<V>::swap(std::size_t i, simd_index_type j)
    \n+
    845 {
    \n+
    846 using std::swap;
    \n+
    847
    \n+
    848 // see the comment in luDecomposition()
    \n+
    849 for(std::size_t l = 0; l < Simd::lanes(j); ++l)
    \n+
    850 swap(Simd::lane(l, (*rhs_)[ i ]),
    \n+
    851 Simd::lane(l, (*rhs_)[Simd::lane(l, j)]));
    \n+
    852 }
    \n+
    853
    \n+
    854 template<typename MAT>
    \n+
    855 template<typename V>
    \n+
    856 void DenseMatrix<MAT>::
    \n+
    857 Elim<V>::operator()(const typename V::field_type& factor, int k, int i)
    \n+
    858 {
    \n+
    859 (*rhs_)[k] -= factor*(*rhs_)[i];
    \n+
    860 }
    \n+
    861
    \n+
    862 template<typename MAT>
    \n+
    863 template<typename Func, class Mask>
    \n+
    864 inline void DenseMatrix<MAT>::
    \n+
    865 luDecomposition(DenseMatrix<MAT>& A, Func func, Mask &nonsingularLanes,
    \n+
    866 bool throwEarly, bool doPivoting)
    \n+
    867 {
    \n+
    868 using std::max;
    \n+
    869 using std::swap;
    \n+
    870
    \n+
    871 typedef typename FieldTraits<value_type>::real_type real_type;
    \n+
    872
    \n+
    873 // LU decomposition of A in A
    \n+
    874 for (size_type i=0; i<A.rows(); i++) // loop over all rows
    \n+
    875 {
    \n+
    876 real_type pivmax = fvmeta::absreal(A[i][i]);
    \n+
    877
    \n+
    878 if (doPivoting)
    \n+
    879 {
    \n+
    880 // compute maximum of column
    \n+
    881 simd_index_type imax=i;
    \n+
    882 for (size_type k=i+1; k<A.rows(); k++)
    \n+
    883 {
    \n+
    884 auto abs = fvmeta::absreal(A[k][i]);
    \n+
    885 auto mask = abs > pivmax;
    \n+
    886 pivmax = Simd::cond(mask, abs, pivmax);
    \n+
    887 imax = Simd::cond(mask, simd_index_type(k), imax);
    \n+
    888 }
    \n+
    889 // swap rows
    \n+
    890 for (size_type j=0; j<A.rows(); j++)
    \n+
    891 {
    \n+
    892 // This is a swap operation where the second operand is scattered,
    \n+
    893 // and on top of that is also extracted from deep within a
    \n+
    894 // moderately complicated data structure (a DenseMatrix), where we
    \n+
    895 // can't assume much on the memory layout. On intel processors,
    \n+
    896 // the only instruction that might help us here is vgather, but it
    \n+
    897 // is unclear whether that is even faster than a software
    \n+
    898 // implementation, and we would also need vscatter which does not
    \n+
    899 // exist. So break vectorization here and do it manually.
    \n+
    900 for(std::size_t l = 0; l < Simd::lanes(A[i][j]); ++l)
    \n+
    901 swap(Simd::lane(l, A[i][j]),
    \n+
    902 Simd::lane(l, A[Simd::lane(l, imax)][j]));
    \n+
    903 }
    \n+
    904 func.swap(i, imax); // swap the pivot or rhs
    \n+
    905 }
    \n+
    906
    \n+
    907 // singular ?
    \n+
    908 nonsingularLanes = nonsingularLanes && (pivmax != real_type(0));
    \n+
    909 if (throwEarly) {
    \n+
    910 if(!Simd::allTrue(nonsingularLanes))
    \n+
    911 DUNE_THROW(FMatrixError, "matrix is singular");
    \n+
    912 }
    \n+
    913 else { // !throwEarly
    \n+
    914 if(!Simd::anyTrue(nonsingularLanes))
    \n+
    915 return;
    \n+
    916 }
    \n+
    917
    \n+
    918 // eliminate
    \n+
    919 for (size_type k=i+1; k<A.rows(); k++)
    \n+
    920 {
    \n+
    921 // in the simd case, A[i][i] may be close to zero in some lanes. Pray
    \n+
    922 // that the result is no worse than a quiet NaN.
    \n+
    923 field_type factor = A[k][i]/A[i][i];
    \n+
    924 A[k][i] = factor;
    \n+
    925 for (size_type j=i+1; j<A.rows(); j++)
    \n+
    926 A[k][j] -= factor*A[i][j];
    \n+
    927 func(factor, k, i);
    \n+
    928 }
    \n+
    929 }
    \n+
    930 }
    \n+
    931
    \n+
    932 template<typename MAT>
    \n+
    933 template <class V1, class V2>
    \n+
    934 inline void DenseMatrix<MAT>::solve(V1& x, const V2& b, bool doPivoting) const
    \n+
    935 {
    \n+
    936 using real_type = typename FieldTraits<value_type>::real_type;
    \n+
    937 // never mind those ifs, because they get optimized away
    \n+
    938 if (rows()!=cols())
    \n+
    939 DUNE_THROW(FMatrixError, "Can't solve for a " << rows() << "x" << cols() << " matrix!");
    \n+
    940
    \n+
    941 if (rows()==1) {
    \n+
    942
    \n+
    943#ifdef DUNE_FMatrix_WITH_CHECKING
    \n+
    944 if (Simd::anyTrue(fvmeta::absreal((*this)[0][0])
    \n+\n+
    946 DUNE_THROW(FMatrixError,"matrix is singular");
    \n+
    947#endif
    \n+
    948 x[0] = b[0]/(*this)[0][0];
    \n+
    949
    \n+
    950 }
    \n+
    951 else if (rows()==2) {
    \n+
    952
    \n+
    953 field_type detinv = (*this)[0][0]*(*this)[1][1]-(*this)[0][1]*(*this)[1][0];
    \n+
    954#ifdef DUNE_FMatrix_WITH_CHECKING
    \n+
    955 if (Simd::anyTrue(fvmeta::absreal(detinv)
    \n+\n+
    957 DUNE_THROW(FMatrixError,"matrix is singular");
    \n+
    958#endif
    \n+
    959 detinv = real_type(1.0)/detinv;
    \n+
    960
    \n+
    961 x[0] = detinv*((*this)[1][1]*b[0]-(*this)[0][1]*b[1]);
    \n+
    962 x[1] = detinv*((*this)[0][0]*b[1]-(*this)[1][0]*b[0]);
    \n+
    963
    \n+
    964 }
    \n+
    965 else if (rows()==3) {
    \n+
    966
    \n+
    967 field_type d = determinant(doPivoting);
    \n+
    968#ifdef DUNE_FMatrix_WITH_CHECKING
    \n+
    969 if (Simd::anyTrue(fvmeta::absreal(d)
    \n+\n+
    971 DUNE_THROW(FMatrixError,"matrix is singular");
    \n+
    972#endif
    \n+
    973
    \n+
    974 x[0] = (b[0]*(*this)[1][1]*(*this)[2][2] - b[0]*(*this)[2][1]*(*this)[1][2]
    \n+
    975 - b[1] *(*this)[0][1]*(*this)[2][2] + b[1]*(*this)[2][1]*(*this)[0][2]
    \n+
    976 + b[2] *(*this)[0][1]*(*this)[1][2] - b[2]*(*this)[1][1]*(*this)[0][2]) / d;
    \n+
    977
    \n+
    978 x[1] = ((*this)[0][0]*b[1]*(*this)[2][2] - (*this)[0][0]*b[2]*(*this)[1][2]
    \n+
    979 - (*this)[1][0] *b[0]*(*this)[2][2] + (*this)[1][0]*b[2]*(*this)[0][2]
    \n+
    980 + (*this)[2][0] *b[0]*(*this)[1][2] - (*this)[2][0]*b[1]*(*this)[0][2]) / d;
    \n+
    981
    \n+
    982 x[2] = ((*this)[0][0]*(*this)[1][1]*b[2] - (*this)[0][0]*(*this)[2][1]*b[1]
    \n+
    983 - (*this)[1][0] *(*this)[0][1]*b[2] + (*this)[1][0]*(*this)[2][1]*b[0]
    \n+
    984 + (*this)[2][0] *(*this)[0][1]*b[1] - (*this)[2][0]*(*this)[1][1]*b[0]) / d;
    \n+
    985
    \n+
    986 }
    \n+
    987 else {
    \n+
    988
    \n+
    989 V1& rhs = x; // use x to store rhs
    \n+
    990 rhs = b; // copy data
    \n+
    991 Elim<V1> elim(rhs);
    \n+
    992 AutonomousValue<MAT> A(asImp());
    \n+
    993 Simd::Mask<typename FieldTraits<value_type>::real_type>
    \n+
    994 nonsingularLanes(true);
    \n+
    995
    \n+
    996 AutonomousValue<MAT>::luDecomposition(A, elim, nonsingularLanes, true, doPivoting);
    \n+
    997
    \n+
    998 // backsolve
    \n+
    999 for(int i=rows()-1; i>=0; i--) {
    \n+
    1000 for (size_type j=i+1; j<rows(); j++)
    \n+
    1001 rhs[i] -= A[i][j]*x[j];
    \n+
    1002 x[i] = rhs[i]/A[i][i];
    \n+
    1003 }
    \n+
    1004 }
    \n+
    1005 }
    \n+
    1006
    \n+
    1007 template<typename MAT>
    \n+
    1008 inline void DenseMatrix<MAT>::invert(bool doPivoting)
    \n+
    1009 {
    \n+
    1010 using real_type = typename FieldTraits<MAT>::real_type;
    \n+
    1011 using std::swap;
    \n+
    1012
    \n+
    1013 // never mind those ifs, because they get optimized away
    \n+
    1014 if (rows()!=cols())
    \n+
    1015 DUNE_THROW(FMatrixError, "Can't invert a " << rows() << "x" << cols() << " matrix!");
    \n+
    1016
    \n+
    1017 if (rows()==1) {
    \n+
    1018
    \n+
    1019#ifdef DUNE_FMatrix_WITH_CHECKING
    \n+
    1020 if (Simd::anyTrue(fvmeta::absreal((*this)[0][0])
    \n+\n+
    1022 DUNE_THROW(FMatrixError,"matrix is singular");
    \n+
    1023#endif
    \n+
    1024 (*this)[0][0] = real_type( 1 ) / (*this)[0][0];
    \n+
    1025
    \n+
    1026 }
    \n+
    1027 else if (rows()==2) {
    \n+
    1028
    \n+
    1029 field_type detinv = (*this)[0][0]*(*this)[1][1]-(*this)[0][1]*(*this)[1][0];
    \n+
    1030#ifdef DUNE_FMatrix_WITH_CHECKING
    \n+
    1031 if (Simd::anyTrue(fvmeta::absreal(detinv)
    \n+\n+
    1033 DUNE_THROW(FMatrixError,"matrix is singular");
    \n+
    1034#endif
    \n+
    1035 detinv = real_type( 1 ) / detinv;
    \n+
    1036
    \n+
    1037 field_type temp=(*this)[0][0];
    \n+
    1038 (*this)[0][0] = (*this)[1][1]*detinv;
    \n+
    1039 (*this)[0][1] = -(*this)[0][1]*detinv;
    \n+
    1040 (*this)[1][0] = -(*this)[1][0]*detinv;
    \n+
    1041 (*this)[1][1] = temp*detinv;
    \n+
    1042
    \n+
    1043 }
    \n+
    1044 else if (rows()==3)
    \n+
    1045 {
    \n+
    1046 using K = field_type;
    \n+
    1047 // code generated by maple
    \n+
    1048 K t4 = (*this)[0][0] * (*this)[1][1];
    \n+
    1049 K t6 = (*this)[0][0] * (*this)[1][2];
    \n+
    1050 K t8 = (*this)[0][1] * (*this)[1][0];
    \n+
    1051 K t10 = (*this)[0][2] * (*this)[1][0];
    \n+
    1052 K t12 = (*this)[0][1] * (*this)[2][0];
    \n+
    1053 K t14 = (*this)[0][2] * (*this)[2][0];
    \n+
    1054
    \n+
    1055 K det = (t4*(*this)[2][2]-t6*(*this)[2][1]-t8*(*this)[2][2]+
    \n+
    1056 t10*(*this)[2][1]+t12*(*this)[1][2]-t14*(*this)[1][1]);
    \n+
    1057 K t17 = K(1.0)/det;
    \n+
    1058
    \n+
    1059 K matrix01 = (*this)[0][1];
    \n+
    1060 K matrix00 = (*this)[0][0];
    \n+
    1061 K matrix10 = (*this)[1][0];
    \n+
    1062 K matrix11 = (*this)[1][1];
    \n+
    1063
    \n+
    1064 (*this)[0][0] = ((*this)[1][1] * (*this)[2][2] - (*this)[1][2] * (*this)[2][1])*t17;
    \n+
    1065 (*this)[0][1] = -((*this)[0][1] * (*this)[2][2] - (*this)[0][2] * (*this)[2][1])*t17;
    \n+
    1066 (*this)[0][2] = (matrix01 * (*this)[1][2] - (*this)[0][2] * (*this)[1][1])*t17;
    \n+
    1067 (*this)[1][0] = -((*this)[1][0] * (*this)[2][2] - (*this)[1][2] * (*this)[2][0])*t17;
    \n+
    1068 (*this)[1][1] = (matrix00 * (*this)[2][2] - t14) * t17;
    \n+
    1069 (*this)[1][2] = -(t6-t10) * t17;
    \n+
    1070 (*this)[2][0] = (matrix10 * (*this)[2][1] - matrix11 * (*this)[2][0]) * t17;
    \n+
    1071 (*this)[2][1] = -(matrix00 * (*this)[2][1] - t12) * t17;
    \n+
    1072 (*this)[2][2] = (t4-t8) * t17;
    \n+
    1073 }
    \n+
    1074 else {
    \n+
    1075 using std::swap;
    \n+
    1076
    \n+
    1077 AutonomousValue<MAT> A(asImp());
    \n+
    1078 std::vector<simd_index_type> pivot(rows());
    \n+
    1079 Simd::Mask<typename FieldTraits<value_type>::real_type>
    \n+
    1080 nonsingularLanes(true);
    \n+
    1081 AutonomousValue<MAT>::luDecomposition(A, ElimPivot(pivot), nonsingularLanes, true, doPivoting);
    \n+
    1082 auto& L=A;
    \n+
    1083 auto& U=A;
    \n+
    1084
    \n+
    1085 // initialize inverse
    \n+
    1086 *this=field_type();
    \n+
    1087
    \n+
    1088 for(size_type i=0; i<rows(); ++i)
    \n+
    1089 (*this)[i][i]=1;
    \n+
    1090
    \n+
    1091 // L Y = I; multiple right hand sides
    \n+
    1092 for (size_type i=0; i<rows(); i++)
    \n+
    1093 for (size_type j=0; j<i; j++)
    \n+
    1094 for (size_type k=0; k<rows(); k++)
    \n+
    1095 (*this)[i][k] -= L[i][j]*(*this)[j][k];
    \n+
    1096
    \n+
    1097 // U A^{-1} = Y
    \n+
    1098 for (size_type i=rows(); i>0;) {
    \n+
    1099 --i;
    \n+
    1100 for (size_type k=0; k<rows(); k++) {
    \n+
    1101 for (size_type j=i+1; j<rows(); j++)
    \n+
    1102 (*this)[i][k] -= U[i][j]*(*this)[j][k];
    \n+
    1103 (*this)[i][k] /= U[i][i];
    \n+
    1104 }
    \n+
    1105 }
    \n+
    1106
    \n+
    1107 for(size_type i=rows(); i>0; ) {
    \n+
    1108 --i;
    \n+
    1109 for(std::size_t l = 0; l < Simd::lanes((*this)[0][0]); ++l)
    \n+
    1110 {
    \n+
    1111 std::size_t pi = Simd::lane(l, pivot[i]);
    \n+
    1112 if(i!=pi)
    \n+
    1113 for(size_type j=0; j<rows(); ++j)
    \n+
    1114 swap(Simd::lane(l, (*this)[j][pi]),
    \n+
    1115 Simd::lane(l, (*this)[j][ i]));
    \n+
    1116 }
    \n+
    1117 }
    \n+
    1118 }
    \n+
    1119 }
    \n+
    1120
    \n+
    1121 // implementation of the determinant
    \n+
    1122 template<typename MAT>
    \n+
    1123 inline typename DenseMatrix<MAT>::field_type
    \n+
    1124 DenseMatrix<MAT>::determinant(bool doPivoting) const
    \n+
    1125 {
    \n+
    1126 // never mind those ifs, because they get optimized away
    \n+
    1127 if (rows()!=cols())
    \n+
    1128 DUNE_THROW(FMatrixError, "There is no determinant for a " << rows() << "x" << cols() << " matrix!");
    \n+
    1129
    \n+
    1130 if (rows()==1)
    \n+
    1131 return (*this)[0][0];
    \n+
    1132
    \n+
    1133 if (rows()==2)
    \n+
    1134 return (*this)[0][0]*(*this)[1][1] - (*this)[0][1]*(*this)[1][0];
    \n+
    1135
    \n+
    1136 if (rows()==3) {
    \n+
    1137 // code generated by maple
    \n+
    1138 field_type t4 = (*this)[0][0] * (*this)[1][1];
    \n+
    1139 field_type t6 = (*this)[0][0] * (*this)[1][2];
    \n+
    1140 field_type t8 = (*this)[0][1] * (*this)[1][0];
    \n+
    1141 field_type t10 = (*this)[0][2] * (*this)[1][0];
    \n+
    1142 field_type t12 = (*this)[0][1] * (*this)[2][0];
    \n+
    1143 field_type t14 = (*this)[0][2] * (*this)[2][0];
    \n+
    1144
    \n+
    1145 return (t4*(*this)[2][2]-t6*(*this)[2][1]-t8*(*this)[2][2]+
    \n+
    1146 t10*(*this)[2][1]+t12*(*this)[1][2]-t14*(*this)[1][1]);
    \n+
    1147
    \n+
    1148 }
    \n+
    1149
    \n+
    1150 AutonomousValue<MAT> A(asImp());
    \n+
    1151 field_type det;
    \n+
    1152 Simd::Mask<typename FieldTraits<value_type>::real_type>
    \n+
    1153 nonsingularLanes(true);
    \n+
    1154
    \n+
    1155 AutonomousValue<MAT>::luDecomposition(A, ElimDet(det), nonsingularLanes, false, doPivoting);
    \n+
    1156 det = Simd::cond(nonsingularLanes, det, field_type(0));
    \n+
    1157
    \n+
    1158 for (size_type i = 0; i < rows(); ++i)
    \n+
    1159 det *= A[i][i];
    \n+
    1160 return det;
    \n+
    1161 }
    \n+
    1162
    \n+
    1163#endif // DOXYGEN
    \n+
    1164
    \n+
    \n+
    1165 namespace DenseMatrixHelp {
    \n+
    1166
    \n+
    1168 template <typename MAT, typename V1, typename V2>
    \n+
    \n+
    1169 static inline void multAssign(const DenseMatrix<MAT> &matrix, const DenseVector<V1> & x, DenseVector<V2> & ret)
    \n+
    1170 {
    \n+
    1171 DUNE_ASSERT_BOUNDS(x.size() == matrix.cols());
    \n+
    1172 DUNE_ASSERT_BOUNDS(ret.size() == matrix.rows());
    \n+
    1173 typedef typename DenseMatrix<MAT>::size_type size_type;
    \n+
    1174
    \n+
    1175 for(size_type i=0; i<matrix.rows(); ++i)
    \n+
    1176 {
    \n+
    1177 ret[i] = 0.0;
    \n+
    1178 for(size_type j=0; j<matrix.cols(); ++j)
    \n+
    1179 {
    \n+
    1180 ret[i] += matrix[i][j]*x[j];
    \n+
    1181 }
    \n+
    1182 }
    \n+
    1183 }
    \n+
    \n+
    1184
    \n+
    1185#if 0
    \n+
    1187 template <typename K, int rows, int cols>
    \n+
    1188 static inline void multAssignTransposed( const FieldMatrix<K,rows,cols> &matrix, const FieldVector<K,rows> & x, FieldVector<K,cols> & ret)
    \n+
    1189 {
    \n+
    1190 typedef typename FieldMatrix<K,rows,cols>::size_type size_type;
    \n+
    1191
    \n+
    1192 for(size_type i=0; i<cols(); ++i)
    \n+
    1193 {
    \n+
    1194 ret[i] = 0.0;
    \n+
    1195 for(size_type j=0; j<rows(); ++j)
    \n+
    1196 ret[i] += matrix[j][i]*x[j];
    \n+
    1197 }
    \n+
    1198 }
    \n+
    1199
    \n+
    1201 template <typename K, int rows, int cols>
    \n+
    1202 static inline FieldVector<K,rows> mult(const FieldMatrix<K,rows,cols> &matrix, const FieldVector<K,cols> & x)
    \n+
    1203 {
    \n+
    1204 FieldVector<K,rows> ret;
    \n+
    1205 multAssign(matrix,x,ret);
    \n+
    1206 return ret;
    \n+
    1207 }
    \n+
    1208
    \n+
    1210 template <typename K, int rows, int cols>
    \n+
    1211 static inline FieldVector<K,cols> multTransposed(const FieldMatrix<K,rows,cols> &matrix, const FieldVector<K,rows> & x)
    \n+
    1212 {
    \n+
    1213 FieldVector<K,cols> ret;
    \n+
    1214 multAssignTransposed( matrix, x, ret );
    \n+
    1215 return ret;
    \n+
    1216 }
    \n+
    1217#endif
    \n+
    1218
    \n+
    1219 } // end namespace DenseMatrixHelp
    \n+
    \n+
    1220
    \n+
    1222 template<typename MAT>
    \n+
    \n+
    1223 std::ostream& operator<< (std::ostream& s, const DenseMatrix<MAT>& a)
    \n+
    1224 {
    \n+
    1225 for (typename DenseMatrix<MAT>::size_type i=0; i<a.rows(); i++)
    \n+
    1226 s << a[i] << std::endl;
    \n+
    1227 return s;
    \n+
    1228 }
    \n+
    \n+
    1229
    \n+
    1232} // end namespace Dune
    \n+
    1233
    \n+
    1234#endif
    \n+
    Traits for type conversions and type information.
    \n+
    Various precision settings for calculations with FieldMatrix and FieldVector.
    \n+
    Macro for wrapping boundary checks.
    \n+
    A free function to provide the demangled class name of a given object or type as a string.
    \n+
    Some useful basic math stuff.
    \n+
    A few common exception classes.
    \n+
    Implements a vector constructed from a given type representing a field and a compile-time given size.
    \n+
    Implements a scalar vector view wrapper around an existing scalar.
    \n+
    #define DUNE_ASSERT_BOUNDS(cond)
    If DUNE_CHECK_BOUNDS is defined: check if condition cond holds; otherwise, do nothing.
    Definition boundschecking.hh:30
    \n+
    typename AutonomousValueType< T >::type AutonomousValue
    Type free of internal references that T can be converted to.
    Definition typetraits.hh:588
    \n+
    std::ostream & operator<<(std::ostream &s, const bigunsignedint< k > &x)
    Definition bigunsignedint.hh:278
    \n+
    #define DUNE_THROW(E, m)
    Definition exceptions.hh:218
    \n+
    bool anyTrue(const Mask &mask)
    Whether any entry is true
    Definition simd/interface.hh:429
    \n+
    V cond(M &&mask, const V &ifTrue, const V &ifFalse)
    Like the ?: operator.
    Definition simd/interface.hh:386
    \n+
    bool allTrue(const Mask &mask)
    Whether all entries are true
    Definition simd/interface.hh:439
    \n+
    typename Overloads::RebindType< std::decay_t< S >, std::decay_t< V > >::type Rebind
    Construct SIMD type with different scalar type.
    Definition simd/interface.hh:253
    \n+
    constexpr std::size_t lanes()
    Number of lanes in a SIMD type.
    Definition simd/interface.hh:305
    \n+
    decltype(auto) lane(std::size_t l, V &&v)
    Extract an element of a SIMD type.
    Definition simd/interface.hh:324
    \n+
    Mask< V > mask(ADLTag< 0, std::is_same< V, Mask< V > >::value >, const V &v)
    implements Simd::mask()
    Definition defaults.hh:153
    \n+
    STL namespace.
    \n+
    Dune namespace.
    Definition alignedallocator.hh:13
    \n+
    void swap(T &v1, T &v2, bool mask)
    Definition simd.hh:472
    \n+
    int sign(const T &val)
    Return the sign of the value.
    Definition math.hh:180
    \n+
    K conjugateComplex(const K &x)
    compute conjugate complex of x
    Definition math.hh:164
    \n+
    static void multAssign(const DenseMatrix< MAT > &matrix, const DenseVector< V1 > &x, DenseVector< V2 > &ret)
    calculates ret = matrix * x
    Definition densematrix.hh:1169
    \n+
    A dense n x m matrix.
    Definition densematrix.hh:140
    \n+
    ConstIterator const_iterator
    typedef for stl compliant access
    Definition densematrix.hh:244
    \n+
    derived_type operator-() const
    Matrix negation.
    Definition densematrix.hh:298
    \n+
    void solve(V1 &x, const V2 &b, bool doPivoting=true) const
    Solve system A x = b.
    \n+
    void mv(const X &x, Y &y) const
    y = A x
    Definition densematrix.hh:368
    \n+
    Traits::value_type field_type
    export the type representing the field
    Definition densematrix.hh:160
    \n+
    derived_type & axpy(const field_type &a, const DenseMatrix< Other > &x)
    vector space axpy operation (*this += a x)
    Definition densematrix.hh:338
    \n+
    ConstIterator beforeEnd() const
    Definition densematrix.hh:264
    \n+
    derived_type & operator=(const RHS &rhs)
    Definition densematrix.hh:279
    \n+
    void mmtv(const X &x, Y &y) const
    y -= A^T x
    Definition densematrix.hh:458
    \n+
    FieldTraits< vt >::real_type infinity_norm_real() const
    simplified infinity norm (uses Manhattan norm for complex values)
    Definition densematrix.hh:561
    \n+
    std::remove_reference< const_row_reference >::type::ConstIterator ConstColIterator
    rename the iterators for easier access
    Definition densematrix.hh:248
    \n+
    ConstIterator beforeBegin() const
    Definition densematrix.hh:271
    \n+
    void invert(bool doPivoting=true)
    Compute inverse.
    \n+
    static void luDecomposition(DenseMatrix< MAT > &A, Func func, Mask &nonsingularLanes, bool throwEarly, bool doPivoting)
    do an LU-Decomposition on matrix A
    \n+
    Traits::value_type block_type
    export the type representing the components
    Definition densematrix.hh:163
    \n+
    void mtv(const X &x, Y &y) const
    y = A^T x
    Definition densematrix.hh:387
    \n+
    constexpr size_type cols() const
    number of columns
    Definition densematrix.hh:715
    \n+
    size_type size() const
    size method (number of rows)
    Definition densematrix.hh:200
    \n+
    constexpr size_type M() const
    number of columns
    Definition densematrix.hh:703
    \n+
    MAT & rightmultiply(const DenseMatrix< M2 > &M)
    Multiplies M from the right to this matrix.
    Definition densematrix.hh:645
    \n+
    Iterator end()
    end iterator
    Definition densematrix.hh:222
    \n+
    Iterator beforeBegin()
    Definition densematrix.hh:236
    \n+
    derived_type & operator/=(const field_type &k)
    vector space division by scalar
    Definition densematrix.hh:329
    \n+
    derived_type & operator*=(const field_type &k)
    vector space multiplication with scalar
    Definition densematrix.hh:321
    \n+
    Iterator beforeEnd()
    Definition densematrix.hh:229
    \n+
    Traits::value_type value_type
    export the type representing the field
    Definition densematrix.hh:157
    \n+
    void usmv(const typename FieldTraits< Y >::field_type &alpha, const X &x, Y &y) const
    y += alpha A x
    Definition densematrix.hh:484
    \n+
    void usmhv(const typename FieldTraits< Y >::field_type &alpha, const X &x, Y &y) const
    y += alpha A^H x
    Definition densematrix.hh:512
    \n+
    void mmv(const X &x, Y &y) const
    y -= A x
    Definition densematrix.hh:445
    \n+
    constexpr size_type rows() const
    number of rows
    Definition densematrix.hh:709
    \n+
    MAT & leftmultiply(const DenseMatrix< M2 > &M)
    Multiplies M from the left to this matrix.
    Definition densematrix.hh:627
    \n+
    void usmtv(const typename FieldTraits< Y >::field_type &alpha, const X &x, Y &y) const
    y += alpha A^T x
    Definition densematrix.hh:498
    \n+
    derived_type & operator-=(const DenseMatrix< Other > &x)
    vector space subtraction
    Definition densematrix.hh:312
    \n+
    bool operator!=(const DenseMatrix< Other > &x) const
    Binary matrix incomparison.
    Definition densematrix.hh:358
    \n+
    void mmhv(const X &x, Y &y) const
    y -= A^H x
    Definition densematrix.hh:471
    \n+
    Traits::derived_type derived_type
    type of derived matrix class
    Definition densematrix.hh:154
    \n+
    row_reference operator[](size_type i)
    random access
    Definition densematrix.hh:189
    \n+
    bool exists(size_type i, size_type j) const
    return true when (i,j) is in pattern
    Definition densematrix.hh:723
    \n+
    Iterator RowIterator
    rename the iterators for easier access
    Definition densematrix.hh:211
    \n+
    static constexpr int blocklevel
    The number of block levels we contain. This is the leaf, that is, 1.
    Definition densematrix.hh:178
    \n+
    FieldTraits< value_type >::real_type frobenius_norm() const
    frobenius norm: sqrt(sum over squared values of entries)
    Definition densematrix.hh:528
    \n+
    void umv(const X &x, Y &y) const
    y += A x
    Definition densematrix.hh:406
    \n+
    DenseIterator< const DenseMatrix, const row_type, const_row_reference > ConstIterator
    Iterator class for sequential access.
    Definition densematrix.hh:242
    \n+
    FieldTraits< vt >::real_type infinity_norm() const
    infinity norm (row sum norm, how to generalize for blocks?)
    Definition densematrix.hh:546
    \n+
    Traits::row_type row_type
    The type used to represent a row (must fulfill the Dune::DenseVector interface)
    Definition densematrix.hh:169
    \n+
    constexpr size_type N() const
    number of rows
    Definition densematrix.hh:697
    \n+
    Traits::size_type size_type
    The type used for the index access and size operation.
    Definition densematrix.hh:166
    \n+
    Traits::const_row_reference const_row_reference
    The type used to represent a reference to a constant row (usually const row_type &)
    Definition densematrix.hh:175
    \n+
    FieldTraits< value_type >::real_type frobenius_norm2() const
    square of frobenius norm, need for block recursion
    Definition densematrix.hh:536
    \n+
    std::remove_reference< row_reference >::type::Iterator ColIterator
    rename the iterators for easier access
    Definition densematrix.hh:213
    \n+
    Traits::row_reference row_reference
    The type used to represent a reference to a row (usually row_type &)
    Definition densematrix.hh:172
    \n+
    bool operator==(const DenseMatrix< Other > &x) const
    Binary matrix comparison.
    Definition densematrix.hh:348
    \n+
    Iterator iterator
    typedef for stl compliant access
    Definition densematrix.hh:209
    \n+
    ConstIterator ConstRowIterator
    rename the iterators for easier access
    Definition densematrix.hh:246
    \n+
    DenseIterator< DenseMatrix, row_type, row_reference > Iterator
    Iterator class for sequential access.
    Definition densematrix.hh:207
    \n+
    void umtv(const X &x, Y &y) const
    y += A^T x
    Definition densematrix.hh:419
    \n+
    ConstIterator begin() const
    begin iterator
    Definition densematrix.hh:251
    \n+
    field_type determinant(bool doPivoting=true) const
    calculates the determinant of this matrix
    \n+
    Iterator begin()
    begin iterator
    Definition densematrix.hh:216
    \n+
    void umhv(const X &x, Y &y) const
    y += A^H x
    Definition densematrix.hh:432
    \n+
    derived_type & operator+=(const DenseMatrix< Other > &x)
    vector space addition
    Definition densematrix.hh:289
    \n+
    ConstIterator end() const
    end iterator
    Definition densematrix.hh:257
    \n+
    const FieldTraits< typenameDenseMatVecTraits< M >::value_type >::real_type real_type
    Definition densematrix.hh:34
    \n+
    const FieldTraits< typenameDenseMatVecTraits< M >::value_type >::field_type field_type
    Definition densematrix.hh:33
    \n+
    A dense n x m matrix.
    Definition fmatrix.hh:117
    \n+
    Base::size_type size_type
    Definition fmatrix.hh:127
    \n+
    vector space out of a tensor product of fields.
    Definition fvector.hh:91
    \n+
    you have to specialize this structure for any type that should be assignable to a DenseMatrix
    Definition densematrix.hh:59
    \n+
    Error thrown if operations of a FieldMatrix fail.
    Definition densematrix.hh:126
    \n+
    Interface for a class of dense vectors over a given field.
    Definition densevector.hh:229
    \n+
    size_type size() const
    size method
    Definition densevector.hh:336
    \n+
    Generic iterator class for dense vector and matrix implementations.
    Definition densevector.hh:131
    \n+
    Default exception class for mathematical errors.
    Definition exceptions.hh:241
    \n+
    Definition ftraits.hh:26
    \n+
    T field_type
    export the type representing the field
    Definition ftraits.hh:28
    \n+
    T real_type
    export the type representing the real type of the field
    Definition ftraits.hh:30
    \n+
    Definition matvectraits.hh:31
    \n+
    static ctype absolute_limit()
    return threshold to declare matrix singular
    Definition precision.hh:28
    \n+
    Include file for users of the SIMD abstraction layer.
    \n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,65 +1,1521 @@\n dune-common\u00a02.10\n Loading...\n Searching...\n No Matches\n * _\bd_\bu_\bn_\be\n * _\bc_\bo_\bm_\bm_\bo_\bn\n- * _\bs_\bt_\bd\n- * _\bi_\bm_\bp_\bl\n-fwd_layouts.hh\n+densematrix.hh\n _\bG_\bo_\b _\bt_\bo_\b _\bt_\bh_\be_\b _\bd_\bo_\bc_\bu_\bm_\be_\bn_\bt_\ba_\bt_\bi_\bo_\bn_\b _\bo_\bf_\b _\bt_\bh_\bi_\bs_\b _\bf_\bi_\bl_\be_\b.\n 1// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-\n 2// vi: set et ts=4 sw=2 sts=2:\n 3// SPDX-FileCopyrightInfo: Copyright \u00c2\u00a9 DUNE Project contributors, see file\n LICENSE.md in module root\n 4// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception\n-5#ifndef DUNE_COMMON_STD_IMPL_FWD_LAYOUTS_HH\n-6#define DUNE_COMMON_STD_IMPL_FWD_LAYOUTS_HH\n+5#ifndef DUNE_DENSEMATRIX_HH\n+6#define DUNE_DENSEMATRIX_HH\n 7\n-8namespace _\bD_\bu_\bn_\be_\b:_\b:_\bS_\bt_\bd {\n-9\n-_\b1_\b6struct _\bl_\ba_\by_\bo_\bu_\bt_\b__\bl_\be_\bf_\bt\n-17{\n-18 template \n-19 class _\bm_\ba_\bp_\bp_\bi_\bn_\bg;\n-20};\n-21\n-_\b2_\b9struct _\bl_\ba_\by_\bo_\bu_\bt_\b__\br_\bi_\bg_\bh_\bt\n-30{\n-31 template \n-32 class _\bm_\ba_\bp_\bp_\bi_\bn_\bg;\n-33};\n-34\n-_\b3_\b9struct _\bl_\ba_\by_\bo_\bu_\bt_\b__\bs_\bt_\br_\bi_\bd_\be\n-40{\n-41 template \n-42 class _\bm_\ba_\bp_\bp_\bi_\bn_\bg;\n-43};\n-44\n-45} // end namespace Dune::Std\n-46\n-47#endif // DUNE_COMMON_STD_IMPL_FWD_LAYOUTS_HH\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bt_\bd\n-Namespace for features backported from new C++ standards.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn default_accessor.hh:10\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bt_\bd_\b:_\b:_\bl_\ba_\by_\bo_\bu_\bt_\b__\bl_\be_\bf_\bt\n-A layout where the leftmost extent has stride 1.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn fwd_layouts.hh:17\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bt_\bd_\b:_\b:_\bl_\ba_\by_\bo_\bu_\bt_\b__\bl_\be_\bf_\bt_\b:_\b:_\bm_\ba_\bp_\bp_\bi_\bn_\bg\n-A layout mapping where the leftmost extent has stride 1.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn layout_left.hh:19\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bt_\bd_\b:_\b:_\bl_\ba_\by_\bo_\bu_\bt_\b__\br_\bi_\bg_\bh_\bt\n-A layout where the rightmost extent has stride 1, and strides increase right-\n-to-left as the product o...\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn fwd_layouts.hh:30\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bt_\bd_\b:_\b:_\bl_\ba_\by_\bo_\bu_\bt_\b__\br_\bi_\bg_\bh_\bt_\b:_\b:_\bm_\ba_\bp_\bp_\bi_\bn_\bg\n-A layout mapping where the rightmost extent has stride 1.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn layout_right.hh:19\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bt_\bd_\b:_\b:_\bl_\ba_\by_\bo_\bu_\bt_\b__\bs_\bt_\br_\bi_\bd_\be\n-A layout mapping where the strides are user-defined.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn fwd_layouts.hh:40\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bt_\bd_\b:_\b:_\bl_\ba_\by_\bo_\bu_\bt_\b__\bs_\bt_\br_\bi_\bd_\be_\b:_\b:_\bm_\ba_\bp_\bp_\bi_\bn_\bg\n-A layout mapping where the strides are user-defined.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn layout_stride.hh:19\n+8#include \n+9#include \n+10#include \n+11#include \n+12#include \n+13#include \n+14\n+15#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bb_\bo_\bu_\bn_\bd_\bs_\bc_\bh_\be_\bc_\bk_\bi_\bn_\bg_\b._\bh_\bh>\n+16#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bc_\bl_\ba_\bs_\bs_\bn_\ba_\bm_\be_\b._\bh_\bh>\n+17#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\be_\bx_\bc_\be_\bp_\bt_\bi_\bo_\bn_\bs_\b._\bh_\bh>\n+18#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bf_\bv_\be_\bc_\bt_\bo_\br_\b._\bh_\bh>\n+19#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bm_\ba_\bt_\bh_\b._\bh_\bh>\n+20#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bp_\br_\be_\bc_\bi_\bs_\bi_\bo_\bn_\b._\bh_\bh>\n+21#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bs_\bi_\bm_\bd_\b/_\bs_\bi_\bm_\bd_\b._\bh_\bh>\n+22#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bt_\by_\bp_\be_\bt_\br_\ba_\bi_\bt_\bs_\b._\bh_\bh>\n+23#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bs_\bc_\ba_\bl_\ba_\br_\bv_\be_\bc_\bt_\bo_\br_\bv_\bi_\be_\bw_\b._\bh_\bh>\n+24\n+25namespace _\bD_\bu_\bn_\be\n+26{\n+27\n+28 template class DenseMatrix;\n+29\n+30 template\n+_\b3_\b1 struct _\bF_\bi_\be_\bl_\bd_\bT_\br_\ba_\bi_\bt_\bs< _\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx >\n+32 {\n+_\b3_\b3 typedef const typename _\bF_\bi_\be_\bl_\bd_\bT_\br_\ba_\bi_\bt_\bs_\b<_\b _\bt_\by_\bp_\be_\bn_\ba_\bm_\be_\b _\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\bV_\be_\bc_\bT_\br_\ba_\bi_\bt_\bs_\b<_\bM_\b>_\b:_\b:\n+_\bv_\ba_\bl_\bu_\be_\b__\bt_\by_\bp_\be >_\b:_\b:_\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be _\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be;\n+_\b3_\b4 typedef const typename _\bF_\bi_\be_\bl_\bd_\bT_\br_\ba_\bi_\bt_\bs_\b<_\b _\bt_\by_\bp_\be_\bn_\ba_\bm_\be_\b _\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\bV_\be_\bc_\bT_\br_\ba_\bi_\bt_\bs_\b<_\bM_\b>_\b:_\b:\n+_\bv_\ba_\bl_\bu_\be_\b__\bt_\by_\bp_\be >_\b:_\b:_\br_\be_\ba_\bl_\b__\bt_\by_\bp_\be _\br_\be_\ba_\bl_\b__\bt_\by_\bp_\be;\n+35 };\n+36\n+37 template class _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx;\n+38 template class _\bF_\bi_\be_\bl_\bd_\bV_\be_\bc_\bt_\bo_\br;\n+39\n+58 template< class DenseMatrix, class RHS >\n+_\b5_\b9 struct _\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\bA_\bs_\bs_\bi_\bg_\bn_\be_\br;\n+60\n+61#ifndef DOXYGEN\n+62 namespace Impl\n+63 {\n+64\n+65 template< class DenseMatrix, class RHS, class = void >\n+66 class _\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\bA_\bs_\bs_\bi_\bg_\bn_\be_\br\n+67 {};\n+68\n+69 template< class DenseMatrix, class RHS >\n+70 class _\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\bA_\bs_\bs_\bi_\bg_\bn_\be_\br< _\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx, RHS, _\bs_\bt_\bd::enable_if_t< Dune::\n+IsNumber< RHS >::value > >\n+71 {\n+72 public:\n+73 static void apply ( _\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx &denseMatrix, const RHS &rhs )\n+74 {\n+75 typedef typename _\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be field_type;\n+76 std::fill( denseMatrix._\bb_\be_\bg_\bi_\bn(), denseMatrix._\be_\bn_\bd(), static_cast< field_type >\n+( rhs ) );\n+77 }\n+78 };\n+79\n+80 template< class DenseMatrix, class RHS >\n+81 class DenseMatrixAssigner< DenseMatrix, RHS, _\bs_\bt_\bd::enable_if_t< !std::\n+is_same< typename RHS::const_iterator, void >::value\n+82 && std::is_convertible< typename RHS::const_iterator::value_type, typename\n+DenseMatrix::iterator::value_type >::value > >\n+83 {\n+84 public:\n+85 static void apply ( DenseMatrix &denseMatrix, const RHS &rhs )\n+86 {\n+87 _\bD_\bU_\bN_\bE_\b__\bA_\bS_\bS_\bE_\bR_\bT_\b__\bB_\bO_\bU_\bN_\bD_\bS(rhs.N() == denseMatrix.N());\n+88 _\bD_\bU_\bN_\bE_\b__\bA_\bS_\bS_\bE_\bR_\bT_\b__\bB_\bO_\bU_\bN_\bD_\bS(rhs.M() == denseMatrix.M());\n+89 typename DenseMatrix::iterator tIt = std::begin(denseMatrix);\n+90 typename RHS::const_iterator sIt = std::begin(rhs);\n+91 for(; sIt != std::end(rhs); ++tIt, ++sIt)\n+92 std::copy(std::begin(*sIt), std::end(*sIt), std::begin(*tIt));\n+93 }\n+94 };\n+95\n+96 } // namespace Impl\n+97\n+98\n+99\n+100 template< class DenseMatrix, class RHS >\n+101 struct DenseMatrixAssigner\n+102 : public Impl::DenseMatrixAssigner< DenseMatrix, RHS >\n+103 {};\n+104\n+105\n+106 namespace Impl\n+107 {\n+108\n+109 template< class DenseMatrix, class RHS >\n+110 std::true_type hasDenseMatrixAssigner ( DenseMatrix &, const RHS &,\n+decltype( _\bD_\bu_\bn_\be_\b:_\b:_\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\bA_\bs_\bs_\bi_\bg_\bn_\be_\br_\b<_\b _\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\b,_\b _\bR_\bH_\bS_\b _\b>_\b:_\b:_\ba_\bp_\bp_\bl_\by( std::declval<\n+DenseMatrix & >(), std::declval< const RHS & >() ) ) * = nullptr );\n+111\n+112 std::false_type hasDenseMatrixAssigner ( ... );\n+113\n+114 } // namespace Impl\n+115\n+116 template< class DenseMatrix, class RHS >\n+117 struct HasDenseMatrixAssigner\n+118 : public decltype( Impl::hasDenseMatrixAssigner( std::declval< DenseMatrix\n+& >(), std::declval< const RHS & >() ) )\n+119 {};\n+120\n+121#endif // #ifndef DOXYGEN\n+122\n+123\n+124\n+_\b1_\b2_\b6 class _\bF_\bM_\ba_\bt_\br_\bi_\bx_\bE_\br_\br_\bo_\br : public _\bM_\ba_\bt_\bh_\bE_\br_\br_\bo_\br {};\n+127\n+138 template\n+_\b1_\b3_\b9 class _\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx\n+140 {\n+141 typedef _\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\bV_\be_\bc_\bT_\br_\ba_\bi_\bt_\bs_\b<_\bM_\bA_\bT_\b> _\bT_\br_\ba_\bi_\bt_\bs;\n+142\n+143 // Curiously recurring template pattern\n+144 constexpr MAT & asImp() { return static_cast(*this); }\n+145 constexpr const MAT & asImp() const { return static_cast\n+(*this); }\n+146\n+147 template \n+_\b1_\b4_\b8 friend class _\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx;\n+149\n+150 public:\n+151 //===== type definitions and constants\n+152\n+_\b1_\b5_\b4 typedef typename Traits::derived_type _\bd_\be_\br_\bi_\bv_\be_\bd_\b__\bt_\by_\bp_\be;\n+155\n+_\b1_\b5_\b7 typedef typename Traits::value_type _\bv_\ba_\bl_\bu_\be_\b__\bt_\by_\bp_\be;\n+158\n+_\b1_\b6_\b0 typedef typename Traits::value_type _\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be;\n+161\n+_\b1_\b6_\b3 typedef typename Traits::value_type _\bb_\bl_\bo_\bc_\bk_\b__\bt_\by_\bp_\be;\n+164\n+_\b1_\b6_\b6 typedef typename Traits::size_type _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be;\n+167\n+_\b1_\b6_\b9 typedef typename Traits::row_type _\br_\bo_\bw_\b__\bt_\by_\bp_\be;\n+170\n+_\b1_\b7_\b2 typedef typename Traits::row_reference _\br_\bo_\bw_\b__\br_\be_\bf_\be_\br_\be_\bn_\bc_\be;\n+173\n+_\b1_\b7_\b5 typedef typename Traits::const_row_reference _\bc_\bo_\bn_\bs_\bt_\b__\br_\bo_\bw_\b__\br_\be_\bf_\be_\br_\be_\bn_\bc_\be;\n+176\n+_\b1_\b7_\b8 constexpr static int _\bb_\bl_\bo_\bc_\bk_\bl_\be_\bv_\be_\bl = 1;\n+179\n+180 private:\n+183 using simd_index_type = _\bS_\bi_\bm_\bd_\b:_\b:_\bR_\be_\bb_\bi_\bn_\bd_\b<_\bs_\bt_\bd_\b:_\b:_\bs_\bi_\bz_\be_\b__\bt_\b,_\b _\bv_\ba_\bl_\bu_\be_\b__\bt_\by_\bp_\be_\b>;\n+184\n+185 public:\n+186 //===== access to components\n+187\n+_\b1_\b8_\b9 _\br_\bo_\bw_\b__\br_\be_\bf_\be_\br_\be_\bn_\bc_\be _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b[_\b]_\b ( _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be i )\n+190 {\n+191 return asImp().mat_access(i);\n+192 }\n+193\n+_\b1_\b9_\b4 _\bc_\bo_\bn_\bs_\bt_\b__\br_\bo_\bw_\b__\br_\be_\bf_\be_\br_\be_\bn_\bc_\be _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b[_\b]_\b ( _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be i ) const\n+195 {\n+196 return asImp().mat_access(i);\n+197 }\n+198\n+_\b2_\b0_\b0 _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be _\bs_\bi_\bz_\be() const\n+201 {\n+202 return _\br_\bo_\bw_\bs();\n+203 }\n+204\n+205 //===== iterator interface to rows of the matrix\n+_\b2_\b0_\b7 typedef _\bD_\be_\bn_\bs_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b<_\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\b,_\br_\bo_\bw_\b__\bt_\by_\bp_\be_\b,_\br_\bo_\bw_\b__\br_\be_\bf_\be_\br_\be_\bn_\bc_\be_\b> _\bI_\bt_\be_\br_\ba_\bt_\bo_\br;\n+_\b2_\b0_\b9 typedef _\bI_\bt_\be_\br_\ba_\bt_\bo_\br _\bi_\bt_\be_\br_\ba_\bt_\bo_\br;\n+_\b2_\b1_\b1 typedef _\bI_\bt_\be_\br_\ba_\bt_\bo_\br _\bR_\bo_\bw_\bI_\bt_\be_\br_\ba_\bt_\bo_\br;\n+_\b2_\b1_\b3 typedef typename std::remove_reference::type::Iterator\n+_\bC_\bo_\bl_\bI_\bt_\be_\br_\ba_\bt_\bo_\br;\n+214\n+_\b2_\b1_\b6 _\bI_\bt_\be_\br_\ba_\bt_\bo_\br _\bb_\be_\bg_\bi_\bn ()\n+217 {\n+218 return _\bI_\bt_\be_\br_\ba_\bt_\bo_\br(*this,0);\n+219 }\n+220\n+_\b2_\b2_\b2 _\bI_\bt_\be_\br_\ba_\bt_\bo_\br _\be_\bn_\bd ()\n+223 {\n+224 return _\bI_\bt_\be_\br_\ba_\bt_\bo_\br(*this,_\br_\bo_\bw_\bs());\n+225 }\n+226\n+_\b2_\b2_\b9 _\bI_\bt_\be_\br_\ba_\bt_\bo_\br _\bb_\be_\bf_\bo_\br_\be_\bE_\bn_\bd ()\n+230 {\n+231 return _\bI_\bt_\be_\br_\ba_\bt_\bo_\br(*this,_\br_\bo_\bw_\bs()-1);\n+232 }\n+233\n+_\b2_\b3_\b6 _\bI_\bt_\be_\br_\ba_\bt_\bo_\br _\bb_\be_\bf_\bo_\br_\be_\bB_\be_\bg_\bi_\bn ()\n+237 {\n+238 return _\bI_\bt_\be_\br_\ba_\bt_\bo_\br(*this,-1);\n+239 }\n+240\n+_\b2_\b4_\b2 typedef _\bD_\be_\bn_\bs_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b<_\bc_\bo_\bn_\bs_\bt_\b _\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\b,_\bc_\bo_\bn_\bs_\bt_\b _\br_\bo_\bw_\b__\bt_\by_\bp_\be_\b,_\bc_\bo_\bn_\bs_\bt_\b__\br_\bo_\bw_\b__\br_\be_\bf_\be_\br_\be_\bn_\bc_\be_\b>\n+_\bC_\bo_\bn_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br;\n+_\b2_\b4_\b4 typedef _\bC_\bo_\bn_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br _\bc_\bo_\bn_\bs_\bt_\b__\bi_\bt_\be_\br_\ba_\bt_\bo_\br;\n+_\b2_\b4_\b6 typedef _\bC_\bo_\bn_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br _\bC_\bo_\bn_\bs_\bt_\bR_\bo_\bw_\bI_\bt_\be_\br_\ba_\bt_\bo_\br;\n+_\b2_\b4_\b8 typedef typename std::remove_reference::type::\n+ConstIterator _\bC_\bo_\bn_\bs_\bt_\bC_\bo_\bl_\bI_\bt_\be_\br_\ba_\bt_\bo_\br;\n+249\n+_\b2_\b5_\b1 _\bC_\bo_\bn_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br _\bb_\be_\bg_\bi_\bn () const\n+252 {\n+253 return _\bC_\bo_\bn_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br(*this,0);\n+254 }\n+255\n+_\b2_\b5_\b7 _\bC_\bo_\bn_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br _\be_\bn_\bd () const\n+258 {\n+259 return _\bC_\bo_\bn_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br(*this,_\br_\bo_\bw_\bs());\n+260 }\n+261\n+_\b2_\b6_\b4 _\bC_\bo_\bn_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br _\bb_\be_\bf_\bo_\br_\be_\bE_\bn_\bd () const\n+265 {\n+266 return _\bC_\bo_\bn_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br(*this,_\br_\bo_\bw_\bs()-1);\n+267 }\n+268\n+_\b2_\b7_\b1 _\bC_\bo_\bn_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br _\bb_\be_\bf_\bo_\br_\be_\bB_\be_\bg_\bi_\bn () const\n+272 {\n+273 return _\bC_\bo_\bn_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br(*this,-1);\n+274 }\n+275\n+276 //===== assignment\n+277\n+278 template< class RHS, class = std::enable_if_t< HasDenseMatrixAssigner< MAT,\n+RHS >::value > >\n+_\b2_\b7_\b9 _\bd_\be_\br_\bi_\bv_\be_\bd_\b__\bt_\by_\bp_\be &_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b=_\b ( const RHS &rhs )\n+280 {\n+281 _\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\bA_\bs_\bs_\bi_\bg_\bn_\be_\br_\b<_\b _\bM_\bA_\bT_\b,_\b _\bR_\bH_\bS_\b _\b>_\b:_\b:_\ba_\bp_\bp_\bl_\by( asImp(), rhs );\n+282 return asImp();\n+283 }\n+284\n+285 //===== vector space arithmetic\n+286\n+288 template \n+_\b2_\b8_\b9 _\bd_\be_\br_\bi_\bv_\be_\bd_\b__\bt_\by_\bp_\be &_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b+_\b=_\b (const _\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bO_\bt_\bh_\be_\br_\b>& x)\n+290 {\n+291 _\bD_\bU_\bN_\bE_\b__\bA_\bS_\bS_\bE_\bR_\bT_\b__\bB_\bO_\bU_\bN_\bD_\bS(_\br_\bo_\bw_\bs() == x._\br_\bo_\bw_\bs());\n+292 for (_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be i=0; i<_\br_\bo_\bw_\bs(); i++)\n+293 (*this)[i] += x[i];\n+294 return asImp();\n+295 }\n+296\n+_\b2_\b9_\b8 _\bd_\be_\br_\bi_\bv_\be_\bd_\b__\bt_\by_\bp_\be _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b-_\b () const\n+299 {\n+300 MAT result;\n+301 using idx_type = typename decltype(result)_\b:_\b:_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be;\n+302\n+303 for (idx_type i = 0; i < _\br_\bo_\bw_\bs(); ++i)\n+304 for (idx_type j = 0; j < _\bc_\bo_\bl_\bs(); ++j)\n+305 result[i][j] = - asImp()[i][j];\n+306\n+307 return result;\n+308 }\n+309\n+311 template \n+_\b3_\b1_\b2 _\bd_\be_\br_\bi_\bv_\be_\bd_\b__\bt_\by_\bp_\be &_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b-_\b=_\b (const _\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bO_\bt_\bh_\be_\br_\b>& x)\n+313 {\n+314 _\bD_\bU_\bN_\bE_\b__\bA_\bS_\bS_\bE_\bR_\bT_\b__\bB_\bO_\bU_\bN_\bD_\bS(_\br_\bo_\bw_\bs() == x._\br_\bo_\bw_\bs());\n+315 for (_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be i=0; i<_\br_\bo_\bw_\bs(); i++)\n+316 (*this)[i] -= x[i];\n+317 return asImp();\n+318 }\n+319\n+_\b3_\b2_\b1 _\bd_\be_\br_\bi_\bv_\be_\bd_\b__\bt_\by_\bp_\be &_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b*_\b=_\b (const _\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be& k)\n+322 {\n+323 for (_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be i=0; i<_\br_\bo_\bw_\bs(); i++)\n+324 (*this)[i] *= k;\n+325 return asImp();\n+326 }\n+327\n+_\b3_\b2_\b9 _\bd_\be_\br_\bi_\bv_\be_\bd_\b__\bt_\by_\bp_\be &_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b/_\b=_\b (const _\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be& k)\n+330 {\n+331 for (_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be i=0; i<_\br_\bo_\bw_\bs(); i++)\n+332 (*this)[i] /= k;\n+333 return asImp();\n+334 }\n+335\n+337 template \n+_\b3_\b3_\b8 _\bd_\be_\br_\bi_\bv_\be_\bd_\b__\bt_\by_\bp_\be &_\ba_\bx_\bp_\by (const _\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be &a, const _\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bO_\bt_\bh_\be_\br_\b> &x )\n+339 {\n+340 _\bD_\bU_\bN_\bE_\b__\bA_\bS_\bS_\bE_\bR_\bT_\b__\bB_\bO_\bU_\bN_\bD_\bS(_\br_\bo_\bw_\bs() == x._\br_\bo_\bw_\bs());\n+341 for( _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be i = 0; i < _\br_\bo_\bw_\bs(); ++i )\n+342 (*this)[ i ].axpy( a, x[ i ] );\n+343 return asImp();\n+344 }\n+345\n+347 template \n+_\b3_\b4_\b8 bool _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b=_\b=_\b (const _\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bO_\bt_\bh_\be_\br_\b>& x) const\n+349 {\n+350 _\bD_\bU_\bN_\bE_\b__\bA_\bS_\bS_\bE_\bR_\bT_\b__\bB_\bO_\bU_\bN_\bD_\bS(_\br_\bo_\bw_\bs() == x._\br_\bo_\bw_\bs());\n+351 for (_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be i=0; i<_\br_\bo_\bw_\bs(); i++)\n+352 if ((*this)[i]!=x[i])\n+353 return false;\n+354 return true;\n+355 }\n+357 template \n+_\b3_\b5_\b8 bool _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b!_\b=_\b (const _\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bO_\bt_\bh_\be_\br_\b>& x) const\n+359 {\n+360 return !_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b=_\b=(x);\n+361 }\n+362\n+363\n+364 //===== linear maps\n+365\n+367 template\n+_\b3_\b6_\b8 void _\bm_\bv (const X& x, Y& y) const\n+369 {\n+370 auto&& xx = Impl::asVector(x);\n+371 auto&& yy = Impl::asVector(y);\n+372 _\bD_\bU_\bN_\bE_\b__\bA_\bS_\bS_\bE_\bR_\bT_\b__\bB_\bO_\bU_\bN_\bD_\bS((void*)(&x) != (void*)(&y));\n+373 _\bD_\bU_\bN_\bE_\b__\bA_\bS_\bS_\bE_\bR_\bT_\b__\bB_\bO_\bU_\bN_\bD_\bS(xx.N() == _\bM());\n+374 _\bD_\bU_\bN_\bE_\b__\bA_\bS_\bS_\bE_\bR_\bT_\b__\bB_\bO_\bU_\bN_\bD_\bS(yy.N() == _\bN());\n+375\n+376 using y_field_type = typename _\bF_\bi_\be_\bl_\bd_\bT_\br_\ba_\bi_\bt_\bs_\b<_\bY_\b>_\b:_\b:_\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be;\n+377 for (_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be i=0; i<_\br_\bo_\bw_\bs(); ++i)\n+378 {\n+379 yy[i] = y_field_type(0);\n+380 for (_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be j=0; j<_\bc_\bo_\bl_\bs(); j++)\n+381 yy[i] += (*this)[i][j] * xx[j];\n+382 }\n+383 }\n+384\n+386 template< class X, class Y >\n+_\b3_\b8_\b7 void _\bm_\bt_\bv ( const X &x, Y &y ) const\n+388 {\n+389 auto&& xx = Impl::asVector(x);\n+390 auto&& yy = Impl::asVector(y);\n+391 _\bD_\bU_\bN_\bE_\b__\bA_\bS_\bS_\bE_\bR_\bT_\b__\bB_\bO_\bU_\bN_\bD_\bS((void*)(&x) != (void*)(&y));\n+392 _\bD_\bU_\bN_\bE_\b__\bA_\bS_\bS_\bE_\bR_\bT_\b__\bB_\bO_\bU_\bN_\bD_\bS(xx.N() == _\bN());\n+393 _\bD_\bU_\bN_\bE_\b__\bA_\bS_\bS_\bE_\bR_\bT_\b__\bB_\bO_\bU_\bN_\bD_\bS(yy.N() == _\bM());\n+394\n+395 using y_field_type = typename _\bF_\bi_\be_\bl_\bd_\bT_\br_\ba_\bi_\bt_\bs_\b<_\bY_\b>_\b:_\b:_\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be;\n+396 for(_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be i = 0; i < _\bc_\bo_\bl_\bs(); ++i)\n+397 {\n+398 yy[i] = y_field_type(0);\n+399 for(_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be j = 0; j < _\br_\bo_\bw_\bs(); ++j)\n+400 yy[i] += (*this)[j][i] * xx[j];\n+401 }\n+402 }\n+403\n+405 template\n+_\b4_\b0_\b6 void _\bu_\bm_\bv (const X& x, Y& y) const\n+407 {\n+408 auto&& xx = Impl::asVector(x);\n+409 auto&& yy = Impl::asVector(y);\n+410 _\bD_\bU_\bN_\bE_\b__\bA_\bS_\bS_\bE_\bR_\bT_\b__\bB_\bO_\bU_\bN_\bD_\bS(xx.N() == _\bM());\n+411 _\bD_\bU_\bN_\bE_\b__\bA_\bS_\bS_\bE_\bR_\bT_\b__\bB_\bO_\bU_\bN_\bD_\bS(yy.N() == _\bN());\n+412 for (_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be i=0; i<_\br_\bo_\bw_\bs(); ++i)\n+413 for (_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be j=0; j<_\bc_\bo_\bl_\bs(); j++)\n+414 yy[i] += (*this)[i][j] * xx[j];\n+415 }\n+416\n+418 template\n+_\b4_\b1_\b9 void _\bu_\bm_\bt_\bv (const X& x, Y& y) const\n+420 {\n+421 auto&& xx = Impl::asVector(x);\n+422 auto&& yy = Impl::asVector(y);\n+423 _\bD_\bU_\bN_\bE_\b__\bA_\bS_\bS_\bE_\bR_\bT_\b__\bB_\bO_\bU_\bN_\bD_\bS(xx.N() == _\bN());\n+424 _\bD_\bU_\bN_\bE_\b__\bA_\bS_\bS_\bE_\bR_\bT_\b__\bB_\bO_\bU_\bN_\bD_\bS(yy.N() == _\bM());\n+425 for(_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be i = 0; i<_\br_\bo_\bw_\bs(); ++i)\n+426 for (_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be j=0; j<_\bc_\bo_\bl_\bs(); j++)\n+427 yy[j] += (*this)[i][j]*xx[i];\n+428 }\n+429\n+431 template\n+_\b4_\b3_\b2 void _\bu_\bm_\bh_\bv (const X& x, Y& y) const\n+433 {\n+434 auto&& xx = Impl::asVector(x);\n+435 auto&& yy = Impl::asVector(y);\n+436 _\bD_\bU_\bN_\bE_\b__\bA_\bS_\bS_\bE_\bR_\bT_\b__\bB_\bO_\bU_\bN_\bD_\bS(xx.N() == _\bN());\n+437 _\bD_\bU_\bN_\bE_\b__\bA_\bS_\bS_\bE_\bR_\bT_\b__\bB_\bO_\bU_\bN_\bD_\bS(yy.N() == _\bM());\n+438 for (_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be i=0; i<_\br_\bo_\bw_\bs(); i++)\n+439 for (_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be j=0; j<_\bc_\bo_\bl_\bs(); j++)\n+440 yy[j] += _\bc_\bo_\bn_\bj_\bu_\bg_\ba_\bt_\be_\bC_\bo_\bm_\bp_\bl_\be_\bx((*this)[i][j])*xx[i];\n+441 }\n+442\n+444 template\n+_\b4_\b4_\b5 void _\bm_\bm_\bv (const X& x, Y& y) const\n+446 {\n+447 auto&& xx = Impl::asVector(x);\n+448 auto&& yy = Impl::asVector(y);\n+449 _\bD_\bU_\bN_\bE_\b__\bA_\bS_\bS_\bE_\bR_\bT_\b__\bB_\bO_\bU_\bN_\bD_\bS(xx.N() == _\bM());\n+450 _\bD_\bU_\bN_\bE_\b__\bA_\bS_\bS_\bE_\bR_\bT_\b__\bB_\bO_\bU_\bN_\bD_\bS(yy.N() == _\bN());\n+451 for (_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be i=0; i<_\br_\bo_\bw_\bs(); i++)\n+452 for (_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be j=0; j<_\bc_\bo_\bl_\bs(); j++)\n+453 yy[i] -= (*this)[i][j] * xx[j];\n+454 }\n+455\n+457 template\n+_\b4_\b5_\b8 void _\bm_\bm_\bt_\bv (const X& x, Y& y) const\n+459 {\n+460 auto&& xx = Impl::asVector(x);\n+461 auto&& yy = Impl::asVector(y);\n+462 _\bD_\bU_\bN_\bE_\b__\bA_\bS_\bS_\bE_\bR_\bT_\b__\bB_\bO_\bU_\bN_\bD_\bS(xx.N() == _\bN());\n+463 _\bD_\bU_\bN_\bE_\b__\bA_\bS_\bS_\bE_\bR_\bT_\b__\bB_\bO_\bU_\bN_\bD_\bS(yy.N() == _\bM());\n+464 for (_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be i=0; i<_\br_\bo_\bw_\bs(); i++)\n+465 for (_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be j=0; j<_\bc_\bo_\bl_\bs(); j++)\n+466 yy[j] -= (*this)[i][j]*xx[i];\n+467 }\n+468\n+470 template\n+_\b4_\b7_\b1 void _\bm_\bm_\bh_\bv (const X& x, Y& y) const\n+472 {\n+473 auto&& xx = Impl::asVector(x);\n+474 auto&& yy = Impl::asVector(y);\n+475 _\bD_\bU_\bN_\bE_\b__\bA_\bS_\bS_\bE_\bR_\bT_\b__\bB_\bO_\bU_\bN_\bD_\bS(xx.N() == _\bN());\n+476 _\bD_\bU_\bN_\bE_\b__\bA_\bS_\bS_\bE_\bR_\bT_\b__\bB_\bO_\bU_\bN_\bD_\bS(yy.N() == _\bM());\n+477 for (_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be i=0; i<_\br_\bo_\bw_\bs(); i++)\n+478 for (_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be j=0; j<_\bc_\bo_\bl_\bs(); j++)\n+479 yy[j] -= _\bc_\bo_\bn_\bj_\bu_\bg_\ba_\bt_\be_\bC_\bo_\bm_\bp_\bl_\be_\bx((*this)[i][j])*xx[i];\n+480 }\n+481\n+483 template\n+_\b4_\b8_\b4 void _\bu_\bs_\bm_\bv (const typename _\bF_\bi_\be_\bl_\bd_\bT_\br_\ba_\bi_\bt_\bs_\b<_\bY_\b>_\b:_\b:_\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be & alpha,\n+485 const X& x, Y& y) const\n+486 {\n+487 auto&& xx = Impl::asVector(x);\n+488 auto&& yy = Impl::asVector(y);\n+489 _\bD_\bU_\bN_\bE_\b__\bA_\bS_\bS_\bE_\bR_\bT_\b__\bB_\bO_\bU_\bN_\bD_\bS(xx.N() == _\bM());\n+490 _\bD_\bU_\bN_\bE_\b__\bA_\bS_\bS_\bE_\bR_\bT_\b__\bB_\bO_\bU_\bN_\bD_\bS(yy.N() == _\bN());\n+491 for (_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be i=0; i<_\br_\bo_\bw_\bs(); i++)\n+492 for (_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be j=0; j<_\bc_\bo_\bl_\bs(); j++)\n+493 yy[i] += alpha * (*this)[i][j] * xx[j];\n+494 }\n+495\n+497 template\n+_\b4_\b9_\b8 void _\bu_\bs_\bm_\bt_\bv (const typename _\bF_\bi_\be_\bl_\bd_\bT_\br_\ba_\bi_\bt_\bs_\b<_\bY_\b>_\b:_\b:_\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be & alpha,\n+499 const X& x, Y& y) const\n+500 {\n+501 auto&& xx = Impl::asVector(x);\n+502 auto&& yy = Impl::asVector(y);\n+503 _\bD_\bU_\bN_\bE_\b__\bA_\bS_\bS_\bE_\bR_\bT_\b__\bB_\bO_\bU_\bN_\bD_\bS(xx.N() == _\bN());\n+504 _\bD_\bU_\bN_\bE_\b__\bA_\bS_\bS_\bE_\bR_\bT_\b__\bB_\bO_\bU_\bN_\bD_\bS(yy.N() == _\bM());\n+505 for (_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be i=0; i<_\br_\bo_\bw_\bs(); i++)\n+506 for (_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be j=0; j<_\bc_\bo_\bl_\bs(); j++)\n+507 yy[j] += alpha*(*this)[i][j]*xx[i];\n+508 }\n+509\n+511 template\n+_\b5_\b1_\b2 void _\bu_\bs_\bm_\bh_\bv (const typename _\bF_\bi_\be_\bl_\bd_\bT_\br_\ba_\bi_\bt_\bs_\b<_\bY_\b>_\b:_\b:_\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be & alpha,\n+513 const X& x, Y& y) const\n+514 {\n+515 auto&& xx = Impl::asVector(x);\n+516 auto&& yy = Impl::asVector(y);\n+517 _\bD_\bU_\bN_\bE_\b__\bA_\bS_\bS_\bE_\bR_\bT_\b__\bB_\bO_\bU_\bN_\bD_\bS(xx.N() == _\bN());\n+518 _\bD_\bU_\bN_\bE_\b__\bA_\bS_\bS_\bE_\bR_\bT_\b__\bB_\bO_\bU_\bN_\bD_\bS(yy.N() == _\bM());\n+519 for (_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be i=0; i<_\br_\bo_\bw_\bs(); i++)\n+520 for (_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be j=0; j<_\bc_\bo_\bl_\bs(); j++)\n+521 yy[j] +=\n+522 alpha*_\bc_\bo_\bn_\bj_\bu_\bg_\ba_\bt_\be_\bC_\bo_\bm_\bp_\bl_\be_\bx((*this)[i][j])*xx[i];\n+523 }\n+524\n+525 //===== norms\n+526\n+_\b5_\b2_\b8 typename _\bF_\bi_\be_\bl_\bd_\bT_\br_\ba_\bi_\bt_\bs_\b<_\bv_\ba_\bl_\bu_\be_\b__\bt_\by_\bp_\be_\b>_\b:_\b:_\br_\be_\ba_\bl_\b__\bt_\by_\bp_\be _\bf_\br_\bo_\bb_\be_\bn_\bi_\bu_\bs_\b__\bn_\bo_\br_\bm () const\n+529 {\n+530 typename _\bF_\bi_\be_\bl_\bd_\bT_\br_\ba_\bi_\bt_\bs_\b<_\bv_\ba_\bl_\bu_\be_\b__\bt_\by_\bp_\be_\b>_\b:_\b:_\br_\be_\ba_\bl_\b__\bt_\by_\bp_\be sum=(0.0);\n+531 for (_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be i=0; i<_\br_\bo_\bw_\bs(); ++i) sum += (*this)[i].two_norm2();\n+532 return fvmeta::sqrt(sum);\n+533 }\n+534\n+_\b5_\b3_\b6 typename _\bF_\bi_\be_\bl_\bd_\bT_\br_\ba_\bi_\bt_\bs_\b<_\bv_\ba_\bl_\bu_\be_\b__\bt_\by_\bp_\be_\b>_\b:_\b:_\br_\be_\ba_\bl_\b__\bt_\by_\bp_\be _\bf_\br_\bo_\bb_\be_\bn_\bi_\bu_\bs_\b__\bn_\bo_\br_\bm_\b2 () const\n+537 {\n+538 typename _\bF_\bi_\be_\bl_\bd_\bT_\br_\ba_\bi_\bt_\bs_\b<_\bv_\ba_\bl_\bu_\be_\b__\bt_\by_\bp_\be_\b>_\b:_\b:_\br_\be_\ba_\bl_\b__\bt_\by_\bp_\be sum=(0.0);\n+539 for (_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be i=0; i<_\br_\bo_\bw_\bs(); ++i) sum += (*this)[i].two_norm2();\n+540 return sum;\n+541 }\n+542\n+544 template ::value, int>::type = 0>\n+_\b5_\b4_\b6 typename _\bF_\bi_\be_\bl_\bd_\bT_\br_\ba_\bi_\bt_\bs_\b<_\bv_\bt_\b>_\b:_\b:_\br_\be_\ba_\bl_\b__\bt_\by_\bp_\be _\bi_\bn_\bf_\bi_\bn_\bi_\bt_\by_\b__\bn_\bo_\br_\bm() const {\n+547 using real_type = typename _\bF_\bi_\be_\bl_\bd_\bT_\br_\ba_\bi_\bt_\bs_\b<_\bv_\bt_\b>_\b:_\b:_\br_\be_\ba_\bl_\b__\bt_\by_\bp_\be;\n+548 using std::max;\n+549\n+550 real_type norm = 0;\n+551 for (auto const &x : *this) {\n+552 real_type const a = x.one_norm();\n+553 norm = max(a, norm);\n+554 }\n+555 return norm;\n+556 }\n+557\n+559 template ::value, int>::type = 0>\n+_\b5_\b6_\b1 typename _\bF_\bi_\be_\bl_\bd_\bT_\br_\ba_\bi_\bt_\bs_\b<_\bv_\bt_\b>_\b:_\b:_\br_\be_\ba_\bl_\b__\bt_\by_\bp_\be _\bi_\bn_\bf_\bi_\bn_\bi_\bt_\by_\b__\bn_\bo_\br_\bm_\b__\br_\be_\ba_\bl() const {\n+562 using real_type = typename _\bF_\bi_\be_\bl_\bd_\bT_\br_\ba_\bi_\bt_\bs_\b<_\bv_\bt_\b>_\b:_\b:_\br_\be_\ba_\bl_\b__\bt_\by_\bp_\be;\n+563 using std::max;\n+564\n+565 real_type norm = 0;\n+566 for (auto const &x : *this) {\n+567 real_type const a = x.one_norm_real();\n+568 norm = max(a, norm);\n+569 }\n+570 return norm;\n+571 }\n+572\n+574 template ::value, int>::type = 0>\n+_\b5_\b7_\b6 typename _\bF_\bi_\be_\bl_\bd_\bT_\br_\ba_\bi_\bt_\bs_\b<_\bv_\bt_\b>_\b:_\b:_\br_\be_\ba_\bl_\b__\bt_\by_\bp_\be _\bi_\bn_\bf_\bi_\bn_\bi_\bt_\by_\b__\bn_\bo_\br_\bm() const {\n+577 using real_type = typename _\bF_\bi_\be_\bl_\bd_\bT_\br_\ba_\bi_\bt_\bs_\b<_\bv_\bt_\b>_\b:_\b:_\br_\be_\ba_\bl_\b__\bt_\by_\bp_\be;\n+578 using std::max;\n+579\n+580 real_type norm = 0;\n+581 real_type isNaN = 1;\n+582 for (auto const &x : *this) {\n+583 real_type const a = x.one_norm();\n+584 norm = max(a, norm);\n+585 isNaN += a;\n+586 }\n+587 return norm * (isNaN / isNaN);\n+588 }\n+589\n+591 template ::value, int>::type = 0>\n+_\b5_\b9_\b3 typename _\bF_\bi_\be_\bl_\bd_\bT_\br_\ba_\bi_\bt_\bs_\b<_\bv_\bt_\b>_\b:_\b:_\br_\be_\ba_\bl_\b__\bt_\by_\bp_\be _\bi_\bn_\bf_\bi_\bn_\bi_\bt_\by_\b__\bn_\bo_\br_\bm_\b__\br_\be_\ba_\bl() const {\n+594 using real_type = typename _\bF_\bi_\be_\bl_\bd_\bT_\br_\ba_\bi_\bt_\bs_\b<_\bv_\bt_\b>_\b:_\b:_\br_\be_\ba_\bl_\b__\bt_\by_\bp_\be;\n+595 using std::max;\n+596\n+597 real_type norm = 0;\n+598 real_type isNaN = 1;\n+599 for (auto const &x : *this) {\n+600 real_type const a = x.one_norm_real();\n+601 norm = max(a, norm);\n+602 isNaN += a;\n+603 }\n+604 return norm * (isNaN / isNaN);\n+605 }\n+606\n+607 //===== solve\n+608\n+613 template \n+_\b6_\b1_\b4 void _\bs_\bo_\bl_\bv_\be (V1& x, const V2& b, bool doPivoting = true) const;\n+615\n+_\b6_\b2_\b0 void _\bi_\bn_\bv_\be_\br_\bt(bool doPivoting = true);\n+621\n+_\b6_\b2_\b3 _\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be _\bd_\be_\bt_\be_\br_\bm_\bi_\bn_\ba_\bn_\bt (bool doPivoting = true) const;\n+624\n+626 template\n+_\b6_\b2_\b7 MAT& _\bl_\be_\bf_\bt_\bm_\bu_\bl_\bt_\bi_\bp_\bl_\by (const _\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bM_\b2_\b>& _\bM)\n+628 {\n+629 _\bD_\bU_\bN_\bE_\b__\bA_\bS_\bS_\bE_\bR_\bT_\b__\bB_\bO_\bU_\bN_\bD_\bS(_\bM.rows() == _\bM.cols());\n+630 _\bD_\bU_\bN_\bE_\b__\bA_\bS_\bS_\bE_\bR_\bT_\b__\bB_\bO_\bU_\bN_\bD_\bS(_\bM.rows() == _\br_\bo_\bw_\bs());\n+631 _\bA_\bu_\bt_\bo_\bn_\bo_\bm_\bo_\bu_\bs_\bV_\ba_\bl_\bu_\be_\b<_\bM_\bA_\bT_\b> C(asImp());\n+632\n+633 for (_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be i=0; i<_\br_\bo_\bw_\bs(); i++)\n+634 for (_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be j=0; j<_\bc_\bo_\bl_\bs(); j++) {\n+635 (*this)[i][j] = 0;\n+636 for (_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be k=0; k<_\br_\bo_\bw_\bs(); k++)\n+637 (*this)[i][j] += _\bM[i][k]*C[k][j];\n+638 }\n+639\n+640 return asImp();\n+641 }\n+642\n+644 template\n+_\b6_\b4_\b5 MAT& _\br_\bi_\bg_\bh_\bt_\bm_\bu_\bl_\bt_\bi_\bp_\bl_\by (const _\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bM_\b2_\b>& _\bM)\n+646 {\n+647 _\bD_\bU_\bN_\bE_\b__\bA_\bS_\bS_\bE_\bR_\bT_\b__\bB_\bO_\bU_\bN_\bD_\bS(_\bM.rows() == _\bM.cols());\n+648 _\bD_\bU_\bN_\bE_\b__\bA_\bS_\bS_\bE_\bR_\bT_\b__\bB_\bO_\bU_\bN_\bD_\bS(_\bM.cols() == _\bc_\bo_\bl_\bs());\n+649 _\bA_\bu_\bt_\bo_\bn_\bo_\bm_\bo_\bu_\bs_\bV_\ba_\bl_\bu_\be_\b<_\bM_\bA_\bT_\b> C(asImp());\n+650\n+651 for (_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be i=0; i<_\br_\bo_\bw_\bs(); i++)\n+652 for (_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be j=0; j<_\bc_\bo_\bl_\bs(); j++) {\n+653 (*this)[i][j] = 0;\n+654 for (_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be k=0; k<_\bc_\bo_\bl_\bs(); k++)\n+655 (*this)[i][j] += C[i][k]*_\bM[k][j];\n+656 }\n+657 return asImp();\n+658 }\n+659\n+660#if 0\n+662 template\n+663 _\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bK_\b,_\bl_\b,_\bc_\bo_\bl_\bs_\b> leftmultiplyany (const _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bK_\b,_\bl_\b,_\br_\bo_\bw_\bs_\b>& _\bM)\n+const\n+664 {\n+665 _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bK_\b,_\bl_\b,_\bc_\bo_\bl_\bs_\b> C;\n+666\n+667 for (_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be i=0; i\n+679 FieldMatrix rightmultiplyany (const FieldMatrix& _\bM)\n+const\n+680 {\n+681 FieldMatrix C;\n+682\n+683 for (_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be i=0; i<_\br_\bo_\bw_\bs(); i++) {\n+684 for (_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be j=0; j= 0 && i < _\br_\bo_\bw_\bs());\n+726 _\bD_\bU_\bN_\bE_\b__\bA_\bS_\bS_\bE_\bR_\bT_\b__\bB_\bO_\bU_\bN_\bD_\bS(j >= 0 && j < _\bc_\bo_\bl_\bs());\n+727 return true;\n+728 }\n+729\n+730 protected:\n+731\n+732#ifndef DOXYGEN\n+733 struct ElimPivot\n+734 {\n+735 ElimPivot(std::vector & pivot);\n+736\n+737 void _\bs_\bw_\ba_\bp(std::size_t i, simd_index_type j);\n+738\n+739 template\n+740 void operator()(const T&, int, int)\n+741 {}\n+742\n+743 std::vector & pivot_;\n+744 };\n+745\n+746 template\n+747 struct Elim\n+748 {\n+749 Elim(V& rhs);\n+750\n+751 void _\bs_\bw_\ba_\bp(std::size_t i, simd_index_type j);\n+752\n+753 void operator()(const typename V::field_type& factor, int k, int i);\n+754\n+755 V* rhs_;\n+756 };\n+757\n+758 struct ElimDet\n+759 {\n+760 ElimDet(field_type& sign) : sign_(_\bs_\bi_\bg_\bn)\n+761 { sign_ = 1; }\n+762\n+763 void _\bs_\bw_\ba_\bp(std::size_t i, simd_index_type j)\n+764 {\n+765 sign_ *=\n+766 Simd::cond(simd_index_type(i) == j, field_type(1), field_type(-1));\n+767 }\n+768\n+769 void operator()(const field_type&, int, int)\n+770 {}\n+771\n+772 field_type& sign_;\n+773 };\n+774#endif // DOXYGEN\n+775\n+777\n+815 template\n+_\b8_\b1_\b6 static void _\bl_\bu_\bD_\be_\bc_\bo_\bm_\bp_\bo_\bs_\bi_\bt_\bi_\bo_\bn(_\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bM_\bA_\bT_\b>& A, Func func,\n+817 Mask &nonsingularLanes, bool throwEarly, bool doPivoting);\n+818 };\n+819\n+820#ifndef DOXYGEN\n+821 template\n+822 _\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bM_\bA_\bT_\b>_\b:_\b:_\bE_\bl_\bi_\bm_\bP_\bi_\bv_\bo_\bt_\b:_\b:_\bE_\bl_\bi_\bm_\bP_\bi_\bv_\bo_\bt(std::vector &\n+pivot)\n+823 : pivot_(pivot)\n+824 {\n+825 typedef typename std::vector::size_type _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be;\n+826 for(_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be i=0; i < pivot_.size(); ++i) pivot_[i]=i;\n+827 }\n+828\n+829 template\n+830 void DenseMatrix::ElimPivot::swap(std::size_t i, simd_index_type j)\n+831 {\n+832 pivot_[i] =\n+833 _\bS_\bi_\bm_\bd_\b:_\b:_\bc_\bo_\bn_\bd(Simd::Scalar(i) == j, pivot_[i], j);\n+834 }\n+835\n+836 template\n+837 template\n+838 DenseMatrix::Elim::Elim(V& rhs)\n+839 : rhs_(&rhs)\n+840 {}\n+841\n+842 template\n+843 template\n+844 void DenseMatrix::Elim::swap(std::size_t i, simd_index_type j)\n+845 {\n+846 using std::swap;\n+847\n+848 // see the comment in luDecomposition()\n+849 for(std::size_t l = 0; l < _\bS_\bi_\bm_\bd_\b:_\b:_\bl_\ba_\bn_\be_\bs(j); ++l)\n+850 _\bs_\bw_\ba_\bp(_\bS_\bi_\bm_\bd_\b:_\b:_\bl_\ba_\bn_\be(l, (*rhs_)[ i ]),\n+851 _\bS_\bi_\bm_\bd_\b:_\b:_\bl_\ba_\bn_\be(l, (*rhs_)[_\bS_\bi_\bm_\bd_\b:_\b:_\bl_\ba_\bn_\be(l, j)]));\n+852 }\n+853\n+854 template\n+855 template\n+856 void DenseMatrix::\n+857 Elim::operator()(const typename V::field_type& factor, int k, int i)\n+858 {\n+859 (*rhs_)[k] -= factor*(*rhs_)[i];\n+860 }\n+861\n+862 template\n+863 template\n+864 inline void _\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bM_\bA_\bT_\b>_\b:_\b:\n+865_\b _\bl_\bu_\bD_\be_\bc_\bo_\bm_\bp_\bo_\bs_\bi_\bt_\bi_\bo_\bn(DenseMatrix& A, Func func, Mask &nonsingularLanes,\n+866 bool throwEarly, bool doPivoting)\n+867 {\n+868 using std::max;\n+869 using std::swap;\n+870\n+871 typedef typename _\bF_\bi_\be_\bl_\bd_\bT_\br_\ba_\bi_\bt_\bs_\b<_\bv_\ba_\bl_\bu_\be_\b__\bt_\by_\bp_\be_\b>_\b:_\b:_\br_\be_\ba_\bl_\b__\bt_\by_\bp_\be real_type;\n+872\n+873 // LU decomposition of A in A\n+874 for (size_type i=0; i pivmax;\n+886 pivmax = _\bS_\bi_\bm_\bd_\b:_\b:_\bc_\bo_\bn_\bd(mask, abs, pivmax);\n+887 imax = _\bS_\bi_\bm_\bd_\b:_\b:_\bc_\bo_\bn_\bd(mask, simd_index_type(k), imax);\n+888 }\n+889 // swap rows\n+890 for (size_type j=0; j\n+933 template \n+934 inline void _\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bM_\bA_\bT_\b>_\b:_\b:_\bs_\bo_\bl_\bv_\be(V1& x, const V2& b, bool doPivoting)\n+const\n+935 {\n+936 using real_type = typename _\bF_\bi_\be_\bl_\bd_\bT_\br_\ba_\bi_\bt_\bs_\b<_\bv_\ba_\bl_\bu_\be_\b__\bt_\by_\bp_\be_\b>_\b:_\b:_\br_\be_\ba_\bl_\b__\bt_\by_\bp_\be;\n+937 // never mind those ifs, because they get optimized away\n+938 if (rows()!=cols())\n+939 _\bD_\bU_\bN_\bE_\b__\bT_\bH_\bR_\bO_\bW(FMatrixError, \"Can't solve for a \" << rows() << \"x\" << cols() <<\n+\" matrix!\");\n+940\n+941 if (rows()==1) {\n+942\n+943#ifdef DUNE_FMatrix_WITH_CHECKING\n+944 if (_\bS_\bi_\bm_\bd_\b:_\b:_\ba_\bn_\by_\bT_\br_\bu_\be(fvmeta::absreal((*this)[0][0])\n+945 < _\bF_\bM_\ba_\bt_\br_\bi_\bx_\bP_\br_\be_\bc_\bi_\bs_\bi_\bo_\bn_\b<_\b>_\b:_\b:_\ba_\bb_\bs_\bo_\bl_\bu_\bt_\be_\b__\bl_\bi_\bm_\bi_\bt()))\n+946 _\bD_\bU_\bN_\bE_\b__\bT_\bH_\bR_\bO_\bW(FMatrixError,\"matrix is singular\");\n+947#endif\n+948 x[0] = b[0]/(*this)[0][0];\n+949\n+950 }\n+951 else if (rows()==2) {\n+952\n+953 field_type detinv = (*this)[0][0]*(*this)[1][1]-(*this)[0][1]*(*this)[1]\n+[0];\n+954#ifdef DUNE_FMatrix_WITH_CHECKING\n+955 if (_\bS_\bi_\bm_\bd_\b:_\b:_\ba_\bn_\by_\bT_\br_\bu_\be(fvmeta::absreal(detinv)\n+956 < _\bF_\bM_\ba_\bt_\br_\bi_\bx_\bP_\br_\be_\bc_\bi_\bs_\bi_\bo_\bn_\b<_\b>_\b:_\b:_\ba_\bb_\bs_\bo_\bl_\bu_\bt_\be_\b__\bl_\bi_\bm_\bi_\bt()))\n+957 _\bD_\bU_\bN_\bE_\b__\bT_\bH_\bR_\bO_\bW(FMatrixError,\"matrix is singular\");\n+958#endif\n+959 detinv = real_type(1.0)/detinv;\n+960\n+961 x[0] = detinv*((*this)[1][1]*b[0]-(*this)[0][1]*b[1]);\n+962 x[1] = detinv*((*this)[0][0]*b[1]-(*this)[1][0]*b[0]);\n+963\n+964 }\n+965 else if (rows()==3) {\n+966\n+967 field_type d = determinant(doPivoting);\n+968#ifdef DUNE_FMatrix_WITH_CHECKING\n+969 if (_\bS_\bi_\bm_\bd_\b:_\b:_\ba_\bn_\by_\bT_\br_\bu_\be(fvmeta::absreal(d)\n+970 < _\bF_\bM_\ba_\bt_\br_\bi_\bx_\bP_\br_\be_\bc_\bi_\bs_\bi_\bo_\bn_\b<_\b>_\b:_\b:_\ba_\bb_\bs_\bo_\bl_\bu_\bt_\be_\b__\bl_\bi_\bm_\bi_\bt()))\n+971 _\bD_\bU_\bN_\bE_\b__\bT_\bH_\bR_\bO_\bW(FMatrixError,\"matrix is singular\");\n+972#endif\n+973\n+974 x[0] = (b[0]*(*this)[1][1]*(*this)[2][2] - b[0]*(*this)[2][1]*(*this)[1][2]\n+975 - b[1] *(*this)[0][1]*(*this)[2][2] + b[1]*(*this)[2][1]*(*this)[0][2]\n+976 + b[2] *(*this)[0][1]*(*this)[1][2] - b[2]*(*this)[1][1]*(*this)[0][2]) /\n+d;\n+977\n+978 x[1] = ((*this)[0][0]*b[1]*(*this)[2][2] - (*this)[0][0]*b[2]*(*this)[1][2]\n+979 - (*this)[1][0] *b[0]*(*this)[2][2] + (*this)[1][0]*b[2]*(*this)[0][2]\n+980 + (*this)[2][0] *b[0]*(*this)[1][2] - (*this)[2][0]*b[1]*(*this)[0][2]) /\n+d;\n+981\n+982 x[2] = ((*this)[0][0]*(*this)[1][1]*b[2] - (*this)[0][0]*(*this)[2][1]*b[1]\n+983 - (*this)[1][0] *(*this)[0][1]*b[2] + (*this)[1][0]*(*this)[2][1]*b[0]\n+984 + (*this)[2][0] *(*this)[0][1]*b[1] - (*this)[2][0]*(*this)[1][1]*b[0]) /\n+d;\n+985\n+986 }\n+987 else {\n+988\n+989 V1& rhs = x; // use x to store rhs\n+990 rhs = b; // copy data\n+991 Elim elim(rhs);\n+992 AutonomousValue A(asImp());\n+993 Simd::Mask::real_type>\n+994 nonsingularLanes(true);\n+995\n+996 AutonomousValue::luDecomposition(A, elim, nonsingularLanes, true,\n+doPivoting);\n+997\n+998 // backsolve\n+999 for(int i=rows()-1; i>=0; i--) {\n+1000 for (size_type j=i+1; j\n+1008 inline void _\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bM_\bA_\bT_\b>_\b:_\b:_\bi_\bn_\bv_\be_\br_\bt(bool doPivoting)\n+1009 {\n+1010 using real_type = typename _\bF_\bi_\be_\bl_\bd_\bT_\br_\ba_\bi_\bt_\bs_\b<_\bM_\bA_\bT_\b>_\b:_\b:_\br_\be_\ba_\bl_\b__\bt_\by_\bp_\be;\n+1011 using std::swap;\n+1012\n+1013 // never mind those ifs, because they get optimized away\n+1014 if (rows()!=cols())\n+1015 _\bD_\bU_\bN_\bE_\b__\bT_\bH_\bR_\bO_\bW(FMatrixError, \"Can't invert a \" << rows() << \"x\" << cols() << \"\n+matrix!\");\n+1016\n+1017 if (rows()==1) {\n+1018\n+1019#ifdef DUNE_FMatrix_WITH_CHECKING\n+1020 if (_\bS_\bi_\bm_\bd_\b:_\b:_\ba_\bn_\by_\bT_\br_\bu_\be(fvmeta::absreal((*this)[0][0])\n+1021 < _\bF_\bM_\ba_\bt_\br_\bi_\bx_\bP_\br_\be_\bc_\bi_\bs_\bi_\bo_\bn_\b<_\b>_\b:_\b:_\ba_\bb_\bs_\bo_\bl_\bu_\bt_\be_\b__\bl_\bi_\bm_\bi_\bt()))\n+1022 _\bD_\bU_\bN_\bE_\b__\bT_\bH_\bR_\bO_\bW(FMatrixError,\"matrix is singular\");\n+1023#endif\n+1024 (*this)[0][0] = real_type( 1 ) / (*this)[0][0];\n+1025\n+1026 }\n+1027 else if (rows()==2) {\n+1028\n+1029 field_type detinv = (*this)[0][0]*(*this)[1][1]-(*this)[0][1]*(*this)[1]\n+[0];\n+1030#ifdef DUNE_FMatrix_WITH_CHECKING\n+1031 if (_\bS_\bi_\bm_\bd_\b:_\b:_\ba_\bn_\by_\bT_\br_\bu_\be(fvmeta::absreal(detinv)\n+1032 < _\bF_\bM_\ba_\bt_\br_\bi_\bx_\bP_\br_\be_\bc_\bi_\bs_\bi_\bo_\bn_\b<_\b>_\b:_\b:_\ba_\bb_\bs_\bo_\bl_\bu_\bt_\be_\b__\bl_\bi_\bm_\bi_\bt()))\n+1033 _\bD_\bU_\bN_\bE_\b__\bT_\bH_\bR_\bO_\bW(FMatrixError,\"matrix is singular\");\n+1034#endif\n+1035 detinv = real_type( 1 ) / detinv;\n+1036\n+1037 field_type temp=(*this)[0][0];\n+1038 (*this)[0][0] = (*this)[1][1]*detinv;\n+1039 (*this)[0][1] = -(*this)[0][1]*detinv;\n+1040 (*this)[1][0] = -(*this)[1][0]*detinv;\n+1041 (*this)[1][1] = temp*detinv;\n+1042\n+1043 }\n+1044 else if (rows()==3)\n+1045 {\n+1046 using K = field_type;\n+1047 // code generated by maple\n+1048 K t4 = (*this)[0][0] * (*this)[1][1];\n+1049 K t6 = (*this)[0][0] * (*this)[1][2];\n+1050 K t8 = (*this)[0][1] * (*this)[1][0];\n+1051 K t10 = (*this)[0][2] * (*this)[1][0];\n+1052 K t12 = (*this)[0][1] * (*this)[2][0];\n+1053 K t14 = (*this)[0][2] * (*this)[2][0];\n+1054\n+1055 K det = (t4*(*this)[2][2]-t6*(*this)[2][1]-t8*(*this)[2][2]+\n+1056 t10*(*this)[2][1]+t12*(*this)[1][2]-t14*(*this)[1][1]);\n+1057 K t17 = K(1.0)/det;\n+1058\n+1059 K matrix01 = (*this)[0][1];\n+1060 K matrix00 = (*this)[0][0];\n+1061 K matrix10 = (*this)[1][0];\n+1062 K matrix11 = (*this)[1][1];\n+1063\n+1064 (*this)[0][0] = ((*this)[1][1] * (*this)[2][2] - (*this)[1][2] * (*this)\n+[2][1])*t17;\n+1065 (*this)[0][1] = -((*this)[0][1] * (*this)[2][2] - (*this)[0][2] * (*this)\n+[2][1])*t17;\n+1066 (*this)[0][2] = (matrix01 * (*this)[1][2] - (*this)[0][2] * (*this)[1]\n+[1])*t17;\n+1067 (*this)[1][0] = -((*this)[1][0] * (*this)[2][2] - (*this)[1][2] * (*this)\n+[2][0])*t17;\n+1068 (*this)[1][1] = (matrix00 * (*this)[2][2] - t14) * t17;\n+1069 (*this)[1][2] = -(t6-t10) * t17;\n+1070 (*this)[2][0] = (matrix10 * (*this)[2][1] - matrix11 * (*this)[2][0]) *\n+t17;\n+1071 (*this)[2][1] = -(matrix00 * (*this)[2][1] - t12) * t17;\n+1072 (*this)[2][2] = (t4-t8) * t17;\n+1073 }\n+1074 else {\n+1075 using std::swap;\n+1076\n+1077 AutonomousValue A(asImp());\n+1078 std::vector pivot(rows());\n+1079 Simd::Mask::real_type>\n+1080 nonsingularLanes(true);\n+1081 AutonomousValue::luDecomposition(A, ElimPivot(pivot),\n+nonsingularLanes, true, doPivoting);\n+1082 auto& L=A;\n+1083 auto& U=A;\n+1084\n+1085 // initialize inverse\n+1086 *this=field_type();\n+1087\n+1088 for(size_type i=0; i0;) {\n+1099 --i;\n+1100 for (size_type k=0; k0; ) {\n+1108 --i;\n+1109 for(std::size_t l = 0; l < _\bS_\bi_\bm_\bd_\b:_\b:_\bl_\ba_\bn_\be_\bs((*this)[0][0]); ++l)\n+1110 {\n+1111 std::size_t pi = _\bS_\bi_\bm_\bd_\b:_\b:_\bl_\ba_\bn_\be(l, pivot[i]);\n+1112 if(i!=pi)\n+1113 for(size_type j=0; j\n+1123 inline typename _\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bM_\bA_\bT_\b>_\b:_\b:_\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be\n+1124 _\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bM_\bA_\bT_\b>_\b:_\b:_\bd_\be_\bt_\be_\br_\bm_\bi_\bn_\ba_\bn_\bt(bool doPivoting) const\n+1125 {\n+1126 // never mind those ifs, because they get optimized away\n+1127 if (rows()!=cols())\n+1128 _\bD_\bU_\bN_\bE_\b__\bT_\bH_\bR_\bO_\bW(FMatrixError, \"There is no determinant for a \" << rows() << \"x\"\n+<< cols() << \" matrix!\");\n+1129\n+1130 if (rows()==1)\n+1131 return (*this)[0][0];\n+1132\n+1133 if (rows()==2)\n+1134 return (*this)[0][0]*(*this)[1][1] - (*this)[0][1]*(*this)[1][0];\n+1135\n+1136 if (rows()==3) {\n+1137 // code generated by maple\n+1138 field_type t4 = (*this)[0][0] * (*this)[1][1];\n+1139 field_type t6 = (*this)[0][0] * (*this)[1][2];\n+1140 field_type t8 = (*this)[0][1] * (*this)[1][0];\n+1141 field_type t10 = (*this)[0][2] * (*this)[1][0];\n+1142 field_type t12 = (*this)[0][1] * (*this)[2][0];\n+1143 field_type t14 = (*this)[0][2] * (*this)[2][0];\n+1144\n+1145 return (t4*(*this)[2][2]-t6*(*this)[2][1]-t8*(*this)[2][2]+\n+1146 t10*(*this)[2][1]+t12*(*this)[1][2]-t14*(*this)[1][1]);\n+1147\n+1148 }\n+1149\n+1150 AutonomousValue A(asImp());\n+1151 field_type det;\n+1152 Simd::Mask::real_type>\n+1153 nonsingularLanes(true);\n+1154\n+1155 AutonomousValue::luDecomposition(A, ElimDet(det), nonsingularLanes,\n+false, doPivoting);\n+1156 det = _\bS_\bi_\bm_\bd_\b:_\b:_\bc_\bo_\bn_\bd(nonsingularLanes, det, field_type(0));\n+1157\n+1158 for (size_type i = 0; i < rows(); ++i)\n+1159 det *= A[i][i];\n+1160 return det;\n+1161 }\n+1162\n+1163#endif // DOXYGEN\n+1164\n+_\b1_\b1_\b6_\b5 namespace DenseMatrixHelp {\n+1166\n+1168 template \n+_\b1_\b1_\b6_\b9 static inline void _\bm_\bu_\bl_\bt_\bA_\bs_\bs_\bi_\bg_\bn(const _\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bM_\bA_\bT_\b> &matrix, const\n+_\bD_\be_\bn_\bs_\be_\bV_\be_\bc_\bt_\bo_\br_\b<_\bV_\b1_\b> & x, _\bD_\be_\bn_\bs_\be_\bV_\be_\bc_\bt_\bo_\br_\b<_\bV_\b2_\b> & ret)\n+1170 {\n+1171 _\bD_\bU_\bN_\bE_\b__\bA_\bS_\bS_\bE_\bR_\bT_\b__\bB_\bO_\bU_\bN_\bD_\bS(x._\bs_\bi_\bz_\be() == matrix._\bc_\bo_\bl_\bs());\n+1172 _\bD_\bU_\bN_\bE_\b__\bA_\bS_\bS_\bE_\bR_\bT_\b__\bB_\bO_\bU_\bN_\bD_\bS(ret._\bs_\bi_\bz_\be() == matrix._\br_\bo_\bw_\bs());\n+1173 typedef typename _\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bM_\bA_\bT_\b>_\b:_\b:_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be size_type;\n+1174\n+1175 for(size_type i=0; i\n+1188 static inline void multAssignTransposed( const _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bK_\b,_\br_\bo_\bw_\bs_\b,_\bc_\bo_\bl_\bs_\b>\n+&matrix, const _\bF_\bi_\be_\bl_\bd_\bV_\be_\bc_\bt_\bo_\br_\b<_\bK_\b,_\br_\bo_\bw_\bs_\b> & x, _\bF_\bi_\be_\bl_\bd_\bV_\be_\bc_\bt_\bo_\br_\b<_\bK_\b,_\bc_\bo_\bl_\bs_\b> & ret)\n+1189 {\n+1190 typedef typename _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bK_\b,_\br_\bo_\bw_\bs_\b,_\bc_\bo_\bl_\bs_\b>_\b:_\b:_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be size_type;\n+1191\n+1192 for(size_type i=0; i\n+1202 static inline FieldVector mult(const FieldMatrix\n+&matrix, const FieldVector & x)\n+1203 {\n+1204 FieldVector ret;\n+1205 _\bm_\bu_\bl_\bt_\bA_\bs_\bs_\bi_\bg_\bn(matrix,x,ret);\n+1206 return ret;\n+1207 }\n+1208\n+1210 template \n+1211 static inline FieldVector multTransposed(const\n+FieldMatrix &matrix, const FieldVector & x)\n+1212 {\n+1213 FieldVector ret;\n+1214 multAssignTransposed( matrix, x, ret );\n+1215 return ret;\n+1216 }\n+1217#endif\n+1218\n+1219 } // end namespace DenseMatrixHelp\n+1220\n+1222 template\n+_\b1_\b2_\b2_\b3 std::ostream& _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b<_\b<_\b (std::ostream& s, const _\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bM_\bA_\bT_\b>& a)\n+1224 {\n+1225 for (typename _\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bM_\bA_\bT_\b>_\b:_\b:_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be i=0; i::type AutonomousValue\n+Type free of internal references that T can be converted to.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn typetraits.hh:588\n+_\bD_\bu_\bn_\be_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b<_\b<\n+std::ostream & operator<<(std::ostream &s, const bigunsignedint< k > &x)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bigunsignedint.hh:278\n+_\bD_\bU_\bN_\bE_\b__\bT_\bH_\bR_\bO_\bW\n+#define DUNE_THROW(E, m)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn exceptions.hh:218\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bi_\bm_\bd_\b:_\b:_\ba_\bn_\by_\bT_\br_\bu_\be\n+bool anyTrue(const Mask &mask)\n+Whether any entry is true\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn simd/interface.hh:429\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bi_\bm_\bd_\b:_\b:_\bc_\bo_\bn_\bd\n+V cond(M &&mask, const V &ifTrue, const V &ifFalse)\n+Like the ?: operator.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn simd/interface.hh:386\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bi_\bm_\bd_\b:_\b:_\ba_\bl_\bl_\bT_\br_\bu_\be\n+bool allTrue(const Mask &mask)\n+Whether all entries are true\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn simd/interface.hh:439\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bi_\bm_\bd_\b:_\b:_\bR_\be_\bb_\bi_\bn_\bd\n+typename Overloads::RebindType< std::decay_t< S >, std::decay_t< V > >::type\n+Rebind\n+Construct SIMD type with different scalar type.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn simd/interface.hh:253\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bi_\bm_\bd_\b:_\b:_\bl_\ba_\bn_\be_\bs\n+constexpr std::size_t lanes()\n+Number of lanes in a SIMD type.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn simd/interface.hh:305\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bi_\bm_\bd_\b:_\b:_\bl_\ba_\bn_\be\n+decltype(auto) lane(std::size_t l, V &&v)\n+Extract an element of a SIMD type.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn simd/interface.hh:324\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bi_\bm_\bd_\b:_\b:_\bO_\bv_\be_\br_\bl_\bo_\ba_\bd_\bs_\b:_\b:_\bm_\ba_\bs_\bk\n+Mask< V > mask(ADLTag< 0, std::is_same< V, Mask< V > >::value >, const V &v)\n+implements Simd::mask()\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn defaults.hh:153\n+_\bs_\bt_\bd\n+STL namespace.\n+_\bD_\bu_\bn_\be\n+Dune namespace.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn alignedallocator.hh:13\n+_\bD_\bu_\bn_\be_\b:_\b:_\bs_\bw_\ba_\bp\n+void swap(T &v1, T &v2, bool mask)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn simd.hh:472\n+_\bD_\bu_\bn_\be_\b:_\b:_\bs_\bi_\bg_\bn\n+int sign(const T &val)\n+Return the sign of the value.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn math.hh:180\n+_\bD_\bu_\bn_\be_\b:_\b:_\bc_\bo_\bn_\bj_\bu_\bg_\ba_\bt_\be_\bC_\bo_\bm_\bp_\bl_\be_\bx\n+K conjugateComplex(const K &x)\n+compute conjugate complex of x\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn math.hh:164\n+_\bD_\bu_\bn_\be_\b:_\b:_\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\bH_\be_\bl_\bp_\b:_\b:_\bm_\bu_\bl_\bt_\bA_\bs_\bs_\bi_\bg_\bn\n+static void multAssign(const DenseMatrix< MAT > &matrix, const DenseVector< V1\n+> &x, DenseVector< V2 > &ret)\n+calculates ret = matrix * x\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn densematrix.hh:1169\n+_\bD_\bu_\bn_\be_\b:_\b:_\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx\n+A dense n x m matrix.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn densematrix.hh:140\n+_\bD_\bu_\bn_\be_\b:_\b:_\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bc_\bo_\bn_\bs_\bt_\b__\bi_\bt_\be_\br_\ba_\bt_\bo_\br\n+ConstIterator const_iterator\n+typedef for stl compliant access\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn densematrix.hh:244\n+_\bD_\bu_\bn_\be_\b:_\b:_\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b-\n+derived_type operator-() const\n+Matrix negation.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn densematrix.hh:298\n+_\bD_\bu_\bn_\be_\b:_\b:_\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bs_\bo_\bl_\bv_\be\n+void solve(V1 &x, const V2 &b, bool doPivoting=true) const\n+Solve system A x = b.\n+_\bD_\bu_\bn_\be_\b:_\b:_\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bm_\bv\n+void mv(const X &x, Y &y) const\n+y = A x\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn densematrix.hh:368\n+_\bD_\bu_\bn_\be_\b:_\b:_\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be\n+Traits::value_type field_type\n+export the type representing the field\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn densematrix.hh:160\n+_\bD_\bu_\bn_\be_\b:_\b:_\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\ba_\bx_\bp_\by\n+derived_type & axpy(const field_type &a, const DenseMatrix< Other > &x)\n+vector space axpy operation (*this += a x)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn densematrix.hh:338\n+_\bD_\bu_\bn_\be_\b:_\b:_\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bb_\be_\bf_\bo_\br_\be_\bE_\bn_\bd\n+ConstIterator beforeEnd() const\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn densematrix.hh:264\n+_\bD_\bu_\bn_\be_\b:_\b:_\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b=\n+derived_type & operator=(const RHS &rhs)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn densematrix.hh:279\n+_\bD_\bu_\bn_\be_\b:_\b:_\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bm_\bm_\bt_\bv\n+void mmtv(const X &x, Y &y) const\n+y -= A^T x\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn densematrix.hh:458\n+_\bD_\bu_\bn_\be_\b:_\b:_\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bi_\bn_\bf_\bi_\bn_\bi_\bt_\by_\b__\bn_\bo_\br_\bm_\b__\br_\be_\ba_\bl\n+FieldTraits< vt >::real_type infinity_norm_real() const\n+simplified infinity norm (uses Manhattan norm for complex values)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn densematrix.hh:561\n+_\bD_\bu_\bn_\be_\b:_\b:_\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bC_\bo_\bn_\bs_\bt_\bC_\bo_\bl_\bI_\bt_\be_\br_\ba_\bt_\bo_\br\n+std::remove_reference< const_row_reference >::type::ConstIterator\n+ConstColIterator\n+rename the iterators for easier access\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn densematrix.hh:248\n+_\bD_\bu_\bn_\be_\b:_\b:_\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bb_\be_\bf_\bo_\br_\be_\bB_\be_\bg_\bi_\bn\n+ConstIterator beforeBegin() const\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn densematrix.hh:271\n+_\bD_\bu_\bn_\be_\b:_\b:_\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bi_\bn_\bv_\be_\br_\bt\n+void invert(bool doPivoting=true)\n+Compute inverse.\n+_\bD_\bu_\bn_\be_\b:_\b:_\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bl_\bu_\bD_\be_\bc_\bo_\bm_\bp_\bo_\bs_\bi_\bt_\bi_\bo_\bn\n+static void luDecomposition(DenseMatrix< MAT > &A, Func func, Mask\n+&nonsingularLanes, bool throwEarly, bool doPivoting)\n+do an LU-Decomposition on matrix A\n+_\bD_\bu_\bn_\be_\b:_\b:_\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bb_\bl_\bo_\bc_\bk_\b__\bt_\by_\bp_\be\n+Traits::value_type block_type\n+export the type representing the components\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn densematrix.hh:163\n+_\bD_\bu_\bn_\be_\b:_\b:_\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bm_\bt_\bv\n+void mtv(const X &x, Y &y) const\n+y = A^T x\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn densematrix.hh:387\n+_\bD_\bu_\bn_\be_\b:_\b:_\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bc_\bo_\bl_\bs\n+constexpr size_type cols() const\n+number of columns\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn densematrix.hh:715\n+_\bD_\bu_\bn_\be_\b:_\b:_\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bs_\bi_\bz_\be\n+size_type size() const\n+size method (number of rows)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn densematrix.hh:200\n+_\bD_\bu_\bn_\be_\b:_\b:_\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bM\n+constexpr size_type M() const\n+number of columns\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn densematrix.hh:703\n+_\bD_\bu_\bn_\be_\b:_\b:_\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\br_\bi_\bg_\bh_\bt_\bm_\bu_\bl_\bt_\bi_\bp_\bl_\by\n+MAT & rightmultiply(const DenseMatrix< M2 > &M)\n+Multiplies M from the right to this matrix.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn densematrix.hh:645\n+_\bD_\bu_\bn_\be_\b:_\b:_\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\be_\bn_\bd\n+Iterator end()\n+end iterator\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn densematrix.hh:222\n+_\bD_\bu_\bn_\be_\b:_\b:_\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bb_\be_\bf_\bo_\br_\be_\bB_\be_\bg_\bi_\bn\n+Iterator beforeBegin()\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn densematrix.hh:236\n+_\bD_\bu_\bn_\be_\b:_\b:_\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b/_\b=\n+derived_type & operator/=(const field_type &k)\n+vector space division by scalar\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn densematrix.hh:329\n+_\bD_\bu_\bn_\be_\b:_\b:_\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b*_\b=\n+derived_type & operator*=(const field_type &k)\n+vector space multiplication with scalar\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn densematrix.hh:321\n+_\bD_\bu_\bn_\be_\b:_\b:_\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bb_\be_\bf_\bo_\br_\be_\bE_\bn_\bd\n+Iterator beforeEnd()\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn densematrix.hh:229\n+_\bD_\bu_\bn_\be_\b:_\b:_\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bv_\ba_\bl_\bu_\be_\b__\bt_\by_\bp_\be\n+Traits::value_type value_type\n+export the type representing the field\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn densematrix.hh:157\n+_\bD_\bu_\bn_\be_\b:_\b:_\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bu_\bs_\bm_\bv\n+void usmv(const typename FieldTraits< Y >::field_type &alpha, const X &x, Y &y)\n+const\n+y += alpha A x\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn densematrix.hh:484\n+_\bD_\bu_\bn_\be_\b:_\b:_\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bu_\bs_\bm_\bh_\bv\n+void usmhv(const typename FieldTraits< Y >::field_type &alpha, const X &x, Y\n+&y) const\n+y += alpha A^H x\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn densematrix.hh:512\n+_\bD_\bu_\bn_\be_\b:_\b:_\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bm_\bm_\bv\n+void mmv(const X &x, Y &y) const\n+y -= A x\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn densematrix.hh:445\n+_\bD_\bu_\bn_\be_\b:_\b:_\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\br_\bo_\bw_\bs\n+constexpr size_type rows() const\n+number of rows\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn densematrix.hh:709\n+_\bD_\bu_\bn_\be_\b:_\b:_\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bl_\be_\bf_\bt_\bm_\bu_\bl_\bt_\bi_\bp_\bl_\by\n+MAT & leftmultiply(const DenseMatrix< M2 > &M)\n+Multiplies M from the left to this matrix.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn densematrix.hh:627\n+_\bD_\bu_\bn_\be_\b:_\b:_\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bu_\bs_\bm_\bt_\bv\n+void usmtv(const typename FieldTraits< Y >::field_type &alpha, const X &x, Y\n+&y) const\n+y += alpha A^T x\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn densematrix.hh:498\n+_\bD_\bu_\bn_\be_\b:_\b:_\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b-_\b=\n+derived_type & operator-=(const DenseMatrix< Other > &x)\n+vector space subtraction\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn densematrix.hh:312\n+_\bD_\bu_\bn_\be_\b:_\b:_\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b!_\b=\n+bool operator!=(const DenseMatrix< Other > &x) const\n+Binary matrix incomparison.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn densematrix.hh:358\n+_\bD_\bu_\bn_\be_\b:_\b:_\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bm_\bm_\bh_\bv\n+void mmhv(const X &x, Y &y) const\n+y -= A^H x\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn densematrix.hh:471\n+_\bD_\bu_\bn_\be_\b:_\b:_\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bd_\be_\br_\bi_\bv_\be_\bd_\b__\bt_\by_\bp_\be\n+Traits::derived_type derived_type\n+type of derived matrix class\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn densematrix.hh:154\n+_\bD_\bu_\bn_\be_\b:_\b:_\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b[_\b]\n+row_reference operator[](size_type i)\n+random access\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn densematrix.hh:189\n+_\bD_\bu_\bn_\be_\b:_\b:_\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\be_\bx_\bi_\bs_\bt_\bs\n+bool exists(size_type i, size_type j) const\n+return true when (i,j) is in pattern\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn densematrix.hh:723\n+_\bD_\bu_\bn_\be_\b:_\b:_\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bR_\bo_\bw_\bI_\bt_\be_\br_\ba_\bt_\bo_\br\n+Iterator RowIterator\n+rename the iterators for easier access\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn densematrix.hh:211\n+_\bD_\bu_\bn_\be_\b:_\b:_\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bb_\bl_\bo_\bc_\bk_\bl_\be_\bv_\be_\bl\n+static constexpr int blocklevel\n+The number of block levels we contain. This is the leaf, that is, 1.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn densematrix.hh:178\n+_\bD_\bu_\bn_\be_\b:_\b:_\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bf_\br_\bo_\bb_\be_\bn_\bi_\bu_\bs_\b__\bn_\bo_\br_\bm\n+FieldTraits< value_type >::real_type frobenius_norm() const\n+frobenius norm: sqrt(sum over squared values of entries)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn densematrix.hh:528\n+_\bD_\bu_\bn_\be_\b:_\b:_\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bu_\bm_\bv\n+void umv(const X &x, Y &y) const\n+y += A x\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn densematrix.hh:406\n+_\bD_\bu_\bn_\be_\b:_\b:_\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bC_\bo_\bn_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br\n+DenseIterator< const DenseMatrix, const row_type, const_row_reference >\n+ConstIterator\n+Iterator class for sequential access.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn densematrix.hh:242\n+_\bD_\bu_\bn_\be_\b:_\b:_\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bi_\bn_\bf_\bi_\bn_\bi_\bt_\by_\b__\bn_\bo_\br_\bm\n+FieldTraits< vt >::real_type infinity_norm() const\n+infinity norm (row sum norm, how to generalize for blocks?)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn densematrix.hh:546\n+_\bD_\bu_\bn_\be_\b:_\b:_\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\br_\bo_\bw_\b__\bt_\by_\bp_\be\n+Traits::row_type row_type\n+The type used to represent a row (must fulfill the Dune::DenseVector interface)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn densematrix.hh:169\n+_\bD_\bu_\bn_\be_\b:_\b:_\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bN\n+constexpr size_type N() const\n+number of rows\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn densematrix.hh:697\n+_\bD_\bu_\bn_\be_\b:_\b:_\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be\n+Traits::size_type size_type\n+The type used for the index access and size operation.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn densematrix.hh:166\n+_\bD_\bu_\bn_\be_\b:_\b:_\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bc_\bo_\bn_\bs_\bt_\b__\br_\bo_\bw_\b__\br_\be_\bf_\be_\br_\be_\bn_\bc_\be\n+Traits::const_row_reference const_row_reference\n+The type used to represent a reference to a constant row (usually const\n+row_type &)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn densematrix.hh:175\n+_\bD_\bu_\bn_\be_\b:_\b:_\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bf_\br_\bo_\bb_\be_\bn_\bi_\bu_\bs_\b__\bn_\bo_\br_\bm_\b2\n+FieldTraits< value_type >::real_type frobenius_norm2() const\n+square of frobenius norm, need for block recursion\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn densematrix.hh:536\n+_\bD_\bu_\bn_\be_\b:_\b:_\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bC_\bo_\bl_\bI_\bt_\be_\br_\ba_\bt_\bo_\br\n+std::remove_reference< row_reference >::type::Iterator ColIterator\n+rename the iterators for easier access\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn densematrix.hh:213\n+_\bD_\bu_\bn_\be_\b:_\b:_\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\br_\bo_\bw_\b__\br_\be_\bf_\be_\br_\be_\bn_\bc_\be\n+Traits::row_reference row_reference\n+The type used to represent a reference to a row (usually row_type &)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn densematrix.hh:172\n+_\bD_\bu_\bn_\be_\b:_\b:_\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b=_\b=\n+bool operator==(const DenseMatrix< Other > &x) const\n+Binary matrix comparison.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn densematrix.hh:348\n+_\bD_\bu_\bn_\be_\b:_\b:_\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bi_\bt_\be_\br_\ba_\bt_\bo_\br\n+Iterator iterator\n+typedef for stl compliant access\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn densematrix.hh:209\n+_\bD_\bu_\bn_\be_\b:_\b:_\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bC_\bo_\bn_\bs_\bt_\bR_\bo_\bw_\bI_\bt_\be_\br_\ba_\bt_\bo_\br\n+ConstIterator ConstRowIterator\n+rename the iterators for easier access\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn densematrix.hh:246\n+_\bD_\bu_\bn_\be_\b:_\b:_\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bI_\bt_\be_\br_\ba_\bt_\bo_\br\n+DenseIterator< DenseMatrix, row_type, row_reference > Iterator\n+Iterator class for sequential access.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn densematrix.hh:207\n+_\bD_\bu_\bn_\be_\b:_\b:_\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bu_\bm_\bt_\bv\n+void umtv(const X &x, Y &y) const\n+y += A^T x\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn densematrix.hh:419\n+_\bD_\bu_\bn_\be_\b:_\b:_\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bb_\be_\bg_\bi_\bn\n+ConstIterator begin() const\n+begin iterator\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn densematrix.hh:251\n+_\bD_\bu_\bn_\be_\b:_\b:_\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bd_\be_\bt_\be_\br_\bm_\bi_\bn_\ba_\bn_\bt\n+field_type determinant(bool doPivoting=true) const\n+calculates the determinant of this matrix\n+_\bD_\bu_\bn_\be_\b:_\b:_\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bb_\be_\bg_\bi_\bn\n+Iterator begin()\n+begin iterator\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn densematrix.hh:216\n+_\bD_\bu_\bn_\be_\b:_\b:_\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bu_\bm_\bh_\bv\n+void umhv(const X &x, Y &y) const\n+y += A^H x\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn densematrix.hh:432\n+_\bD_\bu_\bn_\be_\b:_\b:_\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b+_\b=\n+derived_type & operator+=(const DenseMatrix< Other > &x)\n+vector space addition\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn densematrix.hh:289\n+_\bD_\bu_\bn_\be_\b:_\b:_\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\be_\bn_\bd\n+ConstIterator end() const\n+end iterator\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn densematrix.hh:257\n+_\bD_\bu_\bn_\be_\b:_\b:_\bF_\bi_\be_\bl_\bd_\bT_\br_\ba_\bi_\bt_\bs_\b<_\b _\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bM_\b _\b>_\b _\b>_\b:_\b:_\br_\be_\ba_\bl_\b__\bt_\by_\bp_\be\n+const FieldTraits< typenameDenseMatVecTraits< M >::value_type >::real_type\n+real_type\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn densematrix.hh:34\n+_\bD_\bu_\bn_\be_\b:_\b:_\bF_\bi_\be_\bl_\bd_\bT_\br_\ba_\bi_\bt_\bs_\b<_\b _\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bM_\b _\b>_\b _\b>_\b:_\b:_\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be\n+const FieldTraits< typenameDenseMatVecTraits< M >::value_type >::field_type\n+field_type\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn densematrix.hh:33\n+_\bD_\bu_\bn_\be_\b:_\b:_\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx\n+A dense n x m matrix.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn fmatrix.hh:117\n+_\bD_\bu_\bn_\be_\b:_\b:_\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be\n+Base::size_type size_type\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn fmatrix.hh:127\n+_\bD_\bu_\bn_\be_\b:_\b:_\bF_\bi_\be_\bl_\bd_\bV_\be_\bc_\bt_\bo_\br\n+vector space out of a tensor product of fields.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn fvector.hh:91\n+_\bD_\bu_\bn_\be_\b:_\b:_\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\bA_\bs_\bs_\bi_\bg_\bn_\be_\br\n+you have to specialize this structure for any type that should be assignable to\n+a DenseMatrix\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn densematrix.hh:59\n+_\bD_\bu_\bn_\be_\b:_\b:_\bF_\bM_\ba_\bt_\br_\bi_\bx_\bE_\br_\br_\bo_\br\n+Error thrown if operations of a FieldMatrix fail.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn densematrix.hh:126\n+_\bD_\bu_\bn_\be_\b:_\b:_\bD_\be_\bn_\bs_\be_\bV_\be_\bc_\bt_\bo_\br\n+Interface for a class of dense vectors over a given field.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn densevector.hh:229\n+_\bD_\bu_\bn_\be_\b:_\b:_\bD_\be_\bn_\bs_\be_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\bs_\bi_\bz_\be\n+size_type size() const\n+size method\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn densevector.hh:336\n+_\bD_\bu_\bn_\be_\b:_\b:_\bD_\be_\bn_\bs_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br\n+Generic iterator class for dense vector and matrix implementations.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn densevector.hh:131\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\bh_\bE_\br_\br_\bo_\br\n+Default exception class for mathematical errors.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn exceptions.hh:241\n+_\bD_\bu_\bn_\be_\b:_\b:_\bF_\bi_\be_\bl_\bd_\bT_\br_\ba_\bi_\bt_\bs\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn ftraits.hh:26\n+_\bD_\bu_\bn_\be_\b:_\b:_\bF_\bi_\be_\bl_\bd_\bT_\br_\ba_\bi_\bt_\bs_\b:_\b:_\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be\n+T field_type\n+export the type representing the field\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn ftraits.hh:28\n+_\bD_\bu_\bn_\be_\b:_\b:_\bF_\bi_\be_\bl_\bd_\bT_\br_\ba_\bi_\bt_\bs_\b:_\b:_\br_\be_\ba_\bl_\b__\bt_\by_\bp_\be\n+T real_type\n+export the type representing the real type of the field\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn ftraits.hh:30\n+_\bD_\bu_\bn_\be_\b:_\b:_\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\bV_\be_\bc_\bT_\br_\ba_\bi_\bt_\bs\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matvectraits.hh:31\n+_\bD_\bu_\bn_\be_\b:_\b:_\bF_\bM_\ba_\bt_\br_\bi_\bx_\bP_\br_\be_\bc_\bi_\bs_\bi_\bo_\bn_\b:_\b:_\ba_\bb_\bs_\bo_\bl_\bu_\bt_\be_\b__\bl_\bi_\bm_\bi_\bt\n+static ctype absolute_limit()\n+return threshold to declare matrix singular\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn precision.hh:28\n+_\bs_\bi_\bm_\bd_\b._\bh_\bh\n+Include file for users of the SIMD abstraction layer.\n ===============================================================================\n Generated by\u00a0_\b[_\bd_\bo_\bx_\by_\bg_\be_\bn_\b] 1.9.8\n"}]}, {"source1": "./usr/share/doc/libdune-common-doc/doxygen/a00149.html", "source2": "./usr/share/doc/libdune-common-doc/doxygen/a00149.html", "unified_diff": "@@ -1,15 +1,15 @@\n \n \n \n \n \n \n \n-dune-common: span.hh File Reference\n+dune-common: parametertree.cc File Reference\n \n \n \n \n \n \n \n@@ -65,84 +65,31 @@\n \n \n \n \n \n \n \n
    \n- \n-
    span.hh File Reference
    \n+
    parametertree.cc File Reference
    \n
    \n
    \n-
    #include <cassert>
    \n-#include <cstddef>
    \n-#include <exception>
    \n-#include <iterator>
    \n-#include <limits>
    \n-#include <stdexcept>
    \n+
    #include <cstdlib>
    \n+#include <iostream>
    \n+#include <ostream>
    \n #include <string>
    \n-#include <type_traits>
    \n-#include <dune/common/exceptions.hh>
    \n-#include <dune/common/std/memory.hh>
    \n-
    \n-

    Go to the source code of this file.

    \n-\n-\n-\n-\n-\n-

    \n-Classes

    class  Dune::Std::span< Element, Extent >
     A contiguous sequence of elements with static or dynamic extent. More...
     
    \n-\n-\n-\n-\n-\n-\n-\n-

    \n-Namespaces

    namespace  Dune
     Dune namespace.
     
    namespace  Dune::Std
     Namespace for features backported from new C++ standards.
     
    \n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-

    \n-Functions

    template<class T , std::size_t N>
     Dune::Std::span (T(&)[N]) -> span< T, N >
     
    template<class ElementType , class I , std::size_t Extent, std::enable_if_t< std::is_convertible_v< I, std::size_t >, int > = 0>
     Dune::Std::span (ElementType *, std::integral_constant< I, Extent >) -> span< ElementType, Extent >
     
    template<class ElementType , class I , std::enable_if_t< std::is_integral_v< I >, int > = 0, std::enable_if_t< std::is_convertible_v< I, std::size_t >, int > = 0>
     Dune::Std::span (ElementType *, I) -> span< ElementType, Std::dynamic_extent >
     
    template<class Iter , class Element = std::remove_reference_t<decltype(*std::declval<Iter>())>>
     Dune::Std::span (Iter, Iter) -> span< Element, Std::dynamic_extent >
     
    template<class Range , class First = decltype(std::begin(std::declval<Range>())), class Last = decltype(std::end(std::declval<Range>())), class Element = std::remove_reference_t<decltype(*std::declval<First>())>>
     Dune::Std::span (Range &) -> span< Element, Std::dynamic_extent >
     
    template<class T , size_t N>
     Dune::Std::span (std::array< T, N > &) -> span< T, N >
     
    template<class T , size_t N>
     Dune::Std::span (const std::array< T, N > &) -> span< const T, N >
     
    \n-\n-\n-\n-\n-

    \n-Variables

    constexpr std::size_t Dune::Std::dynamic_extent = std::numeric_limits<std::size_t>::max()
     A constant of type std::size_t that is used to differentiate std::span of static and dynamic extent.
     
    \n-
    \n+#include <sstream>
    \n+#include <fstream>
    \n+#include <set>
    \n+#include <algorithm>
    \n+#include <dune/common/exceptions.hh>
    \n+#include <dune/common/parametertree.hh>
    \n+
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,70 +1,19 @@\n dune-common\u00a02.10\n Loading...\n Searching...\n No Matches\n * _\bd_\bu_\bn_\be\n * _\bc_\bo_\bm_\bm_\bo_\bn\n- * _\bs_\bt_\bd\n-_\bC_\bl_\ba_\bs_\bs_\be_\bs | _\bN_\ba_\bm_\be_\bs_\bp_\ba_\bc_\be_\bs | _\bF_\bu_\bn_\bc_\bt_\bi_\bo_\bn_\bs | _\bV_\ba_\br_\bi_\ba_\bb_\bl_\be_\bs\n-span.hh File Reference\n-#include \n-#include \n-#include \n-#include \n-#include \n-#include \n+parametertree.cc File Reference\n+#include \n+#include \n+#include \n #include \n-#include \n+#include \n+#include \n+#include \n+#include \n #include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\be_\bx_\bc_\be_\bp_\bt_\bi_\bo_\bn_\bs_\b._\bh_\bh>\n-#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bs_\bt_\bd_\b/_\bm_\be_\bm_\bo_\br_\by_\b._\bh_\bh>\n-_\bG_\bo_\b _\bt_\bo_\b _\bt_\bh_\be_\b _\bs_\bo_\bu_\br_\bc_\be_\b _\bc_\bo_\bd_\be_\b _\bo_\bf_\b _\bt_\bh_\bi_\bs_\b _\bf_\bi_\bl_\be_\b.\n-C\bCl\bla\bas\bss\bse\bes\bs\n-class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bS_\bt_\bd_\b:_\b:_\bs_\bp_\ba_\bn_\b<_\b _\bE_\bl_\be_\bm_\be_\bn_\bt_\b,_\b _\bE_\bx_\bt_\be_\bn_\bt_\b _\b>\n-\u00a0 A contiguous sequence of elements with static or dynamic extent.\n- _\bM_\bo_\br_\be_\b._\b._\b.\n-\u00a0\n-N\bNa\bam\bme\bes\bsp\bpa\bac\bce\bes\bs\n-namespace \u00a0 _\bD_\bu_\bn_\be\n-\u00a0 _\bD_\bu_\bn_\be namespace.\n-\u00a0\n-namespace \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bS_\bt_\bd\n-\u00a0 Namespace for features backported from new C++ standards.\n-\u00a0\n-F\bFu\bun\bnc\bct\bti\bio\bon\bns\bs\n-template\n-\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bS_\bt_\bd_\b:_\b:_\bs_\bp_\ba_\bn (T(&)[N]) -> _\bs_\bp_\ba_\bn< T, N >\n-\u00a0\n-template, int > = 0>\n-\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bS_\bt_\bd_\b:_\b:_\bs_\bp_\ba_\bn (ElementType *, std::integral_constant< I, Extent >) -> _\bs_\bp_\ba_\bn<\n- ElementType, Extent >\n-\u00a0\n-template, int > = 0, std::enable_if_t< std::is_convertible_v< I, std::size_t >, int >\n-= 0>\n-\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bS_\bt_\bd_\b:_\b:_\bs_\bp_\ba_\bn (ElementType *, I) -> _\bs_\bp_\ba_\bn< ElementType, _\bS_\bt_\bd_\b:_\b:_\bd_\by_\bn_\ba_\bm_\bi_\bc_\b__\be_\bx_\bt_\be_\bn_\bt\n- >\n-\u00a0\n-template())>>\n-\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bS_\bt_\bd_\b:_\b:_\bs_\bp_\ba_\bn (Iter, Iter) -> _\bs_\bp_\ba_\bn< Element, _\bS_\bt_\bd_\b:_\b:_\bd_\by_\bn_\ba_\bm_\bi_\bc_\b__\be_\bx_\bt_\be_\bn_\bt >\n-\u00a0\n-template\n-())), class Last = decltype(std::end(std::declval())), class Element =\n-std::remove_reference_t())>>\n-\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bS_\bt_\bd_\b:_\b:_\bs_\bp_\ba_\bn (Range &) -> _\bs_\bp_\ba_\bn< Element, _\bS_\bt_\bd_\b:_\b:_\bd_\by_\bn_\ba_\bm_\bi_\bc_\b__\be_\bx_\bt_\be_\bn_\bt >\n-\u00a0\n-template\n-\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bS_\bt_\bd_\b:_\b:_\bs_\bp_\ba_\bn (std::array< T, N > &) -> _\bs_\bp_\ba_\bn< T, N >\n-\u00a0\n-template\n-\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bS_\bt_\bd_\b:_\b:_\bs_\bp_\ba_\bn (const std::array< T, N > &) -> _\bs_\bp_\ba_\bn< const T, N >\n-\u00a0\n-V\bVa\bar\bri\bia\bab\bbl\ble\bes\bs\n-constexpr std::size_t\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bS_\bt_\bd_\b:_\b:_\bd_\by_\bn_\ba_\bm_\bi_\bc_\b__\be_\bx_\bt_\be_\bn_\bt = std::numeric_limits::max()\n-\u00a0 A constant of type std::size_t that is used to\n- differentiate std::span of static and dynamic extent.\n-\u00a0\n+#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bp_\ba_\br_\ba_\bm_\be_\bt_\be_\br_\bt_\br_\be_\be_\b._\bh_\bh>\n ===============================================================================\n Generated by\u00a0_\b[_\bd_\bo_\bx_\by_\bg_\be_\bn_\b] 1.9.8\n"}]}, {"source1": "./usr/share/doc/libdune-common-doc/doxygen/a00152.html", "source2": "./usr/share/doc/libdune-common-doc/doxygen/a00152.html", "unified_diff": "@@ -1,15 +1,15 @@\n \n \n \n \n \n \n \n-dune-common: mdarray.hh File Reference\n+dune-common: stdstreams.hh File Reference\n \n \n \n \n \n \n \n@@ -65,55 +65,90 @@\n \n \n \n \n \n \n \n
    \n \n-
    mdarray.hh File Reference
    \n+Namespaces |\n+Macros |\n+Typedefs |\n+Variables
    \n+
    stdstreams.hh File Reference
    \n \n
    \n-
    #include <algorithm>
    \n-#include <array>
    \n-#include <memory>
    \n-#include <vector>
    \n-#include <tuple>
    \n-#include <type_traits>
    \n-#include <dune/common/indices.hh>
    \n-#include <dune/common/rangeutilities.hh>
    \n-#include <dune/common/std/default_accessor.hh>
    \n-#include <dune/common/std/mdspan.hh>
    \n-#include <dune/common/std/memory.hh>
    \n-#include <dune/common/std/span.hh>
    \n-#include <dune/common/std/impl/containerconstructiontraits.hh>
    \n+\n+

    Standard Dune debug streams. \n+More...

    \n+
    #include <dune-common-config.hh>
    \n+#include "debugstream.hh"
    \n
    \n

    Go to the source code of this file.

    \n \n-\n-\n-\n-\n-

    \n-Classes

    class  Dune::Std::mdarray< Element, Extents, LayoutPolicy, Container >
     An owning multi-dimensional array analog of mdspan. More...
     
    \n \n \n \n \n-\n-\n-\n+

    \n Namespaces

    namespace  Dune
     Dune namespace.
     
    namespace  Dune::Std
     Namespace for features backported from new C++ standards.
     
    \n+\n+\n+\n+\n+

    \n+Macros

    #define DUNE_MINIMAL_DEBUG_LEVEL   4
     The default minimum debug level.
     
    \n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+

    \n+Typedefs

    typedef DebugStream< VERY_VERBOSE_DEBUG_LEVEL, MINIMAL_DEBUG_LEVELDune::DVVerbType
     Type of very verbose debug stream.
     
    typedef DebugStream< VERBOSE_DEBUG_LEVEL, MINIMAL_DEBUG_LEVELDune::DVerbType
     Type of more verbose debug stream.
     
    typedef DebugStream< INFO_DEBUG_LEVEL, MINIMAL_DEBUG_LEVELDune::DInfoType
     Type of debug stream with info level.
     
    typedef DebugStream< WARN_DEBUG_LEVEL, MINIMAL_DEBUG_LEVELDune::DWarnType
     Type of debug stream with warn level.
     
    typedef DebugStream< GRAVE_DEBUG_LEVEL, MINIMAL_DEBUG_LEVELDune::DGraveType
     Type of debug stream for fatal errors.
     
    typedef DebugStream< 1 > Dune::DErrType
     The type of the stream used for error messages.
     
    \n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n

    \n+Variables

    static const DebugLevel Dune::MINIMAL_DEBUG_LEVEL = DUNE_MINIMAL_DEBUG_LEVEL
     
    static const DebugLevel Dune::VERY_VERBOSE_DEBUG_LEVEL = 1
     The level of the very verbose debug stream.
     
    static const DebugLevel Dune::VERBOSE_DEBUG_LEVEL = 2
     The level of the verbose debug stream.
     
    static const DebugLevel Dune::INFO_DEBUG_LEVEL = 3
     The level of the informative debug stream.
     
    static const DebugLevel Dune::WARN_DEBUG_LEVEL = 4
     The level of the debug stream for warnings.
     
    static const DebugLevel Dune::GRAVE_DEBUG_LEVEL = 5
     The level of the debug stream for fatal errors.
     
    \n-
    \n+

    Detailed Description

    \n+

    Standard Dune debug streams.

    \n+

    The standard debug streams are compiled into libdune to exist globally. This file declares the stream types and the global debug level.

    \n+
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,36 +1,71 @@\n dune-common\u00a02.10\n Loading...\n Searching...\n No Matches\n * _\bd_\bu_\bn_\be\n * _\bc_\bo_\bm_\bm_\bo_\bn\n- * _\bs_\bt_\bd\n-_\bC_\bl_\ba_\bs_\bs_\be_\bs | _\bN_\ba_\bm_\be_\bs_\bp_\ba_\bc_\be_\bs\n-mdarray.hh File Reference\n-#include \n-#include \n-#include \n-#include \n-#include \n-#include \n-#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bi_\bn_\bd_\bi_\bc_\be_\bs_\b._\bh_\bh>\n-#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\br_\ba_\bn_\bg_\be_\bu_\bt_\bi_\bl_\bi_\bt_\bi_\be_\bs_\b._\bh_\bh>\n-#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bs_\bt_\bd_\b/_\bd_\be_\bf_\ba_\bu_\bl_\bt_\b__\ba_\bc_\bc_\be_\bs_\bs_\bo_\br_\b._\bh_\bh>\n-#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bs_\bt_\bd_\b/_\bm_\bd_\bs_\bp_\ba_\bn_\b._\bh_\bh>\n-#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bs_\bt_\bd_\b/_\bm_\be_\bm_\bo_\br_\by_\b._\bh_\bh>\n-#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bs_\bt_\bd_\b/_\bs_\bp_\ba_\bn_\b._\bh_\bh>\n-#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bs_\bt_\bd_\b/_\bi_\bm_\bp_\bl_\b/_\bc_\bo_\bn_\bt_\ba_\bi_\bn_\be_\br_\bc_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bi_\bo_\bn_\bt_\br_\ba_\bi_\bt_\bs_\b._\bh_\bh>\n+_\bN_\ba_\bm_\be_\bs_\bp_\ba_\bc_\be_\bs | _\bM_\ba_\bc_\br_\bo_\bs | _\bT_\by_\bp_\be_\bd_\be_\bf_\bs | _\bV_\ba_\br_\bi_\ba_\bb_\bl_\be_\bs\n+stdstreams.hh File Reference\n+Standard _\bD_\bu_\bn_\be debug streams. _\bM_\bo_\br_\be_\b._\b._\b.\n+#include \n+#include \"_\bd_\be_\bb_\bu_\bg_\bs_\bt_\br_\be_\ba_\bm_\b._\bh_\bh\"\n _\bG_\bo_\b _\bt_\bo_\b _\bt_\bh_\be_\b _\bs_\bo_\bu_\br_\bc_\be_\b _\bc_\bo_\bd_\be_\b _\bo_\bf_\b _\bt_\bh_\bi_\bs_\b _\bf_\bi_\bl_\be_\b.\n-C\bCl\bla\bas\bss\bse\bes\bs\n-class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bS_\bt_\bd_\b:_\b:_\bm_\bd_\ba_\br_\br_\ba_\by_\b<_\b _\bE_\bl_\be_\bm_\be_\bn_\bt_\b,_\b _\bE_\bx_\bt_\be_\bn_\bt_\bs_\b,_\b _\bL_\ba_\by_\bo_\bu_\bt_\bP_\bo_\bl_\bi_\bc_\by_\b,_\b _\bC_\bo_\bn_\bt_\ba_\bi_\bn_\be_\br_\b _\b>\n-\u00a0 An owning multi-dimensional array analog of mdspan. _\bM_\bo_\br_\be_\b._\b._\b.\n-\u00a0\n N\bNa\bam\bme\bes\bsp\bpa\bac\bce\bes\bs\n namespace \u00a0 _\bD_\bu_\bn_\be\n \u00a0 _\bD_\bu_\bn_\be namespace.\n \u00a0\n-namespace \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bS_\bt_\bd\n-\u00a0 Namespace for features backported from new C++ standards.\n+M\bMa\bac\bcr\bro\bos\bs\n+#define\u00a0 _\bD_\bU_\bN_\bE_\b__\bM_\bI_\bN_\bI_\bM_\bA_\bL_\b__\bD_\bE_\bB_\bU_\bG_\b__\bL_\bE_\bV_\bE_\bL\u00a0\u00a0\u00a04\n+\u00a0 The default minimum debug level.\n+\u00a0\n+T\bTy\byp\bpe\bed\bde\bef\bfs\bs\n+ typedef _\bD_\be_\bb_\bu_\bg_\bS_\bt_\br_\be_\ba_\bm<\n+ _\bV_\bE_\bR_\bY_\b__\bV_\bE_\bR_\bB_\bO_\bS_\bE_\b__\bD_\bE_\bB_\bU_\bG_\b__\bL_\bE_\bV_\bE_\bL,\n+ _\bM_\bI_\bN_\bI_\bM_\bA_\bL_\b__\bD_\bE_\bB_\bU_\bG_\b__\bL_\bE_\bV_\bE_\bL >\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bD_\bV_\bV_\be_\br_\bb_\bT_\by_\bp_\be\n+\u00a0 Type of very verbose debug stream.\n+\u00a0\n+ typedef _\bD_\be_\bb_\bu_\bg_\bS_\bt_\br_\be_\ba_\bm<\n+_\bV_\bE_\bR_\bB_\bO_\bS_\bE_\b__\bD_\bE_\bB_\bU_\bG_\b__\bL_\bE_\bV_\bE_\bL, _\bM_\bI_\bN_\bI_\bM_\bA_\bL_\b__\bD_\bE_\bB_\bU_\bG_\b__\bL_\bE_\bV_\bE_\bL\n+ >\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bD_\bV_\be_\br_\bb_\bT_\by_\bp_\be\n+\u00a0 Type of more verbose debug stream.\n+\u00a0\n+ typedef _\bD_\be_\bb_\bu_\bg_\bS_\bt_\br_\be_\ba_\bm< _\bI_\bN_\bF_\bO_\b__\bD_\bE_\bB_\bU_\bG_\b__\bL_\bE_\bV_\bE_\bL,\n+ _\bM_\bI_\bN_\bI_\bM_\bA_\bL_\b__\bD_\bE_\bB_\bU_\bG_\b__\bL_\bE_\bV_\bE_\bL >\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bD_\bI_\bn_\bf_\bo_\bT_\by_\bp_\be\n+\u00a0 Type of debug stream with info level.\n+\u00a0\n+ typedef _\bD_\be_\bb_\bu_\bg_\bS_\bt_\br_\be_\ba_\bm< _\bW_\bA_\bR_\bN_\b__\bD_\bE_\bB_\bU_\bG_\b__\bL_\bE_\bV_\bE_\bL,\n+ _\bM_\bI_\bN_\bI_\bM_\bA_\bL_\b__\bD_\bE_\bB_\bU_\bG_\b__\bL_\bE_\bV_\bE_\bL >\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bD_\bW_\ba_\br_\bn_\bT_\by_\bp_\be\n+\u00a0 Type of debug stream with warn level.\n+\u00a0\n+ typedef _\bD_\be_\bb_\bu_\bg_\bS_\bt_\br_\be_\ba_\bm< _\bG_\bR_\bA_\bV_\bE_\b__\bD_\bE_\bB_\bU_\bG_\b__\bL_\bE_\bV_\bE_\bL,\n+ _\bM_\bI_\bN_\bI_\bM_\bA_\bL_\b__\bD_\bE_\bB_\bU_\bG_\b__\bL_\bE_\bV_\bE_\bL >\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bD_\bG_\br_\ba_\bv_\be_\bT_\by_\bp_\be\n+\u00a0 Type of debug stream for fatal errors.\n+\u00a0\n+ typedef _\bD_\be_\bb_\bu_\bg_\bS_\bt_\br_\be_\ba_\bm< 1 >\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bD_\bE_\br_\br_\bT_\by_\bp_\be\n+\u00a0 The type of the stream used for error\n+ messages.\n+\u00a0\n+V\bVa\bar\bri\bia\bab\bbl\ble\bes\bs\n+static const _\bD_\be_\bb_\bu_\bg_\bL_\be_\bv_\be_\bl\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bM_\bI_\bN_\bI_\bM_\bA_\bL_\b__\bD_\bE_\bB_\bU_\bG_\b__\bL_\bE_\bV_\bE_\bL = _\bD_\bU_\bN_\bE_\b__\bM_\bI_\bN_\bI_\bM_\bA_\bL_\b__\bD_\bE_\bB_\bU_\bG_\b__\bL_\bE_\bV_\bE_\bL\n+\u00a0\n+static const _\bD_\be_\bb_\bu_\bg_\bL_\be_\bv_\be_\bl\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bV_\bE_\bR_\bY_\b__\bV_\bE_\bR_\bB_\bO_\bS_\bE_\b__\bD_\bE_\bB_\bU_\bG_\b__\bL_\bE_\bV_\bE_\bL = 1\n+\u00a0 The level of the very verbose debug stream.\n+\u00a0\n+static const _\bD_\be_\bb_\bu_\bg_\bL_\be_\bv_\be_\bl\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bV_\bE_\bR_\bB_\bO_\bS_\bE_\b__\bD_\bE_\bB_\bU_\bG_\b__\bL_\bE_\bV_\bE_\bL = 2\n+\u00a0 The level of the verbose debug stream.\n+\u00a0\n+static const _\bD_\be_\bb_\bu_\bg_\bL_\be_\bv_\be_\bl\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bI_\bN_\bF_\bO_\b__\bD_\bE_\bB_\bU_\bG_\b__\bL_\bE_\bV_\bE_\bL = 3\n+\u00a0 The level of the informative debug stream.\n+\u00a0\n+static const _\bD_\be_\bb_\bu_\bg_\bL_\be_\bv_\be_\bl\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bW_\bA_\bR_\bN_\b__\bD_\bE_\bB_\bU_\bG_\b__\bL_\bE_\bV_\bE_\bL = 4\n+\u00a0 The level of the debug stream for warnings.\n+\u00a0\n+static const _\bD_\be_\bb_\bu_\bg_\bL_\be_\bv_\be_\bl\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bG_\bR_\bA_\bV_\bE_\b__\bD_\bE_\bB_\bU_\bG_\b__\bL_\bE_\bV_\bE_\bL = 5\n+\u00a0 The level of the debug stream for fatal errors.\n \u00a0\n+*\b**\b**\b**\b**\b* D\bDe\bet\bta\bai\bil\ble\bed\bd D\bDe\bes\bsc\bcr\bri\bip\bpt\bti\bio\bon\bn *\b**\b**\b**\b**\b*\n+Standard _\bD_\bu_\bn_\be debug streams.\n+The standard debug streams are compiled into libdune to exist globally. This\n+file declares the stream types and the global debug level.\n ===============================================================================\n Generated by\u00a0_\b[_\bd_\bo_\bx_\by_\bg_\be_\bn_\b] 1.9.8\n"}]}, {"source1": "./usr/share/doc/libdune-common-doc/doxygen/a00152_source.html", "source2": "./usr/share/doc/libdune-common-doc/doxygen/a00152_source.html", "unified_diff": "@@ -1,15 +1,15 @@\n \n \n \n \n \n \n \n-dune-common: mdarray.hh Source File\n+dune-common: stdstreams.hh Source File\n \n \n \n \n \n \n \n@@ -70,712 +70,99 @@\n \n \n \n \n \n \n \n
    \n-
    mdarray.hh
    \n+
    stdstreams.hh
    \n
    \n
    \n Go to the documentation of this file.
    1// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
    \n
    2// vi: set et ts=4 sw=2 sts=2:
    \n
    3// SPDX-FileCopyrightInfo: Copyright \u00a9 DUNE Project contributors, see file LICENSE.md in module root
    \n
    4// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception
    \n-
    5#ifndef DUNE_COMMON_STD_MDARRAY_HH
    \n-
    6#define DUNE_COMMON_STD_MDARRAY_HH
    \n-
    7
    \n-
    8#include <algorithm>
    \n-
    9#include <array>
    \n-
    10#include <memory>
    \n-
    11#include <vector>
    \n-
    12#include <tuple>
    \n-
    13#include <type_traits>
    \n-
    14#if __has_include(<version>)
    \n-
    15 #include <version>
    \n-
    16#endif
    \n+
    5
    \n+
    15#ifndef DUNE_COMMON_STDSTREAMS_HH
    \n+
    16#define DUNE_COMMON_STDSTREAMS_HH
    \n
    17
    \n-\n-\n-\n-\n-\n-\n-\n-
    25
    \n-
    26namespace Dune::Std {
    \n-
    27
    \n-
    66template <class Element, class Extents, class LayoutPolicy = Std::layout_right,
    \n-
    67 class Container = std::vector<Element>>
    \n-
    \n-\n-
    69{
    \n-
    70 template <class,class,class,class> friend class mdarray;
    \n+
    18#include <dune-common-config.hh> // DUNE_MINIMAL_DEBUG_LEVEL
    \n+
    19#include "debugstream.hh"
    \n+
    20
    \n+
    21namespace Dune {
    \n+
    22
    \n+
    67#ifndef DUNE_MINIMAL_DEBUG_LEVEL
    \n+
    68#define DUNE_MINIMAL_DEBUG_LEVEL 4
    \n+
    69#endif
    \n+\n
    71
    \n-
    72 static_assert(std::is_object_v<Element>);
    \n-
    73 static_assert(!std::is_abstract_v<Element>);
    \n-
    74 static_assert(!std::is_array_v<Element>);
    \n-
    75 static_assert(std::is_same_v<Element, typename Container::value_type>);
    \n-
    76
    \n-
    77public:
    \n-
    78 using element_type = Element;
    \n-
    79 using extents_type = Extents;
    \n-
    80 using layout_type = LayoutPolicy;
    \n-
    81 using container_type = Container;
    \n-
    82
    \n-\n-
    84 using mapping_type = typename layout_type::template mapping<extents_type>;
    \n-
    85
    \n-
    86 using index_type = typename extents_type::index_type;
    \n-
    87 using size_type = typename extents_type::size_type;
    \n-
    88 using rank_type = typename extents_type::rank_type;
    \n-
    89
    \n-\n-\n-
    92
    \n-
    93 using pointer = decltype(Std::to_address(std::declval<container_type>().begin()));
    \n-
    94 using reference = typename container_type::reference;
    \n-
    95 using const_pointer = decltype(Std::to_address(std::declval<container_type>().cbegin()));
    \n-
    96 using const_reference = typename container_type::const_reference;
    \n+\n+
    77
    \n+\n+
    83
    \n+\n
    97
    \n-
    98 static_assert(std::is_constructible_v<mapping_type, extents_type>);
    \n-
    99
    \n-
    100private:
    \n-
    101 // helper function to construct the container
    \n-
    102 template <class C, class... Args>
    \n-
    103 static constexpr auto construct_container (Args&&... args)
    \n-
    104 -> decltype(Impl::ContainerConstructionTraits<C>::construct(std::forward<Args>(args)...))
    \n-
    105 {
    \n-
    106 return Impl::ContainerConstructionTraits<C>::construct(std::forward<Args>(args)...);
    \n-
    107 }
    \n-
    108
    \n-
    109public:
    \n-
    112
    \n-
    114 template <class E = extents_type, class C = container_type, class M = mapping_type,
    \n-
    115 std::enable_if_t<(E::rank_dynamic() != 0), int> = 0,
    \n-
    116 std::enable_if_t<std::is_default_constructible_v<C>, int> = 0,
    \n-
    117 std::enable_if_t<std::is_default_constructible_v<M>, int> = 0>
    \n-
    \n-
    118 constexpr mdarray ()
    \n-
    119 : container_{}
    \n-
    120 , mapping_{}
    \n-
    121 {}
    \n-
    \n-
    122
    \n-
    123
    \n-
    124 // -------------------------------------
    \n-
    125 // constructors from extents or mappings
    \n-
    126
    \n-
    127
    \n-
    129 template <class... IndexTypes,
    \n-
    130 std::enable_if_t<(... && std::is_convertible_v<IndexTypes,index_type>), int> = 0,
    \n-
    131 std::enable_if_t<std::is_constructible_v<extents_type,IndexTypes...>, int> = 0,
    \n-
    132 std::enable_if_t<(... && std::is_nothrow_constructible_v<index_type,IndexTypes>), int> = 0>
    \n-
    \n-
    133 explicit constexpr mdarray (IndexTypes... exts)
    \n-
    134 : mdarray(extents_type(index_type(std::move(exts))...))
    \n-
    135 {}
    \n-
    \n-
    136
    \n-
    \n-
    138 explicit constexpr mdarray (const extents_type& e)
    \n-\n-
    140 {}
    \n-
    \n-
    141
    \n-
    143 template <class C = container_type,
    \n-
    144 decltype(construct_container<C>(std::declval<std::size_t>()), bool{}) = true>
    \n-
    \n-
    145 explicit constexpr mdarray (const mapping_type& m)
    \n-
    146 : container_(construct_container<C>(m.required_span_size()))
    \n-
    147 , mapping_(m)
    \n-
    148 {}
    \n-
    \n-
    149
    \n-
    150
    \n-
    151 // ---------------------------------------
    \n-
    152 // constructors with a given initial value
    \n-
    153
    \n-
    \n-
    155 constexpr mdarray (const extents_type& e, const value_type& v)
    \n-
    156 : mdarray(mapping_type(e), v)
    \n-
    157 {}
    \n-
    \n-
    158
    \n-
    160 template <class C = container_type,
    \n-
    161 decltype(construct_container<C>(std::declval<std::size_t>(),std::declval<const value_type&>()), bool{}) = true>
    \n-
    \n-
    162 constexpr mdarray (const mapping_type& m, const value_type& v)
    \n-
    163 : container_(construct_container<C>(m.required_span_size(), v))
    \n-
    164 , mapping_(m)
    \n-
    165 {}
    \n-
    \n-
    166
    \n-
    167
    \n-
    168 // -----------------------------------
    \n-
    169 // constructors with a given container
    \n-
    170
    \n-
    172 template <class E = extents_type,
    \n-
    173 std::enable_if_t<std::is_constructible_v<mapping_type,const E&>, int> = 0>
    \n-
    \n-
    174 constexpr mdarray (const E& e, const container_type& c)
    \n-
    175 : container_(c)
    \n-
    176 , mapping_(e)
    \n-
    177 {}
    \n-
    \n-
    178
    \n-
    180 template <class E = extents_type,
    \n-
    181 std::enable_if_t<std::is_constructible_v<mapping_type,const E&>, int> = 0>
    \n-
    \n-
    182 constexpr mdarray (const E& e, container_type&& c)
    \n-
    183 : container_(std::move(c))
    \n-
    184 , mapping_(e)
    \n-
    185 {}
    \n-
    \n-
    186
    \n-
    \n-
    188 constexpr mdarray (const mapping_type& m, const container_type& c)
    \n-
    189 : container_(c)
    \n-
    190 , mapping_(m)
    \n-
    191 {}
    \n-
    \n-
    192
    \n-
    \n-
    194 constexpr mdarray (const mapping_type& m, container_type&& c)
    \n-
    195 : container_(std::move(c))
    \n-
    196 , mapping_(m)
    \n-
    197 {}
    \n-
    \n-
    198
    \n-
    199
    \n-
    200 // -----------------------
    \n-
    201 // converting constructors
    \n-
    202
    \n-
    204 template <class OtherElementType, class OtherExtents, class OtherLayoutPolicy, class OtherContainer,
    \n-
    205 std::enable_if_t<std::is_constructible_v<Container,const OtherContainer&>, int> = 0,
    \n-
    206 std::enable_if_t<std::is_constructible_v<extents_type,OtherExtents>, int> = 0,
    \n-
    207 std::enable_if_t<std::is_constructible_v<mapping_type,const typename OtherLayoutPolicy::template mapping<OtherExtents>&>, int> = 0>
    \n-
    208 #if __cpp_conditional_explicit >= 201806L
    \n-
    209 explicit(
    \n-
    210 !std::is_convertible_v<const typename OtherLayoutPolicy::template mapping<OtherExtents>&, mapping_type> ||
    \n-
    211 !std::is_convertible_v<const OtherContainer&, container_type>)
    \n-
    212 #endif
    \n-
    \n-\n-
    214 : container_(other.container_)
    \n-
    215 , mapping_(other.mapping_)
    \n-
    216 {}
    \n-
    \n-
    217
    \n-
    219 template <class OtherElementType, class OtherExtents, class OtherLayoutPolicy, class Accessor,
    \n-
    220 std::enable_if_t<std::is_constructible_v<value_type,typename Accessor::reference>, int> = 0,
    \n-
    221 std::enable_if_t<std::is_assignable_v<typename Accessor::reference, value_type>, int> = 0,
    \n-
    222 std::enable_if_t<std::is_constructible_v<mapping_type, const typename OtherLayoutPolicy::template mapping<OtherExtents>&>, int> = 0,
    \n-
    223 decltype(construct_container<container_type>(std::declval<std::size_t>()), bool{}) = true>
    \n-
    224 #if __cpp_conditional_explicit >= 201806L
    \n-
    225 explicit(
    \n-
    226 !std::is_convertible_v<const typename OtherLayoutPolicy::template mapping<OtherExtents>&, mapping_type> ||
    \n-
    227 !std::is_convertible_v<typename Accessor::reference, value_type>)
    \n-
    228 #endif
    \n-
    \n-\n-
    230 : container_(construct_container<container_type>(other.size()))
    \n-
    231 , mapping_(other.mapping())
    \n-
    232 {
    \n-
    233 init_from_mdspan(other);
    \n-
    234 }
    \n-
    \n-
    235
    \n-
    236
    \n-
    237 // ----------------------------
    \n-
    238 // constructors with allocators
    \n-
    239
    \n-
    241 template <class Alloc,
    \n-
    242 std::enable_if_t<std::is_constructible_v<container_type, std::size_t, Alloc>, int> = 0>
    \n-
    \n-
    243 constexpr mdarray (const extents_type& e, const Alloc& a)
    \n-
    244 : mdarray(mapping_type(e), a)
    \n-
    245 {}
    \n-
    \n-
    246
    \n-
    248 template <class Alloc,
    \n-
    249 std::enable_if_t<std::is_constructible_v<container_type, std::size_t, Alloc>, int> = 0>
    \n-
    \n-
    250 constexpr mdarray (const mapping_type& m, const Alloc& a)
    \n-
    251 : container_(m.required_span_size(), a)
    \n-
    252 , mapping_(m)
    \n-
    253 {}
    \n-
    \n-
    254
    \n-
    256 template <class Alloc>
    \n-
    \n-
    257 constexpr mdarray (const extents_type& e, const value_type& v, const Alloc& a)
    \n-
    258 : mdarray(mapping_type(e), v, a)
    \n-
    259 {}
    \n-
    \n-
    260
    \n-
    262 template <class Alloc,
    \n-
    263 std::enable_if_t<std::is_constructible_v<container_type, std::size_t, value_type, Alloc>, int> = 0>
    \n-
    \n-
    264 constexpr mdarray (const mapping_type& m, const value_type& v, const Alloc& a)
    \n-
    265 : container_(m.required_span_size(), v, a)
    \n-
    266 , mapping_(m)
    \n-
    267 {}
    \n-
    \n-
    268
    \n-
    270 template <class Alloc,
    \n-
    271 std::enable_if_t<std::is_constructible_v<container_type, container_type, Alloc>, int> = 0>
    \n-
    \n-
    272 constexpr mdarray (const extents_type& e, const container_type& c, const Alloc& a)
    \n-
    273 : container_(c, a)
    \n-
    274 , mapping_(e)
    \n-
    275 {}
    \n-
    \n-
    276
    \n-
    278 template <class Alloc,
    \n-
    279 std::enable_if_t<std::is_constructible_v<container_type, container_type, Alloc>, int> = 0>
    \n-
    \n-
    280 constexpr mdarray (const extents_type& e, container_type&& c, const Alloc& a)
    \n-
    281 : container_(std::move(c), a)
    \n-
    282 , mapping_(e)
    \n-
    283 {}
    \n-
    \n-
    284
    \n-
    286 template <class Alloc,
    \n-
    287 std::enable_if_t<std::is_constructible_v<container_type, container_type, Alloc>, int> = 0>
    \n-
    \n-
    288 constexpr mdarray (const mapping_type& m, const container_type& c, const Alloc& a)
    \n-
    289 : container_(c, a)
    \n-
    290 , mapping_(m)
    \n-
    291 {}
    \n-
    \n-
    292
    \n-
    294 template <class Alloc,
    \n-
    295 std::enable_if_t<std::is_constructible_v<container_type, container_type, Alloc>, int> = 0>
    \n-
    \n-
    296 constexpr mdarray (const mapping_type& m, container_type&& c, const Alloc& a)
    \n-
    297 : container_(std::move(c), a)
    \n-
    298 , mapping_(m)
    \n-
    299 {}
    \n-
    \n-
    300
    \n-
    302 template <class V, class E, class L, class C, class Alloc,
    \n-
    303 std::enable_if_t<std::is_constructible_v<container_type, C, Alloc>, int> = 0>
    \n-
    304 #if __cpp_conditional_explicit >= 201806L
    \n-
    305 explicit(
    \n-
    306 !std::is_convertible_v<const typename L::template mapping<E>&, mapping_type> ||
    \n-
    307 !std::is_convertible_v<const C&, container_type>)
    \n-
    308 #endif
    \n-
    \n-
    309 constexpr mdarray (const mdarray<V,E,L,C>& other, const Alloc& a) noexcept
    \n-
    310 : container_(other.container_, a)
    \n-
    311 , mapping_(other.mapping_)
    \n-
    312 {}
    \n-
    \n-
    313
    \n-
    315 template <class V, class E, class L, class A, class Alloc,
    \n-
    316 class C = container_type,
    \n-
    317 class Al = typename C::allocator_type,
    \n-
    318 std::enable_if_t<std::is_constructible_v<C, std::size_t, Alloc>, int> = 0>
    \n-
    319 #if __cpp_conditional_explicit >= 201806L
    \n-
    320 explicit(
    \n-
    321 !std::is_convertible_v<const typename L::template mapping<E>&, mapping_type> ||
    \n-
    322 !std::is_convertible_v<typename A::reference, value_type> ||
    \n-
    323 !std::is_convertible_v<Alloc, Al>)
    \n-
    324 #endif
    \n-
    \n-
    325 constexpr mdarray (const mdspan<V,E,L,A>& other, const Alloc& a)
    \n-
    326 : container_(other.size(), a)
    \n-
    327 , mapping_(other.mapping_)
    \n-
    328 {
    \n-
    329 init_from_mdspan(other);
    \n-
    330 }
    \n-
    \n-
    331
    \n-
    333
    \n-
    334private:
    \n-
    335
    \n-
    336 template <class V, class E, class L, class A, class... Indices>
    \n-
    337 void init_from_mdspan (const mdspan<V,E,L,A>& other, Indices... ii)
    \n-
    338 {
    \n-
    339 constexpr rank_type pos = sizeof...(Indices);
    \n-
    340 if constexpr(pos < rank()) {
    \n-
    341 for (typename E::index_type i = 0; i < other.extent(pos); ++i)
    \n-
    342 init_from_mdspan(other,ii...,i);
    \n-
    343 } else {
    \n-
    344 using I = std::array<typename E::index_type,E::rank()>;
    \n-
    345 container_[mapping_(index_type(ii)...)] = other[I{ii...}];
    \n-
    346 }
    \n-
    347 }
    \n-
    348
    \n-
    349public:
    \n-
    350
    \n-
    353
    \n-
    360 template <class... Indices,
    \n-
    361 std::enable_if_t<(sizeof...(Indices) == extents_type::rank()), int> = 0,
    \n-
    362 std::enable_if_t<(... && std::is_convertible_v<Indices,index_type>), int> = 0>
    \n-
    \n-
    363 constexpr reference operator() (Indices... indices)
    \n-
    364 {
    \n-
    365 return container_[mapping_(index_type(std::move(indices))...)];
    \n-
    366 }
    \n-
    \n-
    367
    \n-
    372 template <class... Indices,
    \n-
    373 std::enable_if_t<(sizeof...(Indices) == extents_type::rank()), int> = 0,
    \n-
    374 std::enable_if_t<(... && std::is_convertible_v<Indices,index_type>), int> = 0>
    \n-
    \n-
    375 constexpr const_reference operator() (Indices... indices) const
    \n-
    376 {
    \n-
    377 return container_[mapping_(index_type(std::move(indices))...)];
    \n-
    378 }
    \n-
    \n-
    379
    \n-
    380
    \n-
    381#if __cpp_multidimensional_subscript >= 202110L
    \n-
    382
    \n-
    384 template <class... Indices,
    \n-
    385 std::enable_if_t<(sizeof...(Indices) == extents_type::rank()), int> = 0,
    \n-
    386 std::enable_if_t<(... && std::is_convertible_v<Indices,index_type>), int> = 0>
    \n-
    387 constexpr reference operator[] (Indices... indices)
    \n-
    388 {
    \n-
    389 return container_[mapping_(index_type(std::move(indices))...)];
    \n-
    390 }
    \n-
    391
    \n-
    393 template <class... Indices,
    \n-
    394 std::enable_if_t<(sizeof...(Indices) == extents_type::rank()), int> = 0,
    \n-
    395 std::enable_if_t<(... && std::is_convertible_v<Indices,index_type>), int> = 0>
    \n-
    396 constexpr const_reference operator[] (Indices... indices) const
    \n-
    397 {
    \n-
    398 return container_[mapping_(index_type(std::move(indices))...)];
    \n-
    399 }
    \n-
    400
    \n-
    401#else
    \n-
    402
    \n-
    405 template <class Index, class E = extents_type,
    \n-
    406 std::enable_if_t<std::is_convertible_v<Index,index_type>, int> = 0,
    \n-
    407 std::enable_if_t<(E::rank() == 1), int> = 0>
    \n-
    \n-
    408 constexpr reference operator[] (Index index)
    \n-
    409 {
    \n-
    410 return container_[mapping_(index_type(std::move(index)))];
    \n-
    411 }
    \n-
    \n-
    412
    \n-
    415 template <class Index, class E = extents_type,
    \n-
    416 std::enable_if_t<std::is_convertible_v<Index,index_type>, int> = 0,
    \n-
    417 std::enable_if_t<(E::rank() == 1), int> = 0>
    \n-
    \n-
    418 constexpr const_reference operator[] (Index index) const
    \n-
    419 {
    \n-
    420 return container_[mapping_(index_type(std::move(index)))];
    \n-
    421 }
    \n-
    \n-
    422
    \n-
    423#endif
    \n-
    424
    \n-
    425
    \n-
    427 template <class Index,
    \n-
    428 std::enable_if_t<std::is_convertible_v<const Index&, index_type>, int> = 0>
    \n-
    \n-
    429 constexpr reference operator[] (Std::span<Index,extents_type::rank()> indices)
    \n-
    430 {
    \n-
    431 return unpackIntegerSequence([&](auto... ii) -> reference {
    \n-
    432 return container_[mapping_(index_type(indices[ii])...)]; },
    \n-
    433 std::make_index_sequence<extents_type::rank()>{});
    \n-
    434 }
    \n-
    \n-
    435
    \n-
    437 template <class Index,
    \n-
    438 std::enable_if_t<std::is_convertible_v<const Index&, index_type>, int> = 0>
    \n-
    \n-
    439 constexpr const_reference operator[] (Std::span<Index,extents_type::rank()> indices) const
    \n-
    440 {
    \n-
    441 return unpackIntegerSequence([&](auto... ii) -> const_reference {
    \n-
    442 return container_[mapping_(index_type(indices[ii])...)]; },
    \n-
    443 std::make_index_sequence<extents_type::rank()>{});
    \n-
    444 }
    \n-
    \n-
    445
    \n-
    447 template <class Index,
    \n-
    448 std::enable_if_t<std::is_convertible_v<const Index&, index_type>, int> = 0>
    \n-
    \n-
    449 constexpr reference operator[] (const std::array<Index,extents_type::rank()>& indices)
    \n-
    450 {
    \n-
    451 return std::apply([&](auto... ii) -> reference {
    \n-
    452 return container_[mapping_(index_type(ii)...)]; }, indices);
    \n-
    453 }
    \n-
    \n-
    454
    \n-
    456 template <class Index,
    \n-
    457 std::enable_if_t<std::is_convertible_v<const Index&, index_type>, int> = 0>
    \n-
    \n-
    458 constexpr const_reference operator[] (const std::array<Index,extents_type::rank()>& indices) const
    \n-
    459 {
    \n-
    460 return std::apply([&](auto... ii) -> const_reference {
    \n-
    461 return container_[mapping_(index_type(ii)...)]; }, indices);
    \n-
    462 }
    \n-
    \n-
    463
    \n-
    465
    \n-
    466
    \n-
    468 constexpr const extents_type& extents () const noexcept { return mapping_.extents(); }
    \n-
    469
    \n-
    471 constexpr const mapping_type& mapping () const noexcept { return mapping_; }
    \n-
    472
    \n-
    474 constexpr const container_type& container () const noexcept { return container_; }
    \n-
    475
    \n-
    482 constexpr container_type&& extract_container () && noexcept { return std::move(container_); }
    \n-
    483
    \n-
    484
    \n-
    487
    \n-
    489 static constexpr rank_type rank () noexcept { return extents_type::rank(); }
    \n-
    490
    \n-
    492 static constexpr rank_type rank_dynamic () noexcept { return extents_type::rank_dynamic(); }
    \n-
    493
    \n-
    495 static constexpr std::size_t static_extent (rank_type r) noexcept { return extents_type::static_extent(r); }
    \n-
    496
    \n-
    498 constexpr index_type extent (rank_type r) const noexcept { return extents().extent(r); }
    \n-
    499
    \n-
    \n-
    501 constexpr size_type size () const noexcept
    \n-
    502 {
    \n-
    503 size_type s = 1;
    \n-
    504 for (rank_type r = 0; r < rank(); ++r)
    \n-
    505 s *= extent(r);
    \n-
    506 return s;
    \n-
    507 }
    \n-
    \n-
    508
    \n-
    510 constexpr std::size_t container_size () const { return container_.size(); }
    \n-
    511
    \n-
    513 [[nodiscard]] constexpr bool empty () const noexcept { return size() == 0; }
    \n-
    514
    \n-
    516 constexpr index_type stride (rank_type r) const { return mapping().stride(r); };
    \n-
    517
    \n-
    519
    \n-
    520
    \n-
    521 static constexpr bool is_always_unique () noexcept { return mapping_type::is_always_unique(); }
    \n-
    522 static constexpr bool is_always_exhaustive () noexcept { return mapping_type::is_always_exhaustive(); }
    \n-
    523 static constexpr bool is_always_strided () noexcept { return mapping_type::is_always_strided(); }
    \n-
    524
    \n-
    525 constexpr bool is_unique () const noexcept { return mapping_.is_unique(); }
    \n-
    526 constexpr bool is_exhaustive () const noexcept { return mapping_.is_exhaustive(); }
    \n-
    527 constexpr bool is_strided () const noexcept { return mapping_.is_strided(); }
    \n-
    528
    \n-
    529
    \n-
    532
    \n-
    534 constexpr pointer container_data () noexcept { return Std::to_address(container_.begin()); }
    \n-
    535
    \n-
    537 constexpr const_pointer container_data () const noexcept { return Std::to_address(container_.begin()); }
    \n-
    538
    \n-
    540
    \n-
    541
    \n-
    \n-
    542 friend constexpr void swap (mdarray& x, mdarray& y) noexcept
    \n-
    543 {
    \n-
    544 using std::swap;
    \n-
    545 swap(x.container_, y.container_);
    \n-
    546 swap(x.mapping_, y.mapping_);
    \n-
    547 }
    \n-
    \n-
    548
    \n-
    549
    \n-
    552
    \n-
    \n-
    553 friend constexpr bool operator== (const mdarray& lhs, const mdarray& rhs) noexcept
    \n-
    554 {
    \n-
    555 return lhs.mapping() == rhs.mapping() && lhs.container() == rhs.container();
    \n-
    556 }
    \n-
    \n-
    557
    \n-
    559
    \n-
    562
    \n-
    564 template <class V, class E, class L, class A,
    \n-
    565 std::enable_if_t<std::is_assignable_v<mdspan<V,E,L,A>, mdspan_type>, int> = 0>
    \n-
    \n-
    566 constexpr operator mdspan<V,E,L,A> ()
    \n-
    567 {
    \n-\n-
    569 }
    \n-
    \n-
    570
    \n-
    572 template <class V, class E, class L, class A,
    \n-
    573 std::enable_if_t<std::is_assignable_v<mdspan<V,E,L,A>, const_mdspan_type>, int> = 0>
    \n-
    \n-
    574 constexpr operator mdspan<V,E,L,A> () const
    \n-
    575 {
    \n-\n-
    577 }
    \n-
    \n-
    578
    \n-
    580 template <class AccessorPolicy = Std::default_accessor<element_type>,
    \n-
    581 std::enable_if_t<
    \n-
    582 std::is_assignable_v<mdspan_type, mdspan<element_type,extents_type,layout_type,AccessorPolicy>>, int> = 0>
    \n-\n-
    \n-
    584 to_mdspan (const AccessorPolicy& a = AccessorPolicy{})
    \n-
    585 {
    \n-\n-
    587 }
    \n-
    \n-
    588
    \n-
    590 template <class AccessorPolicy = Std::default_accessor<const element_type>,
    \n-
    591 std::enable_if_t<
    \n-
    592 std::is_assignable_v<const_mdspan_type, mdspan<const element_type,extents_type,layout_type,AccessorPolicy>>, int> = 0>
    \n-
    593 constexpr mdspan<const element_type,extents_type,layout_type,AccessorPolicy>
    \n-
    \n-
    594 to_mdspan (const AccessorPolicy& a = AccessorPolicy{}) const
    \n-
    595 {
    \n-\n-
    597 }
    \n-
    \n-
    598
    \n-
    599protected:
    \n-\n-
    601 [[no_unique_address]] mapping_type mapping_;
    \n-
    602};
    \n-
    \n-
    603
    \n-
    607
    \n-
    608template <class IndexType, std::size_t... exts, class Container>
    \n-
    609mdarray (const Std::extents<IndexType, exts...>&, const Container&)
    \n-
    610 -> mdarray<typename Container::value_type, Std::extents<IndexType, exts...>, layout_right, Container>;
    \n-
    611
    \n-
    612template <class Mapping, class Container>
    \n-
    613mdarray (const Mapping&, const Container&)
    \n-\n-
    615
    \n-
    616template <class IndexType, std::size_t... exts, class Container>
    \n-
    617mdarray (const Std::extents<IndexType, exts...>&, Container&&)
    \n-
    618 -> mdarray<typename Container::value_type, Std::extents<IndexType, exts...>, layout_right, Container>;
    \n-
    619
    \n-
    620template <class Mapping, class Container>
    \n-
    621mdarray (const Mapping&, Container&&)
    \n-\n-
    623
    \n-
    624template <class Element, class Extents, class Layout, class Accessor>
    \n-\n-
    626 -> mdarray<std::remove_cv_t<Element>, Extents, Layout>;
    \n-
    627
    \n-
    628template <class IndexType, std::size_t... exts, class Container, class Alloc>
    \n-
    629mdarray (const Std::extents<IndexType, exts...>&, const Container&, const Alloc&)
    \n-
    630 -> mdarray<typename Container::value_type, Std::extents<IndexType, exts...>, layout_right, Container>;
    \n-
    631
    \n-
    632template <class Mapping, class Container, class Alloc>
    \n-
    633mdarray (const Mapping&, const Container&, const Alloc&)
    \n-\n-
    635
    \n-
    636template <class IndexType, std::size_t... exts, class Container, class Alloc>
    \n-
    637mdarray (const Std::extents<IndexType, exts...>&, Container&&, const Alloc&)
    \n-
    638 -> mdarray<typename Container::value_type, Std::extents<IndexType, exts...>, layout_right, Container>;
    \n-
    639
    \n-
    640template <class Mapping, class Container, class Alloc>
    \n-
    641mdarray (const Mapping&, Container&&, const Alloc&)
    \n-\n-
    643
    \n-
    644template <class Element, class Extents, class Layout, class Accessor, class Alloc>
    \n-\n-
    646 -> mdarray<std::remove_cv_t<Element>, Extents, Layout>;
    \n-
    647
    \n-
    649
    \n-
    653
    \n-
    654template <class Element, class Extents, class Layout, class Container>
    \n-\n-
    656 typename decltype(std::declval<mdarray<Element, Extents, Layout, Container>>().to_mdspan())::element_type,
    \n-
    657 typename decltype(std::declval<mdarray<Element, Extents, Layout, Container>>().to_mdspan())::extents_type,
    \n-
    658 typename decltype(std::declval<mdarray<Element, Extents, Layout, Container>>().to_mdspan())::layout_type,
    \n-
    659 typename decltype(std::declval<mdarray<Element, Extents, Layout, Container>>().to_mdspan())::accessor_type>;
    \n-
    660
    \n-
    662
    \n-
    663} // end namespace Dune::Std
    \n-
    664
    \n-
    665#endif // DUNE_COMMON_STD_MDARRAY_HH
    \n-\n-\n-\n-\n-\n-
    Utilities for reduction like operations on ranges.
    \n-\n-
    decltype(auto) constexpr unpackIntegerSequence(F &&f, std::integer_sequence< I, i... > sequence)
    Unpack an std::integer_sequence<I,i...> to std::integral_constant<I,i>...
    Definition indices.hh:124
    \n-
    STL namespace.
    \n-
    Namespace for features backported from new C++ standards.
    Definition default_accessor.hh:10
    \n-
    constexpr auto to_address(T &&p) noexcept
    Obtain the address represented by p without forming a reference to the object pointed to by p.
    Definition memory.hh:47
    \n-
    Get the 'const' version of a reference to a mutable object.
    Definition genericiterator.hh:87
    \n-
    Multidimensional index space with dynamic and static extents.
    Definition extents.hh:54
    \n-
    A layout where the rightmost extent has stride 1, and strides increase right-to-left as the product o...
    Definition fwd_layouts.hh:30
    \n-
    An owning multi-dimensional array analog of mdspan.
    Definition mdarray.hh:69
    \n-
    mdspan< const element_type, extents_type, layout_type > const_mdspan_type
    Definition mdarray.hh:91
    \n-
    constexpr mdarray(const mapping_type &m, const container_type &c, const Alloc &a)
    Construct from layout mapping, container and allocator.
    Definition mdarray.hh:288
    \n-
    typename container_type::const_reference const_reference
    Definition mdarray.hh:96
    \n-
    constexpr mdarray(const mapping_type &m, container_type &&c)
    Construct from layout mapping and the storage container.
    Definition mdarray.hh:194
    \n-
    Container container_type
    Definition mdarray.hh:81
    \n-
    Extents extents_type
    Definition mdarray.hh:79
    \n-
    constexpr mdarray(const E &e, const container_type &c)
    Construct from extents and the storage container.
    Definition mdarray.hh:174
    \n-
    static constexpr bool is_always_exhaustive() noexcept
    Definition mdarray.hh:522
    \n-
    constexpr mdspan< const element_type, extents_type, layout_type, AccessorPolicy > to_mdspan(const AccessorPolicy &a=AccessorPolicy{}) const
    Conversion function to mdspan.
    Definition mdarray.hh:594
    \n-
    constexpr index_type stride(rank_type r) const
    The stride along the specified dimension.
    Definition mdarray.hh:516
    \n-
    constexpr bool is_unique() const noexcept
    Definition mdarray.hh:525
    \n-
    constexpr index_type extent(rank_type r) const noexcept
    Number of elements in the r'th dimension of the tensor.
    Definition mdarray.hh:498
    \n-
    constexpr mdarray(const extents_type &e, const Alloc &a)
    Construct from the extents of the array and allocator.
    Definition mdarray.hh:243
    \n-
    static constexpr std::size_t static_extent(rank_type r) noexcept
    Number of elements in the r'th dimension of the tensor.
    Definition mdarray.hh:495
    \n-
    mapping_type mapping_
    Definition mdarray.hh:601
    \n-
    constexpr mdarray(const mdspan< OtherElementType, OtherExtents, OtherLayoutPolicy, Accessor > &other)
    Converting constructor from mdspan.
    Definition mdarray.hh:229
    \n-
    typename layout_type::template mapping< extents_type > mapping_type
    Definition mdarray.hh:84
    \n-
    constexpr const_pointer container_data() const noexcept
    Direct access to the underlying const data in the container.
    Definition mdarray.hh:537
    \n-
    constexpr mdarray(const extents_type &e, const value_type &v)
    Construct from extents and initial value.
    Definition mdarray.hh:155
    \n-
    constexpr mdarray(const mapping_type &m, const Alloc &a)
    Construct from the layout mapping of the array and allocator.
    Definition mdarray.hh:250
    \n-
    constexpr pointer container_data() noexcept
    Direct access to the underlying data in the container.
    Definition mdarray.hh:534
    \n-
    constexpr bool is_exhaustive() const noexcept
    Definition mdarray.hh:526
    \n-
    decltype(Std::to_address(std::declval< container_type >().begin())) pointer
    Definition mdarray.hh:93
    \n-
    constexpr reference operator[](Index index)
    Access specified element at position [i0] For a rank one mdarray, the operator[i] is added to support...
    Definition mdarray.hh:408
    \n-
    constexpr const extents_type & extents() const noexcept
    Number of elements in all dimensions of the array,.
    Definition mdarray.hh:468
    \n-
    constexpr bool is_strided() const noexcept
    Definition mdarray.hh:527
    \n-
    constexpr mdarray(const mapping_type &m, const container_type &c)
    Construct from layout mapping and the storage container.
    Definition mdarray.hh:188
    \n-
    static constexpr bool is_always_unique() noexcept
    Definition mdarray.hh:521
    \n-
    constexpr mdarray(const mapping_type &m, container_type &&c, const Alloc &a)
    Construct from layout mapping, container and allocator.
    Definition mdarray.hh:296
    \n-
    constexpr mdarray(const E &e, container_type &&c)
    Construct from extents and the storage container.
    Definition mdarray.hh:182
    \n-
    constexpr const container_type & container() const noexcept
    The underlying storage container.
    Definition mdarray.hh:474
    \n-
    constexpr std::size_t container_size() const
    Size of the underlying container.
    Definition mdarray.hh:510
    \n-
    typename extents_type::size_type size_type
    Definition mdarray.hh:87
    \n-
    static constexpr rank_type rank() noexcept
    Number of dimensions of the array.
    Definition mdarray.hh:489
    \n-
    constexpr bool empty() const noexcept
    Check whether the index space is empty.
    Definition mdarray.hh:513
    \n-
    constexpr mdarray(const extents_type &e, container_type &&c, const Alloc &a)
    Construct from extents, container and allocator.
    Definition mdarray.hh:280
    \n-
    mdspan< element_type, extents_type, layout_type > mdspan_type
    Definition mdarray.hh:90
    \n-
    constexpr size_type size() const noexcept
    Size of the multi-dimensional index space.
    Definition mdarray.hh:501
    \n-
    friend constexpr bool operator==(const mdarray &lhs, const mdarray &rhs) noexcept
    Definition mdarray.hh:553
    \n-
    friend constexpr void swap(mdarray &x, mdarray &y) noexcept
    Definition mdarray.hh:542
    \n-
    constexpr const mapping_type & mapping() const noexcept
    Index mapping of a layout policy.
    Definition mdarray.hh:471
    \n-
    Element element_type
    Definition mdarray.hh:78
    \n-
    constexpr mdarray(const mapping_type &m, const value_type &v, const Alloc &a)
    Construct from layout mapping, initial value and allocator.
    Definition mdarray.hh:264
    \n-
    constexpr mdarray(const extents_type &e, const value_type &v, const Alloc &a)
    Construct from extents, initial value and allocator.
    Definition mdarray.hh:257
    \n-
    decltype(Std::to_address(std::declval< container_type >().cbegin())) const_pointer
    Definition mdarray.hh:95
    \n-
    typename container_type::reference reference
    Definition mdarray.hh:94
    \n-
    constexpr mdspan< element_type, extents_type, layout_type, AccessorPolicy > to_mdspan(const AccessorPolicy &a=AccessorPolicy{})
    Conversion function to mdspan.
    Definition mdarray.hh:584
    \n-
    element_type value_type
    Definition mdarray.hh:83
    \n-
    LayoutPolicy layout_type
    Definition mdarray.hh:80
    \n-
    constexpr container_type && extract_container() &&noexcept
    Move the container out of the mdarray.
    Definition mdarray.hh:482
    \n-
    constexpr mdarray(const extents_type &e, const container_type &c, const Alloc &a)
    Construct from extents, container and allocator.
    Definition mdarray.hh:272
    \n-
    typename extents_type::rank_type rank_type
    Definition mdarray.hh:88
    \n-
    static constexpr rank_type rank_dynamic() noexcept
    Number of dimension with dynamic size.
    Definition mdarray.hh:492
    \n-
    constexpr reference operator()(Indices... indices)
    Access element at position (i0,i1,...)
    Definition mdarray.hh:363
    \n-
    constexpr mdarray(const extents_type &e)
    Construct from the extents of the array.
    Definition mdarray.hh:138
    \n-
    container_type container_
    Definition mdarray.hh:600
    \n-
    typename extents_type::index_type index_type
    Definition mdarray.hh:86
    \n-
    constexpr mdarray(IndexTypes... exts)
    Construct from the dynamic extents.
    Definition mdarray.hh:133
    \n-
    static constexpr bool is_always_strided() noexcept
    Definition mdarray.hh:523
    \n-
    A multi-dimensional non-owning array view.
    Definition mdspan.hh:64
    \n-
    constexpr index_type extent(rank_type r) const noexcept
    Number of elements in the r'th dimension of the tensor.
    Definition mdspan.hh:275
    \n-
    constexpr size_type size() const noexcept
    The number of elements accessible by this multi-dimensional span.
    Definition mdspan.hh:278
    \n-
    A contiguous sequence of elements with static or dynamic extent.
    Definition span.hh:126
    \n+\n+
    103
    \n+\n+
    109
    \n+\n+
    118
    \n+
    123 static const DebugLevel INFO_DEBUG_LEVEL = 3;
    \n+
    124
    \n+\n+
    130
    \n+\n+
    142
    \n+
    147 static const DebugLevel WARN_DEBUG_LEVEL = 4;
    \n+
    148
    \n+\n+
    154
    \n+\n+
    163
    \n+\n+
    169
    \n+\n+
    172
    \n+\n+
    181
    \n+\n+
    184
    \n+\n+
    197
    \n+
    199}
    \n+
    200
    \n+
    201#endif
    \n+
    Defines several output streams for messages of different importance.
    \n+
    unsigned int DebugLevel
    Type for debug levels.
    Definition debugstream.hh:118
    \n+
    DebugStream< VERY_VERBOSE_DEBUG_LEVEL, MINIMAL_DEBUG_LEVEL > DVVerbType
    Type of very verbose debug stream.
    Definition stdstreams.hh:82
    \n+
    DebugStream< WARN_DEBUG_LEVEL, MINIMAL_DEBUG_LEVEL > DWarnType
    Type of debug stream with warn level.
    Definition stdstreams.hh:153
    \n+
    DVVerbType dvverb(std::cout)
    stream for very verbose output.
    Definition stdstreams.hh:96
    \n+
    static const DebugLevel MINIMAL_DEBUG_LEVEL
    Definition stdstreams.hh:70
    \n+
    #define DUNE_MINIMAL_DEBUG_LEVEL
    The default minimum debug level.
    Definition stdstreams.hh:68
    \n+
    static const DebugLevel VERY_VERBOSE_DEBUG_LEVEL
    The level of the very verbose debug stream.
    Definition stdstreams.hh:76
    \n+
    DWarnType dwarn(std::cerr)
    Stream for warnings indicating problems.
    Definition stdstreams.hh:162
    \n+
    static const DebugLevel GRAVE_DEBUG_LEVEL
    The level of the debug stream for fatal errors.
    Definition stdstreams.hh:168
    \n+
    DebugStream< VERBOSE_DEBUG_LEVEL, MINIMAL_DEBUG_LEVEL > DVerbType
    Type of more verbose debug stream.
    Definition stdstreams.hh:108
    \n+
    DebugStream< GRAVE_DEBUG_LEVEL, MINIMAL_DEBUG_LEVEL > DGraveType
    Type of debug stream for fatal errors.
    Definition stdstreams.hh:171
    \n+
    DGraveType dgrave(std::cerr)
    Stream for warnings indicating fatal errors.
    Definition stdstreams.hh:180
    \n+
    DebugStream< 1 > DErrType
    The type of the stream used for error messages.
    Definition stdstreams.hh:183
    \n+
    static const DebugLevel INFO_DEBUG_LEVEL
    The level of the informative debug stream.
    Definition stdstreams.hh:123
    \n+
    DebugStream< INFO_DEBUG_LEVEL, MINIMAL_DEBUG_LEVEL > DInfoType
    Type of debug stream with info level.
    Definition stdstreams.hh:129
    \n+
    DInfoType dinfo(std::cout)
    Stream for informative output.
    Definition stdstreams.hh:141
    \n+
    DVerbType dverb(std::cout)
    Singleton of verbose debug stream.
    Definition stdstreams.hh:117
    \n+
    static const DebugLevel VERBOSE_DEBUG_LEVEL
    The level of the verbose debug stream.
    Definition stdstreams.hh:102
    \n+
    DErrType derr(std::cerr)
    Stream for error messages.
    Definition stdstreams.hh:196
    \n+
    static const DebugLevel WARN_DEBUG_LEVEL
    The level of the debug stream for warnings.
    Definition stdstreams.hh:147
    \n+
    Dune namespace.
    Definition alignedallocator.hh:13
    \n+
    Generic class to implement debug output streams.
    Definition debugstream.hh:192
    \n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,909 +1,154 @@\n dune-common\u00a02.10\n Loading...\n Searching...\n No Matches\n * _\bd_\bu_\bn_\be\n * _\bc_\bo_\bm_\bm_\bo_\bn\n- * _\bs_\bt_\bd\n-mdarray.hh\n+stdstreams.hh\n _\bG_\bo_\b _\bt_\bo_\b _\bt_\bh_\be_\b _\bd_\bo_\bc_\bu_\bm_\be_\bn_\bt_\ba_\bt_\bi_\bo_\bn_\b _\bo_\bf_\b _\bt_\bh_\bi_\bs_\b _\bf_\bi_\bl_\be_\b.\n 1// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-\n 2// vi: set et ts=4 sw=2 sts=2:\n 3// SPDX-FileCopyrightInfo: Copyright \u00c2\u00a9 DUNE Project contributors, see file\n LICENSE.md in module root\n 4// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception\n-5#ifndef DUNE_COMMON_STD_MDARRAY_HH\n-6#define DUNE_COMMON_STD_MDARRAY_HH\n-7\n-8#include \n-9#include \n-10#include \n-11#include \n-12#include \n-13#include \n-14#if __has_include()\n-15 #include \n-16#endif\n+5\n+15#ifndef DUNE_COMMON_STDSTREAMS_HH\n+16#define DUNE_COMMON_STDSTREAMS_HH\n 17\n-18#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bi_\bn_\bd_\bi_\bc_\be_\bs_\b._\bh_\bh>\n-19#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\br_\ba_\bn_\bg_\be_\bu_\bt_\bi_\bl_\bi_\bt_\bi_\be_\bs_\b._\bh_\bh>\n-20#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bs_\bt_\bd_\b/_\bd_\be_\bf_\ba_\bu_\bl_\bt_\b__\ba_\bc_\bc_\be_\bs_\bs_\bo_\br_\b._\bh_\bh>\n-21#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bs_\bt_\bd_\b/_\bm_\bd_\bs_\bp_\ba_\bn_\b._\bh_\bh>\n-22#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bs_\bt_\bd_\b/_\bm_\be_\bm_\bo_\br_\by_\b._\bh_\bh>\n-23#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bs_\bt_\bd_\b/_\bs_\bp_\ba_\bn_\b._\bh_\bh>\n-24#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bs_\bt_\bd_\b/_\bi_\bm_\bp_\bl_\b/_\bc_\bo_\bn_\bt_\ba_\bi_\bn_\be_\br_\bc_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bi_\bo_\bn_\bt_\br_\ba_\bi_\bt_\bs_\b._\bh_\bh>\n-25\n-26namespace _\bD_\bu_\bn_\be_\b:_\b:_\bS_\bt_\bd {\n-27\n-66template >\n-_\b6_\b8class _\bm_\bd_\ba_\br_\br_\ba_\by\n-69{\n-_\b7_\b0 template friend class _\bm_\bd_\ba_\br_\br_\ba_\by;\n+18#include // DUNE_MINIMAL_DEBUG_LEVEL\n+19#include \"_\bd_\be_\bb_\bu_\bg_\bs_\bt_\br_\be_\ba_\bm_\b._\bh_\bh\"\n+20\n+21namespace _\bD_\bu_\bn_\be {\n+22\n+67#ifndef DUNE_MINIMAL_DEBUG_LEVEL\n+_\b6_\b8#define DUNE_MINIMAL_DEBUG_LEVEL 4\n+69#endif\n+_\b7_\b0 static const _\bD_\be_\bb_\bu_\bg_\bL_\be_\bv_\be_\bl _\bM_\bI_\bN_\bI_\bM_\bA_\bL_\b__\bD_\bE_\bB_\bU_\bG_\b__\bL_\bE_\bV_\bE_\bL = _\bD_\bU_\bN_\bE_\b__\bM_\bI_\bN_\bI_\bM_\bA_\bL_\b__\bD_\bE_\bB_\bU_\bG_\b__\bL_\bE_\bV_\bE_\bL;\n 71\n-72 static_assert(std::is_object_v);\n-73 static_assert(!std::is_abstract_v);\n-74 static_assert(!std::is_array_v);\n-75 static_assert(std::is_same_v);\n-76\n-77public:\n-_\b7_\b8 using _\be_\bl_\be_\bm_\be_\bn_\bt_\b__\bt_\by_\bp_\be = Element;\n-_\b7_\b9 using _\be_\bx_\bt_\be_\bn_\bt_\bs_\b__\bt_\by_\bp_\be = Extents;\n-_\b8_\b0 using _\bl_\ba_\by_\bo_\bu_\bt_\b__\bt_\by_\bp_\be = LayoutPolicy;\n-_\b8_\b1 using _\bc_\bo_\bn_\bt_\ba_\bi_\bn_\be_\br_\b__\bt_\by_\bp_\be = Container;\n-82\n-_\b8_\b3 using _\bv_\ba_\bl_\bu_\be_\b__\bt_\by_\bp_\be = _\be_\bl_\be_\bm_\be_\bn_\bt_\b__\bt_\by_\bp_\be;\n-_\b8_\b4 using _\bm_\ba_\bp_\bp_\bi_\bn_\bg_\b__\bt_\by_\bp_\be = typename layout_type::template mapping;\n-85\n-_\b8_\b6 using _\bi_\bn_\bd_\be_\bx_\b__\bt_\by_\bp_\be = typename extents_type::index_type;\n-_\b8_\b7 using _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be = typename extents_type::size_type;\n-_\b8_\b8 using _\br_\ba_\bn_\bk_\b__\bt_\by_\bp_\be = typename extents_type::rank_type;\n-89\n-_\b9_\b0 using _\bm_\bd_\bs_\bp_\ba_\bn_\b__\bt_\by_\bp_\be = _\bm_\bd_\bs_\bp_\ba_\bn_\b<_\be_\bl_\be_\bm_\be_\bn_\bt_\b__\bt_\by_\bp_\be_\b,_\be_\bx_\bt_\be_\bn_\bt_\bs_\b__\bt_\by_\bp_\be_\b,_\bl_\ba_\by_\bo_\bu_\bt_\b__\bt_\by_\bp_\be_\b>;\n-_\b9_\b1 using _\bc_\bo_\bn_\bs_\bt_\b__\bm_\bd_\bs_\bp_\ba_\bn_\b__\bt_\by_\bp_\be = _\bm_\bd_\bs_\bp_\ba_\bn_\b<_\bc_\bo_\bn_\bs_\bt\n-_\be_\bl_\be_\bm_\be_\bn_\bt_\b__\bt_\by_\bp_\be_\b,_\be_\bx_\bt_\be_\bn_\bt_\bs_\b__\bt_\by_\bp_\be_\b,_\bl_\ba_\by_\bo_\bu_\bt_\b__\bt_\by_\bp_\be_\b>;\n-92\n-_\b9_\b3 using _\bp_\bo_\bi_\bn_\bt_\be_\br = decltype(_\bS_\bt_\bd_\b:_\b:_\bt_\bo_\b__\ba_\bd_\bd_\br_\be_\bs_\bs(std::declval\n-().begin()));\n-_\b9_\b4 using _\br_\be_\bf_\be_\br_\be_\bn_\bc_\be = typename container_type::reference;\n-_\b9_\b5 using _\bc_\bo_\bn_\bs_\bt_\b__\bp_\bo_\bi_\bn_\bt_\be_\br = decltype(_\bS_\bt_\bd_\b:_\b:_\bt_\bo_\b__\ba_\bd_\bd_\br_\be_\bs_\bs(std::declval\n-().cbegin()));\n-_\b9_\b6 using _\bc_\bo_\bn_\bs_\bt_\b__\br_\be_\bf_\be_\br_\be_\bn_\bc_\be = typename container_type::const_reference;\n+_\b7_\b6 static const _\bD_\be_\bb_\bu_\bg_\bL_\be_\bv_\be_\bl _\bV_\bE_\bR_\bY_\b__\bV_\bE_\bR_\bB_\bO_\bS_\bE_\b__\bD_\bE_\bB_\bU_\bG_\b__\bL_\bE_\bV_\bE_\bL = 1;\n+77\n+_\b8_\b2 typedef _\bD_\be_\bb_\bu_\bg_\bS_\bt_\br_\be_\ba_\bm_\b<_\bV_\bE_\bR_\bY_\b__\bV_\bE_\bR_\bB_\bO_\bS_\bE_\b__\bD_\bE_\bB_\bU_\bG_\b__\bL_\bE_\bV_\bE_\bL_\b,_\b _\bM_\bI_\bN_\bI_\bM_\bA_\bL_\b__\bD_\bE_\bB_\bU_\bG_\b__\bL_\bE_\bV_\bE_\bL_\b>\n+_\bD_\bV_\bV_\be_\br_\bb_\bT_\by_\bp_\be;\n+83\n+_\b9_\b6 extern _\bD_\bV_\bV_\be_\br_\bb_\bT_\by_\bp_\be _\bd_\bv_\bv_\be_\br_\bb;\n 97\n-98 static_assert(std::is_constructible_v);\n-99\n-100private:\n-101 // helper function to construct the container\n-102 template \n-103 static constexpr auto construct_container (Args&&... args)\n-104 -> decltype(Impl::ContainerConstructionTraits::construct(std::\n-forward(args)...))\n-105 {\n-106 return Impl::ContainerConstructionTraits::construct(std::forward\n-(args)...);\n-107 }\n-108\n-109public:\n-112\n-114 template = 0,\n-116 std::enable_if_t, int> = 0,\n-117 std::enable_if_t, int> = 0>\n-_\b1_\b1_\b8 constexpr _\bm_\bd_\ba_\br_\br_\ba_\by ()\n-119 : _\bc_\bo_\bn_\bt_\ba_\bi_\bn_\be_\br_\b_{}\n-120 , _\bm_\ba_\bp_\bp_\bi_\bn_\bg_\b_{}\n-121 {}\n-122\n-123\n-124 // -------------------------------------\n-125 // constructors from extents or mappings\n-126\n-127\n-129 template ),\n-int> = 0,\n-131 std::enable_if_t, int>\n-= 0,\n-132 std::enable_if_t<(... && std::\n-is_nothrow_constructible_v), int> = 0>\n-_\b1_\b3_\b3 explicit constexpr _\bm_\bd_\ba_\br_\br_\ba_\by (IndexTypes... exts)\n-134 : _\bm_\bd_\ba_\br_\br_\ba_\by(_\be_\bx_\bt_\be_\bn_\bt_\bs_\b__\bt_\by_\bp_\be(_\bi_\bn_\bd_\be_\bx_\b__\bt_\by_\bp_\be(_\bs_\bt_\bd::move(exts))...))\n-135 {}\n-136\n-_\b1_\b3_\b8 explicit constexpr _\bm_\bd_\ba_\br_\br_\ba_\by (const _\be_\bx_\bt_\be_\bn_\bt_\bs_\b__\bt_\by_\bp_\be& e)\n-139 : _\bm_\bd_\ba_\br_\br_\ba_\by(_\bm_\ba_\bp_\bp_\bi_\bn_\bg_\b__\bt_\by_\bp_\be(e))\n-140 {}\n-141\n-143 template (std::declval()), bool{}) =\n-true>\n-_\b1_\b4_\b5 explicit constexpr _\bm_\bd_\ba_\br_\br_\ba_\by (const _\bm_\ba_\bp_\bp_\bi_\bn_\bg_\b__\bt_\by_\bp_\be& m)\n-146 : _\bc_\bo_\bn_\bt_\ba_\bi_\bn_\be_\br_\b_(construct_container(m.required_span_size()))\n-147 , _\bm_\ba_\bp_\bp_\bi_\bn_\bg_\b_(m)\n-148 {}\n-149\n-150\n-151 // ---------------------------------------\n-152 // constructors with a given initial value\n-153\n-_\b1_\b5_\b5 constexpr _\bm_\bd_\ba_\br_\br_\ba_\by (const _\be_\bx_\bt_\be_\bn_\bt_\bs_\b__\bt_\by_\bp_\be& e, const _\bv_\ba_\bl_\bu_\be_\b__\bt_\by_\bp_\be& v)\n-156 : _\bm_\bd_\ba_\br_\br_\ba_\by(_\bm_\ba_\bp_\bp_\bi_\bn_\bg_\b__\bt_\by_\bp_\be(e), v)\n-157 {}\n-158\n-160 template (std::declval(),std::\n-declval()), bool{}) = true>\n-_\b1_\b6_\b2 constexpr _\bm_\bd_\ba_\br_\br_\ba_\by (const _\bm_\ba_\bp_\bp_\bi_\bn_\bg_\b__\bt_\by_\bp_\be& m, const _\bv_\ba_\bl_\bu_\be_\b__\bt_\by_\bp_\be& v)\n-163 : _\bc_\bo_\bn_\bt_\ba_\bi_\bn_\be_\br_\b_(construct_container(m.required_span_size(), v))\n-164 , _\bm_\ba_\bp_\bp_\bi_\bn_\bg_\b_(m)\n-165 {}\n-166\n-167\n-168 // -----------------------------------\n-169 // constructors with a given container\n-170\n-172 template , int> = 0>\n-_\b1_\b7_\b4 constexpr _\bm_\bd_\ba_\br_\br_\ba_\by (const E& e, const _\bc_\bo_\bn_\bt_\ba_\bi_\bn_\be_\br_\b__\bt_\by_\bp_\be& c)\n-175 : _\bc_\bo_\bn_\bt_\ba_\bi_\bn_\be_\br_\b_(c)\n-176 , _\bm_\ba_\bp_\bp_\bi_\bn_\bg_\b_(e)\n-177 {}\n-178\n-180 template , int> = 0>\n-_\b1_\b8_\b2 constexpr _\bm_\bd_\ba_\br_\br_\ba_\by (const E& e, _\bc_\bo_\bn_\bt_\ba_\bi_\bn_\be_\br_\b__\bt_\by_\bp_\be&& c)\n-183 : _\bc_\bo_\bn_\bt_\ba_\bi_\bn_\be_\br_\b_(_\bs_\bt_\bd::move(c))\n-184 , _\bm_\ba_\bp_\bp_\bi_\bn_\bg_\b_(e)\n-185 {}\n-186\n-_\b1_\b8_\b8 constexpr _\bm_\bd_\ba_\br_\br_\ba_\by (const _\bm_\ba_\bp_\bp_\bi_\bn_\bg_\b__\bt_\by_\bp_\be& m, const _\bc_\bo_\bn_\bt_\ba_\bi_\bn_\be_\br_\b__\bt_\by_\bp_\be& c)\n-189 : _\bc_\bo_\bn_\bt_\ba_\bi_\bn_\be_\br_\b_(c)\n-190 , _\bm_\ba_\bp_\bp_\bi_\bn_\bg_\b_(m)\n-191 {}\n-192\n-_\b1_\b9_\b4 constexpr _\bm_\bd_\ba_\br_\br_\ba_\by (const _\bm_\ba_\bp_\bp_\bi_\bn_\bg_\b__\bt_\by_\bp_\be& m, _\bc_\bo_\bn_\bt_\ba_\bi_\bn_\be_\br_\b__\bt_\by_\bp_\be&& c)\n-195 : _\bc_\bo_\bn_\bt_\ba_\bi_\bn_\be_\br_\b_(_\bs_\bt_\bd::move(c))\n-196 , _\bm_\ba_\bp_\bp_\bi_\bn_\bg_\b_(m)\n-197 {}\n-198\n-199\n-200 // -----------------------\n-201 // converting constructors\n-202\n-204 template ,\n-int> = 0,\n-206 std::enable_if_t, int> =\n-0,\n-207 std::enable_if_t&>, int> = 0>\n-208 #if __cpp_conditional_explicit >= 201806L\n-209 explicit(\n-210 !std::is_convertible_v&, _\bm_\ba_\bp_\bp_\bi_\bn_\bg_\b__\bt_\by_\bp_\be> ||\n-211 !std::is_convertible_v)\n-212 #endif\n-_\b2_\b1_\b3 constexpr _\bm_\bd_\ba_\br_\br_\ba_\by (const\n-_\bm_\bd_\ba_\br_\br_\ba_\by_\b<_\bO_\bt_\bh_\be_\br_\bE_\bl_\be_\bm_\be_\bn_\bt_\bT_\by_\bp_\be_\b,_\bO_\bt_\bh_\be_\br_\bE_\bx_\bt_\be_\bn_\bt_\bs_\b,_\bO_\bt_\bh_\be_\br_\bL_\ba_\by_\bo_\bu_\bt_\bP_\bo_\bl_\bi_\bc_\by_\b,_\bO_\bt_\bh_\be_\br_\bC_\bo_\bn_\bt_\ba_\bi_\bn_\be_\br_\b>& other)\n-214 : _\bc_\bo_\bn_\bt_\ba_\bi_\bn_\be_\br_\b_(other._\bc_\bo_\bn_\bt_\ba_\bi_\bn_\be_\br_\b_)\n-215 , _\bm_\ba_\bp_\bp_\bi_\bn_\bg_\b_(other._\bm_\ba_\bp_\bp_\bi_\bn_\bg_\b_)\n-216 {}\n-217\n-219 template , int> = 0,\n-221 std::enable_if_t, int> = 0,\n-222 std::enable_if_t&>, int> = 0,\n-223 decltype(construct_container(std::declval()),\n-bool{}) = true>\n-224 #if __cpp_conditional_explicit >= 201806L\n-225 explicit(\n-226 !std::is_convertible_v&, _\bm_\ba_\bp_\bp_\bi_\bn_\bg_\b__\bt_\by_\bp_\be> ||\n-227 !std::is_convertible_v)\n-228 #endif\n-_\b2_\b2_\b9 constexpr _\bm_\bd_\ba_\br_\br_\ba_\by (const\n-_\bm_\bd_\bs_\bp_\ba_\bn_\b<_\bO_\bt_\bh_\be_\br_\bE_\bl_\be_\bm_\be_\bn_\bt_\bT_\by_\bp_\be_\b,_\bO_\bt_\bh_\be_\br_\bE_\bx_\bt_\be_\bn_\bt_\bs_\b,_\bO_\bt_\bh_\be_\br_\bL_\ba_\by_\bo_\bu_\bt_\bP_\bo_\bl_\bi_\bc_\by_\b,_\bA_\bc_\bc_\be_\bs_\bs_\bo_\br_\b>& other)\n-230 : _\bc_\bo_\bn_\bt_\ba_\bi_\bn_\be_\br_\b_(construct_container<_\bc_\bo_\bn_\bt_\ba_\bi_\bn_\be_\br_\b__\bt_\by_\bp_\be>(other._\bs_\bi_\bz_\be()))\n-231 , _\bm_\ba_\bp_\bp_\bi_\bn_\bg_\b_(other._\bm_\ba_\bp_\bp_\bi_\bn_\bg())\n-232 {\n-233 init_from_mdspan(other);\n-234 }\n-235\n-236\n-237 // ----------------------------\n-238 // constructors with allocators\n-239\n-241 template , int> = 0>\n-_\b2_\b4_\b3 constexpr _\bm_\bd_\ba_\br_\br_\ba_\by (const _\be_\bx_\bt_\be_\bn_\bt_\bs_\b__\bt_\by_\bp_\be& e, const Alloc& a)\n-244 : _\bm_\bd_\ba_\br_\br_\ba_\by(_\bm_\ba_\bp_\bp_\bi_\bn_\bg_\b__\bt_\by_\bp_\be(e), a)\n-245 {}\n-246\n-248 template , int> = 0>\n-_\b2_\b5_\b0 constexpr _\bm_\bd_\ba_\br_\br_\ba_\by (const _\bm_\ba_\bp_\bp_\bi_\bn_\bg_\b__\bt_\by_\bp_\be& m, const Alloc& a)\n-251 : _\bc_\bo_\bn_\bt_\ba_\bi_\bn_\be_\br_\b_(m.required_span_size(), a)\n-252 , _\bm_\ba_\bp_\bp_\bi_\bn_\bg_\b_(m)\n-253 {}\n-254\n-256 template \n-_\b2_\b5_\b7 constexpr _\bm_\bd_\ba_\br_\br_\ba_\by (const _\be_\bx_\bt_\be_\bn_\bt_\bs_\b__\bt_\by_\bp_\be& e, const _\bv_\ba_\bl_\bu_\be_\b__\bt_\by_\bp_\be& v, const Alloc&\n-a)\n-258 : _\bm_\bd_\ba_\br_\br_\ba_\by(_\bm_\ba_\bp_\bp_\bi_\bn_\bg_\b__\bt_\by_\bp_\be(e), v, a)\n-259 {}\n-260\n-262 template , int> = 0>\n-_\b2_\b6_\b4 constexpr _\bm_\bd_\ba_\br_\br_\ba_\by (const _\bm_\ba_\bp_\bp_\bi_\bn_\bg_\b__\bt_\by_\bp_\be& m, const _\bv_\ba_\bl_\bu_\be_\b__\bt_\by_\bp_\be& v, const Alloc&\n-a)\n-265 : _\bc_\bo_\bn_\bt_\ba_\bi_\bn_\be_\br_\b_(m.required_span_size(), v, a)\n-266 , _\bm_\ba_\bp_\bp_\bi_\bn_\bg_\b_(m)\n-267 {}\n-268\n-270 template , int> = 0>\n-_\b2_\b7_\b2 constexpr _\bm_\bd_\ba_\br_\br_\ba_\by (const _\be_\bx_\bt_\be_\bn_\bt_\bs_\b__\bt_\by_\bp_\be& e, const _\bc_\bo_\bn_\bt_\ba_\bi_\bn_\be_\br_\b__\bt_\by_\bp_\be& c, const\n-Alloc& a)\n-273 : _\bc_\bo_\bn_\bt_\ba_\bi_\bn_\be_\br_\b_(c, a)\n-274 , _\bm_\ba_\bp_\bp_\bi_\bn_\bg_\b_(e)\n-275 {}\n-276\n-278 template , int> = 0>\n-_\b2_\b8_\b0 constexpr _\bm_\bd_\ba_\br_\br_\ba_\by (const _\be_\bx_\bt_\be_\bn_\bt_\bs_\b__\bt_\by_\bp_\be& e, _\bc_\bo_\bn_\bt_\ba_\bi_\bn_\be_\br_\b__\bt_\by_\bp_\be&& c, const Alloc&\n-a)\n-281 : _\bc_\bo_\bn_\bt_\ba_\bi_\bn_\be_\br_\b_(_\bs_\bt_\bd::move(c), a)\n-282 , _\bm_\ba_\bp_\bp_\bi_\bn_\bg_\b_(e)\n-283 {}\n-284\n-286 template , int> = 0>\n-_\b2_\b8_\b8 constexpr _\bm_\bd_\ba_\br_\br_\ba_\by (const _\bm_\ba_\bp_\bp_\bi_\bn_\bg_\b__\bt_\by_\bp_\be& m, const _\bc_\bo_\bn_\bt_\ba_\bi_\bn_\be_\br_\b__\bt_\by_\bp_\be& c, const\n-Alloc& a)\n-289 : _\bc_\bo_\bn_\bt_\ba_\bi_\bn_\be_\br_\b_(c, a)\n-290 , _\bm_\ba_\bp_\bp_\bi_\bn_\bg_\b_(m)\n-291 {}\n-292\n-294 template , int> = 0>\n-_\b2_\b9_\b6 constexpr _\bm_\bd_\ba_\br_\br_\ba_\by (const _\bm_\ba_\bp_\bp_\bi_\bn_\bg_\b__\bt_\by_\bp_\be& m, _\bc_\bo_\bn_\bt_\ba_\bi_\bn_\be_\br_\b__\bt_\by_\bp_\be&& c, const Alloc&\n-a)\n-297 : _\bc_\bo_\bn_\bt_\ba_\bi_\bn_\be_\br_\b_(_\bs_\bt_\bd::move(c), a)\n-298 , _\bm_\ba_\bp_\bp_\bi_\bn_\bg_\b_(m)\n-299 {}\n-300\n-302 template , int> =\n-0>\n-304 #if __cpp_conditional_explicit >= 201806L\n-305 explicit(\n-306 !std::is_convertible_v&,\n-_\bm_\ba_\bp_\bp_\bi_\bn_\bg_\b__\bt_\by_\bp_\be> ||\n-307 !std::is_convertible_v)\n-308 #endif\n-_\b3_\b0_\b9 constexpr _\bm_\bd_\ba_\br_\br_\ba_\by (const _\bm_\bd_\ba_\br_\br_\ba_\by_\b<_\bV_\b,_\bE_\b,_\bL_\b,_\bC_\b>& other, const Alloc& a) noexcept\n-310 : _\bc_\bo_\bn_\bt_\ba_\bi_\bn_\be_\br_\b_(other._\bc_\bo_\bn_\bt_\ba_\bi_\bn_\be_\br_\b_, a)\n-311 , _\bm_\ba_\bp_\bp_\bi_\bn_\bg_\b_(other._\bm_\ba_\bp_\bp_\bi_\bn_\bg_\b_)\n-312 {}\n-313\n-315 template , int> = 0>\n-319 #if __cpp_conditional_explicit >= 201806L\n-320 explicit(\n-321 !std::is_convertible_v&,\n-_\bm_\ba_\bp_\bp_\bi_\bn_\bg_\b__\bt_\by_\bp_\be> ||\n-322 !std::is_convertible_v ||\n-323 !std::is_convertible_v)\n-324 #endif\n-_\b3_\b2_\b5 constexpr _\bm_\bd_\ba_\br_\br_\ba_\by (const _\bm_\bd_\bs_\bp_\ba_\bn_\b<_\bV_\b,_\bE_\b,_\bL_\b,_\bA_\b>& other, const Alloc& a)\n-326 : _\bc_\bo_\bn_\bt_\ba_\bi_\bn_\be_\br_\b_(other._\bs_\bi_\bz_\be(), a)\n-327 , _\bm_\ba_\bp_\bp_\bi_\bn_\bg_\b_(other.mapping_)\n-328 {\n-329 init_from_mdspan(other);\n-330 }\n-331\n-333\n-334private:\n-335\n-336 template \n-337 void init_from_mdspan (const _\bm_\bd_\bs_\bp_\ba_\bn_\b<_\bV_\b,_\bE_\b,_\bL_\b,_\bA_\b>& other, Indices... ii)\n-338 {\n-339 constexpr _\br_\ba_\bn_\bk_\b__\bt_\by_\bp_\be pos = sizeof...(Indices);\n-340 if constexpr(pos < _\br_\ba_\bn_\bk()) {\n-341 for (typename E::index_type i = 0; i < other._\be_\bx_\bt_\be_\bn_\bt(pos); ++i)\n-342 init_from_mdspan(other,ii...,i);\n-343 } else {\n-344 using I = std::array;\n-345 _\bc_\bo_\bn_\bt_\ba_\bi_\bn_\be_\br_\b_[_\bm_\ba_\bp_\bp_\bi_\bn_\bg_\b_(_\bi_\bn_\bd_\be_\bx_\b__\bt_\by_\bp_\be(ii)...)] = other[I{ii...}];\n-346 }\n-347 }\n-348\n-349public:\n-350\n-353\n-360 template = 0,\n-362 std::enable_if_t<(... && std::is_convertible_v), int> =\n-0>\n-_\b3_\b6_\b3 constexpr _\br_\be_\bf_\be_\br_\be_\bn_\bc_\be _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b(_\b)_\b (Indices... indices)\n-364 {\n-365 return _\bc_\bo_\bn_\bt_\ba_\bi_\bn_\be_\br_\b_[_\bm_\ba_\bp_\bp_\bi_\bn_\bg_\b_(_\bi_\bn_\bd_\be_\bx_\b__\bt_\by_\bp_\be(std::move(indices))...)];\n-366 }\n-367\n-372 template = 0,\n-374 std::enable_if_t<(... && std::is_convertible_v), int> =\n-0>\n-_\b3_\b7_\b5 constexpr _\bc_\bo_\bn_\bs_\bt_\b__\br_\be_\bf_\be_\br_\be_\bn_\bc_\be _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b(_\b)_\b (Indices... indices) const\n-376 {\n-377 return _\bc_\bo_\bn_\bt_\ba_\bi_\bn_\be_\br_\b_[_\bm_\ba_\bp_\bp_\bi_\bn_\bg_\b_(_\bi_\bn_\bd_\be_\bx_\b__\bt_\by_\bp_\be(std::move(indices))...)];\n-378 }\n-379\n-380\n-381#if __cpp_multidimensional_subscript >= 202110L\n-382\n-384 template = 0,\n-386 std::enable_if_t<(... && std::is_convertible_v), int> =\n-0>\n-387 constexpr _\br_\be_\bf_\be_\br_\be_\bn_\bc_\be _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b[_\b]_\b (Indices... indices)\n-388 {\n-389 return _\bc_\bo_\bn_\bt_\ba_\bi_\bn_\be_\br_\b_[_\bm_\ba_\bp_\bp_\bi_\bn_\bg_\b_(_\bi_\bn_\bd_\be_\bx_\b__\bt_\by_\bp_\be(std::move(indices))...)];\n-390 }\n-391\n-393 template = 0,\n-395 std::enable_if_t<(... && std::is_convertible_v), int> =\n-0>\n-396 constexpr _\bc_\bo_\bn_\bs_\bt_\b__\br_\be_\bf_\be_\br_\be_\bn_\bc_\be _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b[_\b]_\b (Indices... indices) const\n-397 {\n-398 return _\bc_\bo_\bn_\bt_\ba_\bi_\bn_\be_\br_\b_[_\bm_\ba_\bp_\bp_\bi_\bn_\bg_\b_(_\bi_\bn_\bd_\be_\bx_\b__\bt_\by_\bp_\be(std::move(indices))...)];\n-399 }\n-400\n-401#else\n-402\n-405 template , int> = 0,\n-407 std::enable_if_t<(E::rank() == 1), int> = 0>\n-_\b4_\b0_\b8 constexpr _\br_\be_\bf_\be_\br_\be_\bn_\bc_\be operator[] (Index index)\n-409 {\n-410 return _\bc_\bo_\bn_\bt_\ba_\bi_\bn_\be_\br_\b_[_\bm_\ba_\bp_\bp_\bi_\bn_\bg_\b_(_\bi_\bn_\bd_\be_\bx_\b__\bt_\by_\bp_\be(std::move(index)))];\n-411 }\n-412\n-415 template , int> = 0,\n-417 std::enable_if_t<(E::rank() == 1), int> = 0>\n-_\b4_\b1_\b8 constexpr _\bc_\bo_\bn_\bs_\bt_\b__\br_\be_\bf_\be_\br_\be_\bn_\bc_\be operator[] (Index index) const\n-419 {\n-420 return _\bc_\bo_\bn_\bt_\ba_\bi_\bn_\be_\br_\b_[_\bm_\ba_\bp_\bp_\bi_\bn_\bg_\b_(_\bi_\bn_\bd_\be_\bx_\b__\bt_\by_\bp_\be(std::move(index)))];\n-421 }\n-422\n-423#endif\n-424\n-425\n-427 template , int> = 0>\n-_\b4_\b2_\b9 constexpr _\br_\be_\bf_\be_\br_\be_\bn_\bc_\be _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b[_\b]_\b (_\bS_\bt_\bd_\b:_\b:_\bs_\bp_\ba_\bn\n-indices)\n-430 {\n-431 return _\bu_\bn_\bp_\ba_\bc_\bk_\bI_\bn_\bt_\be_\bg_\be_\br_\bS_\be_\bq_\bu_\be_\bn_\bc_\be([&](auto... ii) -> _\br_\be_\bf_\be_\br_\be_\bn_\bc_\be {\n-432 return _\bc_\bo_\bn_\bt_\ba_\bi_\bn_\be_\br_\b_[_\bm_\ba_\bp_\bp_\bi_\bn_\bg_\b_(_\bi_\bn_\bd_\be_\bx_\b__\bt_\by_\bp_\be(indices[ii])...)]; },\n-433 std::make_index_sequence{});\n-434 }\n-435\n-437 template , int> = 0>\n-_\b4_\b3_\b9 constexpr _\bc_\bo_\bn_\bs_\bt_\b__\br_\be_\bf_\be_\br_\be_\bn_\bc_\be _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b[_\b]_\b (_\bS_\bt_\bd_\b:_\b:_\bs_\bp_\ba_\bn\n-indices) const\n-440 {\n-441 return _\bu_\bn_\bp_\ba_\bc_\bk_\bI_\bn_\bt_\be_\bg_\be_\br_\bS_\be_\bq_\bu_\be_\bn_\bc_\be([&](auto... ii) -> _\bc_\bo_\bn_\bs_\bt_\b__\br_\be_\bf_\be_\br_\be_\bn_\bc_\be {\n-442 return _\bc_\bo_\bn_\bt_\ba_\bi_\bn_\be_\br_\b_[_\bm_\ba_\bp_\bp_\bi_\bn_\bg_\b_(_\bi_\bn_\bd_\be_\bx_\b__\bt_\by_\bp_\be(indices[ii])...)]; },\n-443 std::make_index_sequence{});\n-444 }\n-445\n-447 template , int> = 0>\n-_\b4_\b4_\b9 constexpr _\br_\be_\bf_\be_\br_\be_\bn_\bc_\be _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b[_\b]_\b (const std::array& indices)\n-450 {\n-451 return std::apply([&](auto... ii) -> _\br_\be_\bf_\be_\br_\be_\bn_\bc_\be {\n-452 return _\bc_\bo_\bn_\bt_\ba_\bi_\bn_\be_\br_\b_[_\bm_\ba_\bp_\bp_\bi_\bn_\bg_\b_(_\bi_\bn_\bd_\be_\bx_\b__\bt_\by_\bp_\be(ii)...)]; }, indices);\n-453 }\n-454\n-456 template , int> = 0>\n-_\b4_\b5_\b8 constexpr _\bc_\bo_\bn_\bs_\bt_\b__\br_\be_\bf_\be_\br_\be_\bn_\bc_\be _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b[_\b]_\b (const std::array& indices) const\n-459 {\n-460 return std::apply([&](auto... ii) -> _\bc_\bo_\bn_\bs_\bt_\b__\br_\be_\bf_\be_\br_\be_\bn_\bc_\be {\n-461 return _\bc_\bo_\bn_\bt_\ba_\bi_\bn_\be_\br_\b_[_\bm_\ba_\bp_\bp_\bi_\bn_\bg_\b_(_\bi_\bn_\bd_\be_\bx_\b__\bt_\by_\bp_\be(ii)...)]; }, indices);\n-462 }\n-463\n-465\n-466\n-_\b4_\b6_\b8 constexpr const _\be_\bx_\bt_\be_\bn_\bt_\bs_\b__\bt_\by_\bp_\be& _\be_\bx_\bt_\be_\bn_\bt_\bs () const noexcept { return\n-_\bm_\ba_\bp_\bp_\bi_\bn_\bg_\b_.extents(); }\n-469\n-_\b4_\b7_\b1 constexpr const _\bm_\ba_\bp_\bp_\bi_\bn_\bg_\b__\bt_\by_\bp_\be& _\bm_\ba_\bp_\bp_\bi_\bn_\bg () const noexcept { return _\bm_\ba_\bp_\bp_\bi_\bn_\bg_\b_;\n-}\n-472\n-_\b4_\b7_\b4 constexpr const _\bc_\bo_\bn_\bt_\ba_\bi_\bn_\be_\br_\b__\bt_\by_\bp_\be& _\bc_\bo_\bn_\bt_\ba_\bi_\bn_\be_\br () const noexcept { return\n-_\bc_\bo_\bn_\bt_\ba_\bi_\bn_\be_\br_\b_; }\n-475\n-_\b4_\b8_\b2 constexpr _\bc_\bo_\bn_\bt_\ba_\bi_\bn_\be_\br_\b__\bt_\by_\bp_\be&& _\be_\bx_\bt_\br_\ba_\bc_\bt_\b__\bc_\bo_\bn_\bt_\ba_\bi_\bn_\be_\br () && noexcept { return std::\n-move(_\bc_\bo_\bn_\bt_\ba_\bi_\bn_\be_\br_\b_); }\n-483\n-484\n-487\n-_\b4_\b8_\b9 static constexpr _\br_\ba_\bn_\bk_\b__\bt_\by_\bp_\be _\br_\ba_\bn_\bk () noexcept { return extents_type::rank();\n-}\n-490\n-_\b4_\b9_\b2 static constexpr _\br_\ba_\bn_\bk_\b__\bt_\by_\bp_\be _\br_\ba_\bn_\bk_\b__\bd_\by_\bn_\ba_\bm_\bi_\bc () noexcept { return extents_type::\n-rank_dynamic(); }\n-493\n-_\b4_\b9_\b5 static constexpr std::size_t _\bs_\bt_\ba_\bt_\bi_\bc_\b__\be_\bx_\bt_\be_\bn_\bt (_\br_\ba_\bn_\bk_\b__\bt_\by_\bp_\be r) noexcept { return\n-extents_type::static_extent(r); }\n-496\n-_\b4_\b9_\b8 constexpr _\bi_\bn_\bd_\be_\bx_\b__\bt_\by_\bp_\be _\be_\bx_\bt_\be_\bn_\bt (_\br_\ba_\bn_\bk_\b__\bt_\by_\bp_\be r) const noexcept { return _\be_\bx_\bt_\be_\bn_\bt_\bs\n-().extent(r); }\n-499\n-_\b5_\b0_\b1 constexpr _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be _\bs_\bi_\bz_\be () const noexcept\n-502 {\n-503 _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be s = 1;\n-504 for (_\br_\ba_\bn_\bk_\b__\bt_\by_\bp_\be r = 0; r < _\br_\ba_\bn_\bk(); ++r)\n-505 s *= _\be_\bx_\bt_\be_\bn_\bt(r);\n-506 return s;\n-507 }\n-508\n-_\b5_\b1_\b0 constexpr std::size_t _\bc_\bo_\bn_\bt_\ba_\bi_\bn_\be_\br_\b__\bs_\bi_\bz_\be () const { return _\bc_\bo_\bn_\bt_\ba_\bi_\bn_\be_\br_\b_.size(); }\n-511\n-_\b5_\b1_\b3 [[nodiscard]] constexpr bool _\be_\bm_\bp_\bt_\by () const noexcept { return _\bs_\bi_\bz_\be() == 0;\n-}\n-514\n-_\b5_\b1_\b6 constexpr _\bi_\bn_\bd_\be_\bx_\b__\bt_\by_\bp_\be _\bs_\bt_\br_\bi_\bd_\be (_\br_\ba_\bn_\bk_\b__\bt_\by_\bp_\be r) const { return _\bm_\ba_\bp_\bp_\bi_\bn_\bg().stride\n-(r); };\n-517\n-519\n-520\n-_\b5_\b2_\b1 static constexpr bool _\bi_\bs_\b__\ba_\bl_\bw_\ba_\by_\bs_\b__\bu_\bn_\bi_\bq_\bu_\be () noexcept { return mapping_type::\n-is_always_unique(); }\n-_\b5_\b2_\b2 static constexpr bool _\bi_\bs_\b__\ba_\bl_\bw_\ba_\by_\bs_\b__\be_\bx_\bh_\ba_\bu_\bs_\bt_\bi_\bv_\be () noexcept { return\n-mapping_type::is_always_exhaustive(); }\n-_\b5_\b2_\b3 static constexpr bool _\bi_\bs_\b__\ba_\bl_\bw_\ba_\by_\bs_\b__\bs_\bt_\br_\bi_\bd_\be_\bd () noexcept { return mapping_type::\n-is_always_strided(); }\n-524\n-_\b5_\b2_\b5 constexpr bool _\bi_\bs_\b__\bu_\bn_\bi_\bq_\bu_\be () const noexcept { return _\bm_\ba_\bp_\bp_\bi_\bn_\bg_\b_.is_unique(); }\n-_\b5_\b2_\b6 constexpr bool _\bi_\bs_\b__\be_\bx_\bh_\ba_\bu_\bs_\bt_\bi_\bv_\be () const noexcept { return\n-_\bm_\ba_\bp_\bp_\bi_\bn_\bg_\b_.is_exhaustive(); }\n-_\b5_\b2_\b7 constexpr bool _\bi_\bs_\b__\bs_\bt_\br_\bi_\bd_\be_\bd () const noexcept { return _\bm_\ba_\bp_\bp_\bi_\bn_\bg_\b_.is_strided();\n-}\n-528\n-529\n-532\n-_\b5_\b3_\b4 constexpr _\bp_\bo_\bi_\bn_\bt_\be_\br _\bc_\bo_\bn_\bt_\ba_\bi_\bn_\be_\br_\b__\bd_\ba_\bt_\ba () noexcept { return _\bS_\bt_\bd_\b:_\b:_\bt_\bo_\b__\ba_\bd_\bd_\br_\be_\bs_\bs\n-(_\bc_\bo_\bn_\bt_\ba_\bi_\bn_\be_\br_\b_.begin()); }\n-535\n-_\b5_\b3_\b7 constexpr _\bc_\bo_\bn_\bs_\bt_\b__\bp_\bo_\bi_\bn_\bt_\be_\br _\bc_\bo_\bn_\bt_\ba_\bi_\bn_\be_\br_\b__\bd_\ba_\bt_\ba () const noexcept { return _\bS_\bt_\bd_\b:_\b:\n-_\bt_\bo_\b__\ba_\bd_\bd_\br_\be_\bs_\bs(_\bc_\bo_\bn_\bt_\ba_\bi_\bn_\be_\br_\b_.begin()); }\n-538\n-540\n-541\n-_\b5_\b4_\b2 friend constexpr void _\bs_\bw_\ba_\bp (_\bm_\bd_\ba_\br_\br_\ba_\by& x, _\bm_\bd_\ba_\br_\br_\ba_\by& y) noexcept\n-543 {\n-544 using std::swap;\n-545 _\bs_\bw_\ba_\bp(x.container_, y.container_);\n-546 _\bs_\bw_\ba_\bp(x.mapping_, y.mapping_);\n-547 }\n-548\n-549\n-552\n-_\b5_\b5_\b3 friend constexpr bool _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b=_\b=_\b (const _\bm_\bd_\ba_\br_\br_\ba_\by& lhs, const _\bm_\bd_\ba_\br_\br_\ba_\by& rhs)\n-noexcept\n-554 {\n-555 return lhs.mapping() == rhs.mapping() && lhs.container() == rhs.container\n-();\n-556 }\n-557\n-559\n-562\n-564 template , _\bm_\bd_\bs_\bp_\ba_\bn_\b__\bt_\by_\bp_\be>, int> =\n-0>\n-_\b5_\b6_\b6 constexpr operator _\bm_\bd_\bs_\bp_\ba_\bn_\b<_\bV_\b,_\bE_\b,_\bL_\b,_\bA_\b> ()\n-567 {\n-568 return _\bm_\bd_\bs_\bp_\ba_\bn_\b__\bt_\by_\bp_\be(_\bc_\bo_\bn_\bt_\ba_\bi_\bn_\be_\br_\b__\bd_\ba_\bt_\ba(), _\bm_\ba_\bp_\bp_\bi_\bn_\bg());\n-569 }\n-570\n-572 template , _\bc_\bo_\bn_\bs_\bt_\b__\bm_\bd_\bs_\bp_\ba_\bn_\b__\bt_\by_\bp_\be>,\n-int> = 0>\n-_\b5_\b7_\b4 constexpr operator _\bm_\bd_\bs_\bp_\ba_\bn_\b<_\bV_\b,_\bE_\b,_\bL_\b,_\bA_\b> () const\n-575 {\n-576 return _\bc_\bo_\bn_\bs_\bt_\b__\bm_\bd_\bs_\bp_\ba_\bn_\b__\bt_\by_\bp_\be(_\bc_\bo_\bn_\bt_\ba_\bi_\bn_\be_\br_\b__\bd_\ba_\bt_\ba(), _\bm_\ba_\bp_\bp_\bi_\bn_\bg());\n-577 }\n-578\n-580 template ,\n-581 std::enable_if_t<\n-582 std::is_assignable_v>, int> = 0>\n-583 constexpr _\bm_\bd_\bs_\bp_\ba_\bn_\b<_\be_\bl_\be_\bm_\be_\bn_\bt_\b__\bt_\by_\bp_\be_\b,_\be_\bx_\bt_\be_\bn_\bt_\bs_\b__\bt_\by_\bp_\be_\b,_\bl_\ba_\by_\bo_\bu_\bt_\b__\bt_\by_\bp_\be_\b,_\bA_\bc_\bc_\be_\bs_\bs_\bo_\br_\bP_\bo_\bl_\bi_\bc_\by_\b>\n-_\b5_\b8_\b4 _\bt_\bo_\b__\bm_\bd_\bs_\bp_\ba_\bn (const AccessorPolicy& a = AccessorPolicy{})\n-585 {\n-586 return _\bm_\bd_\bs_\bp_\ba_\bn_\b<_\be_\bl_\be_\bm_\be_\bn_\bt_\b__\bt_\by_\bp_\be_\b,_\be_\bx_\bt_\be_\bn_\bt_\bs_\b__\bt_\by_\bp_\be_\b,_\bl_\ba_\by_\bo_\bu_\bt_\b__\bt_\by_\bp_\be_\b,_\bA_\bc_\bc_\be_\bs_\bs_\bo_\br_\bP_\bo_\bl_\bi_\bc_\by_\b>\n-(_\bc_\bo_\bn_\bt_\ba_\bi_\bn_\be_\br_\b__\bd_\ba_\bt_\ba(), _\bm_\ba_\bp_\bp_\bi_\bn_\bg(), a);\n-587 }\n-588\n-590 template ,\n-591 std::enable_if_t<\n-592 std::is_assignable_v>, int> = 0>\n-593 constexpr mdspan\n-_\b5_\b9_\b4 _\bt_\bo_\b__\bm_\bd_\bs_\bp_\ba_\bn (const AccessorPolicy& a = AccessorPolicy{}) const\n-595 {\n-596 return _\bm_\bd_\bs_\bp_\ba_\bn_\b<_\bc_\bo_\bn_\bs_\bt_\b _\be_\bl_\be_\bm_\be_\bn_\bt_\b__\bt_\by_\bp_\be_\b,_\be_\bx_\bt_\be_\bn_\bt_\bs_\b__\bt_\by_\bp_\be_\b,_\bl_\ba_\by_\bo_\bu_\bt_\b__\bt_\by_\bp_\be_\b,_\bA_\bc_\bc_\be_\bs_\bs_\bo_\br_\bP_\bo_\bl_\bi_\bc_\by_\b>\n-(_\bc_\bo_\bn_\bt_\ba_\bi_\bn_\be_\br_\b__\bd_\ba_\bt_\ba(), _\bm_\ba_\bp_\bp_\bi_\bn_\bg(), a);\n-597 }\n-598\n-599protected:\n-_\b6_\b0_\b0 _\bc_\bo_\bn_\bt_\ba_\bi_\bn_\be_\br_\b__\bt_\by_\bp_\be _\bc_\bo_\bn_\bt_\ba_\bi_\bn_\be_\br_\b_;\n-_\b6_\b0_\b1 [[no_unique_address]] _\bm_\ba_\bp_\bp_\bi_\bn_\bg_\b__\bt_\by_\bp_\be _\bm_\ba_\bp_\bp_\bi_\bn_\bg_\b_;\n-602};\n-603\n-607\n-608template \n-609_\bm_\bd_\ba_\br_\br_\ba_\by (const _\bS_\bt_\bd_\b:_\b:_\be_\bx_\bt_\be_\bn_\bt_\bs_\b<_\bI_\bn_\bd_\be_\bx_\bT_\by_\bp_\be_\b,_\b _\be_\bx_\bt_\bs_\b._\b._\b._\b>&, const Container&)\n-610 -> _\bm_\bd_\ba_\br_\br_\ba_\by, _\bl_\ba_\by_\bo_\bu_\bt_\b__\br_\bi_\bg_\bh_\bt, Container>;\n-611\n-612template \n-613_\bm_\bd_\ba_\br_\br_\ba_\by (const Mapping&, const Container&)\n-614 -> _\bm_\bd_\ba_\br_\br_\ba_\by_\b<_\bt_\by_\bp_\be_\bn_\ba_\bm_\be_\b _\bC_\bo_\bn_\bt_\ba_\bi_\bn_\be_\br_\b:_\b:_\bv_\ba_\bl_\bu_\be_\b__\bt_\by_\bp_\be_\b,_\b _\bt_\by_\bp_\be_\bn_\ba_\bm_\be_\b _\bM_\ba_\bp_\bp_\bi_\bn_\bg_\b:_\b:_\be_\bx_\bt_\be_\bn_\bt_\bs_\b__\bt_\by_\bp_\be_\b,\n-_\bt_\by_\bp_\be_\bn_\ba_\bm_\be_\b _\bM_\ba_\bp_\bp_\bi_\bn_\bg_\b:_\b:_\bl_\ba_\by_\bo_\bu_\bt_\b__\bt_\by_\bp_\be_\b,_\b _\bC_\bo_\bn_\bt_\ba_\bi_\bn_\be_\br_\b>;\n-615\n-616template \n-617_\bm_\bd_\ba_\br_\br_\ba_\by (const _\bS_\bt_\bd_\b:_\b:_\be_\bx_\bt_\be_\bn_\bt_\bs_\b<_\bI_\bn_\bd_\be_\bx_\bT_\by_\bp_\be_\b,_\b _\be_\bx_\bt_\bs_\b._\b._\b._\b>&, Container&&)\n-618 -> _\bm_\bd_\ba_\br_\br_\ba_\by, _\bl_\ba_\by_\bo_\bu_\bt_\b__\br_\bi_\bg_\bh_\bt, Container>;\n-619\n-620template \n-621_\bm_\bd_\ba_\br_\br_\ba_\by (const Mapping&, Container&&)\n-622 -> _\bm_\bd_\ba_\br_\br_\ba_\by_\b<_\bt_\by_\bp_\be_\bn_\ba_\bm_\be_\b _\bC_\bo_\bn_\bt_\ba_\bi_\bn_\be_\br_\b:_\b:_\bv_\ba_\bl_\bu_\be_\b__\bt_\by_\bp_\be_\b,_\b _\bt_\by_\bp_\be_\bn_\ba_\bm_\be_\b _\bM_\ba_\bp_\bp_\bi_\bn_\bg_\b:_\b:_\be_\bx_\bt_\be_\bn_\bt_\bs_\b__\bt_\by_\bp_\be_\b,\n-_\bt_\by_\bp_\be_\bn_\ba_\bm_\be_\b _\bM_\ba_\bp_\bp_\bi_\bn_\bg_\b:_\b:_\bl_\ba_\by_\bo_\bu_\bt_\b__\bt_\by_\bp_\be_\b,_\b _\bC_\bo_\bn_\bt_\ba_\bi_\bn_\be_\br_\b>;\n-623\n-624template \n-625_\bm_\bd_\ba_\br_\br_\ba_\by (const _\bm_\bd_\bs_\bp_\ba_\bn_\b<_\bE_\bl_\be_\bm_\be_\bn_\bt_\b,_\b _\bE_\bx_\bt_\be_\bn_\bt_\bs_\b,_\b _\bL_\ba_\by_\bo_\bu_\bt_\b,_\b _\bA_\bc_\bc_\be_\bs_\bs_\bo_\br_\b>&)\n-626 -> _\bm_\bd_\ba_\br_\br_\ba_\by_\b<_\bs_\bt_\bd_\b:_\b:_\br_\be_\bm_\bo_\bv_\be_\b__\bc_\bv_\b__\bt_\b<_\bE_\bl_\be_\bm_\be_\bn_\bt_\b>, Extents, Layout>;\n-627\n-628template \n-629_\bm_\bd_\ba_\br_\br_\ba_\by (const _\bS_\bt_\bd_\b:_\b:_\be_\bx_\bt_\be_\bn_\bt_\bs_\b<_\bI_\bn_\bd_\be_\bx_\bT_\by_\bp_\be_\b,_\b _\be_\bx_\bt_\bs_\b._\b._\b._\b>&, const Container&, const\n-Alloc&)\n-630 -> _\bm_\bd_\ba_\br_\br_\ba_\by, _\bl_\ba_\by_\bo_\bu_\bt_\b__\br_\bi_\bg_\bh_\bt, Container>;\n-631\n-632template \n-633_\bm_\bd_\ba_\br_\br_\ba_\by (const Mapping&, const Container&, const Alloc&)\n-634 -> _\bm_\bd_\ba_\br_\br_\ba_\by_\b<_\bt_\by_\bp_\be_\bn_\ba_\bm_\be_\b _\bC_\bo_\bn_\bt_\ba_\bi_\bn_\be_\br_\b:_\b:_\bv_\ba_\bl_\bu_\be_\b__\bt_\by_\bp_\be_\b,_\b _\bt_\by_\bp_\be_\bn_\ba_\bm_\be_\b _\bM_\ba_\bp_\bp_\bi_\bn_\bg_\b:_\b:_\be_\bx_\bt_\be_\bn_\bt_\bs_\b__\bt_\by_\bp_\be_\b,\n-_\bt_\by_\bp_\be_\bn_\ba_\bm_\be_\b _\bM_\ba_\bp_\bp_\bi_\bn_\bg_\b:_\b:_\bl_\ba_\by_\bo_\bu_\bt_\b__\bt_\by_\bp_\be_\b,_\b _\bC_\bo_\bn_\bt_\ba_\bi_\bn_\be_\br_\b>;\n-635\n-636template \n-637_\bm_\bd_\ba_\br_\br_\ba_\by (const _\bS_\bt_\bd_\b:_\b:_\be_\bx_\bt_\be_\bn_\bt_\bs_\b<_\bI_\bn_\bd_\be_\bx_\bT_\by_\bp_\be_\b,_\b _\be_\bx_\bt_\bs_\b._\b._\b._\b>&, Container&&, const Alloc&)\n-638 -> _\bm_\bd_\ba_\br_\br_\ba_\by, _\bl_\ba_\by_\bo_\bu_\bt_\b__\br_\bi_\bg_\bh_\bt, Container>;\n-639\n-640template \n-641_\bm_\bd_\ba_\br_\br_\ba_\by (const Mapping&, Container&&, const Alloc&)\n-642 -> _\bm_\bd_\ba_\br_\br_\ba_\by_\b<_\bt_\by_\bp_\be_\bn_\ba_\bm_\be_\b _\bC_\bo_\bn_\bt_\ba_\bi_\bn_\be_\br_\b:_\b:_\bv_\ba_\bl_\bu_\be_\b__\bt_\by_\bp_\be_\b,_\b _\bt_\by_\bp_\be_\bn_\ba_\bm_\be_\b _\bM_\ba_\bp_\bp_\bi_\bn_\bg_\b:_\b:_\be_\bx_\bt_\be_\bn_\bt_\bs_\b__\bt_\by_\bp_\be_\b,\n-_\bt_\by_\bp_\be_\bn_\ba_\bm_\be_\b _\bM_\ba_\bp_\bp_\bi_\bn_\bg_\b:_\b:_\bl_\ba_\by_\bo_\bu_\bt_\b__\bt_\by_\bp_\be_\b,_\b _\bC_\bo_\bn_\bt_\ba_\bi_\bn_\be_\br_\b>;\n-643\n-644template \n-645_\bm_\bd_\ba_\br_\br_\ba_\by (const _\bm_\bd_\bs_\bp_\ba_\bn_\b<_\bE_\bl_\be_\bm_\be_\bn_\bt_\b,_\b _\bE_\bx_\bt_\be_\bn_\bt_\bs_\b,_\b _\bL_\ba_\by_\bo_\bu_\bt_\b,_\b _\bA_\bc_\bc_\be_\bs_\bs_\bo_\br_\b>&, const Alloc&)\n-646 -> _\bm_\bd_\ba_\br_\br_\ba_\by_\b<_\bs_\bt_\bd_\b:_\b:_\br_\be_\bm_\bo_\bv_\be_\b__\bc_\bv_\b__\bt_\b<_\bE_\bl_\be_\bm_\be_\bn_\bt_\b>, Extents, Layout>;\n-647\n-649\n-653\n-654template \n-655_\bm_\bd_\bs_\bp_\ba_\bn (_\bm_\bd_\ba_\br_\br_\ba_\by_\b<_\bE_\bl_\be_\bm_\be_\bn_\bt_\b,_\b _\bE_\bx_\bt_\be_\bn_\bt_\bs_\b,_\b _\bL_\ba_\by_\bo_\bu_\bt_\b,_\b _\bC_\bo_\bn_\bt_\ba_\bi_\bn_\be_\br_\b>) -> _\bm_\bd_\bs_\bp_\ba_\bn<\n-656 typename decltype(std::declval>().to_mdspan())::element_type,\n-657 typename decltype(std::declval<_\bm_\bd_\ba_\br_\br_\ba_\by_\b<_\bE_\bl_\be_\bm_\be_\bn_\bt_\b,_\b _\bE_\bx_\bt_\be_\bn_\bt_\bs_\b,_\b _\bL_\ba_\by_\bo_\bu_\bt_\b,\n-_\bC_\bo_\bn_\bt_\ba_\bi_\bn_\be_\br_\b>>()._\bt_\bo_\b__\bm_\bd_\bs_\bp_\ba_\bn())::extents_type,\n-658 typename decltype(std::declval<_\bm_\bd_\ba_\br_\br_\ba_\by_\b<_\bE_\bl_\be_\bm_\be_\bn_\bt_\b,_\b _\bE_\bx_\bt_\be_\bn_\bt_\bs_\b,_\b _\bL_\ba_\by_\bo_\bu_\bt_\b,\n-_\bC_\bo_\bn_\bt_\ba_\bi_\bn_\be_\br_\b>>()._\bt_\bo_\b__\bm_\bd_\bs_\bp_\ba_\bn())::layout_type,\n-659 typename decltype(std::declval<_\bm_\bd_\ba_\br_\br_\ba_\by_\b<_\bE_\bl_\be_\bm_\be_\bn_\bt_\b,_\b _\bE_\bx_\bt_\be_\bn_\bt_\bs_\b,_\b _\bL_\ba_\by_\bo_\bu_\bt_\b,\n-_\bC_\bo_\bn_\bt_\ba_\bi_\bn_\be_\br_\b>>()._\bt_\bo_\b__\bm_\bd_\bs_\bp_\ba_\bn())::accessor_type>;\n-660\n-662\n-663} // end namespace Dune::Std\n-664\n-665#endif // DUNE_COMMON_STD_MDARRAY_HH\n-_\bm_\be_\bm_\bo_\br_\by_\b._\bh_\bh\n-_\bd_\be_\bf_\ba_\bu_\bl_\bt_\b__\ba_\bc_\bc_\be_\bs_\bs_\bo_\br_\b._\bh_\bh\n-_\bc_\bo_\bn_\bt_\ba_\bi_\bn_\be_\br_\bc_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bi_\bo_\bn_\bt_\br_\ba_\bi_\bt_\bs_\b._\bh_\bh\n-_\bs_\bp_\ba_\bn_\b._\bh_\bh\n-_\bm_\bd_\bs_\bp_\ba_\bn_\b._\bh_\bh\n-_\br_\ba_\bn_\bg_\be_\bu_\bt_\bi_\bl_\bi_\bt_\bi_\be_\bs_\b._\bh_\bh\n-Utilities for reduction like operations on ranges.\n-_\bi_\bn_\bd_\bi_\bc_\be_\bs_\b._\bh_\bh\n-_\bD_\bu_\bn_\be_\b:_\b:_\bu_\bn_\bp_\ba_\bc_\bk_\bI_\bn_\bt_\be_\bg_\be_\br_\bS_\be_\bq_\bu_\be_\bn_\bc_\be\n-decltype(auto) constexpr unpackIntegerSequence(F &&f, std::integer_sequence< I,\n-i... > sequence)\n-Unpack an std::integer_sequence to std::integral_constant...\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn indices.hh:124\n-_\bs_\bt_\bd\n-STL namespace.\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bt_\bd\n-Namespace for features backported from new C++ standards.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn default_accessor.hh:10\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bt_\bd_\b:_\b:_\bt_\bo_\b__\ba_\bd_\bd_\br_\be_\bs_\bs\n-constexpr auto to_address(T &&p) noexcept\n-Obtain the address represented by p without forming a reference to the object\n-pointed to by p.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn memory.hh:47\n-_\bD_\bu_\bn_\be_\b:_\b:_\bc_\bo_\bn_\bs_\bt_\b__\br_\be_\bf_\be_\br_\be_\bn_\bc_\be\n-Get the 'const' version of a reference to a mutable object.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn genericiterator.hh:87\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bt_\bd_\b:_\b:_\be_\bx_\bt_\be_\bn_\bt_\bs\n-Multidimensional index space with dynamic and static extents.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn extents.hh:54\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bt_\bd_\b:_\b:_\bl_\ba_\by_\bo_\bu_\bt_\b__\br_\bi_\bg_\bh_\bt\n-A layout where the rightmost extent has stride 1, and strides increase right-\n-to-left as the product o...\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn fwd_layouts.hh:30\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bt_\bd_\b:_\b:_\bm_\bd_\ba_\br_\br_\ba_\by\n-An owning multi-dimensional array analog of mdspan.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mdarray.hh:69\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bt_\bd_\b:_\b:_\bm_\bd_\ba_\br_\br_\ba_\by_\b:_\b:_\bc_\bo_\bn_\bs_\bt_\b__\bm_\bd_\bs_\bp_\ba_\bn_\b__\bt_\by_\bp_\be\n-mdspan< const element_type, extents_type, layout_type > const_mdspan_type\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mdarray.hh:91\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bt_\bd_\b:_\b:_\bm_\bd_\ba_\br_\br_\ba_\by_\b:_\b:_\bm_\bd_\ba_\br_\br_\ba_\by\n-constexpr mdarray(const mapping_type &m, const container_type &c, const Alloc\n-&a)\n-Construct from layout mapping, container and allocator.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mdarray.hh:288\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bt_\bd_\b:_\b:_\bm_\bd_\ba_\br_\br_\ba_\by_\b:_\b:_\bc_\bo_\bn_\bs_\bt_\b__\br_\be_\bf_\be_\br_\be_\bn_\bc_\be\n-typename container_type::const_reference const_reference\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mdarray.hh:96\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bt_\bd_\b:_\b:_\bm_\bd_\ba_\br_\br_\ba_\by_\b:_\b:_\bm_\bd_\ba_\br_\br_\ba_\by\n-constexpr mdarray(const mapping_type &m, container_type &&c)\n-Construct from layout mapping and the storage container.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mdarray.hh:194\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bt_\bd_\b:_\b:_\bm_\bd_\ba_\br_\br_\ba_\by_\b:_\b:_\bc_\bo_\bn_\bt_\ba_\bi_\bn_\be_\br_\b__\bt_\by_\bp_\be\n-Container container_type\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mdarray.hh:81\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bt_\bd_\b:_\b:_\bm_\bd_\ba_\br_\br_\ba_\by_\b:_\b:_\be_\bx_\bt_\be_\bn_\bt_\bs_\b__\bt_\by_\bp_\be\n-Extents extents_type\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mdarray.hh:79\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bt_\bd_\b:_\b:_\bm_\bd_\ba_\br_\br_\ba_\by_\b:_\b:_\bm_\bd_\ba_\br_\br_\ba_\by\n-constexpr mdarray(const E &e, const container_type &c)\n-Construct from extents and the storage container.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mdarray.hh:174\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bt_\bd_\b:_\b:_\bm_\bd_\ba_\br_\br_\ba_\by_\b:_\b:_\bi_\bs_\b__\ba_\bl_\bw_\ba_\by_\bs_\b__\be_\bx_\bh_\ba_\bu_\bs_\bt_\bi_\bv_\be\n-static constexpr bool is_always_exhaustive() noexcept\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mdarray.hh:522\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bt_\bd_\b:_\b:_\bm_\bd_\ba_\br_\br_\ba_\by_\b:_\b:_\bt_\bo_\b__\bm_\bd_\bs_\bp_\ba_\bn\n-constexpr mdspan< const element_type, extents_type, layout_type, AccessorPolicy\n-> to_mdspan(const AccessorPolicy &a=AccessorPolicy{}) const\n-Conversion function to mdspan.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mdarray.hh:594\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bt_\bd_\b:_\b:_\bm_\bd_\ba_\br_\br_\ba_\by_\b:_\b:_\bs_\bt_\br_\bi_\bd_\be\n-constexpr index_type stride(rank_type r) const\n-The stride along the specified dimension.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mdarray.hh:516\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bt_\bd_\b:_\b:_\bm_\bd_\ba_\br_\br_\ba_\by_\b:_\b:_\bi_\bs_\b__\bu_\bn_\bi_\bq_\bu_\be\n-constexpr bool is_unique() const noexcept\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mdarray.hh:525\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bt_\bd_\b:_\b:_\bm_\bd_\ba_\br_\br_\ba_\by_\b:_\b:_\be_\bx_\bt_\be_\bn_\bt\n-constexpr index_type extent(rank_type r) const noexcept\n-Number of elements in the r'th dimension of the tensor.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mdarray.hh:498\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bt_\bd_\b:_\b:_\bm_\bd_\ba_\br_\br_\ba_\by_\b:_\b:_\bm_\bd_\ba_\br_\br_\ba_\by\n-constexpr mdarray(const extents_type &e, const Alloc &a)\n-Construct from the extents of the array and allocator.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mdarray.hh:243\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bt_\bd_\b:_\b:_\bm_\bd_\ba_\br_\br_\ba_\by_\b:_\b:_\bs_\bt_\ba_\bt_\bi_\bc_\b__\be_\bx_\bt_\be_\bn_\bt\n-static constexpr std::size_t static_extent(rank_type r) noexcept\n-Number of elements in the r'th dimension of the tensor.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mdarray.hh:495\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bt_\bd_\b:_\b:_\bm_\bd_\ba_\br_\br_\ba_\by_\b:_\b:_\bm_\ba_\bp_\bp_\bi_\bn_\bg_\b_\n-mapping_type mapping_\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mdarray.hh:601\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bt_\bd_\b:_\b:_\bm_\bd_\ba_\br_\br_\ba_\by_\b:_\b:_\bm_\bd_\ba_\br_\br_\ba_\by\n-constexpr mdarray(const mdspan< OtherElementType, OtherExtents,\n-OtherLayoutPolicy, Accessor > &other)\n-Converting constructor from mdspan.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mdarray.hh:229\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bt_\bd_\b:_\b:_\bm_\bd_\ba_\br_\br_\ba_\by_\b:_\b:_\bm_\ba_\bp_\bp_\bi_\bn_\bg_\b__\bt_\by_\bp_\be\n-typename layout_type::template mapping< extents_type > mapping_type\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mdarray.hh:84\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bt_\bd_\b:_\b:_\bm_\bd_\ba_\br_\br_\ba_\by_\b:_\b:_\bc_\bo_\bn_\bt_\ba_\bi_\bn_\be_\br_\b__\bd_\ba_\bt_\ba\n-constexpr const_pointer container_data() const noexcept\n-Direct access to the underlying const data in the container.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mdarray.hh:537\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bt_\bd_\b:_\b:_\bm_\bd_\ba_\br_\br_\ba_\by_\b:_\b:_\bm_\bd_\ba_\br_\br_\ba_\by\n-constexpr mdarray(const extents_type &e, const value_type &v)\n-Construct from extents and initial value.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mdarray.hh:155\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bt_\bd_\b:_\b:_\bm_\bd_\ba_\br_\br_\ba_\by_\b:_\b:_\bm_\bd_\ba_\br_\br_\ba_\by\n-constexpr mdarray(const mapping_type &m, const Alloc &a)\n-Construct from the layout mapping of the array and allocator.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mdarray.hh:250\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bt_\bd_\b:_\b:_\bm_\bd_\ba_\br_\br_\ba_\by_\b:_\b:_\bc_\bo_\bn_\bt_\ba_\bi_\bn_\be_\br_\b__\bd_\ba_\bt_\ba\n-constexpr pointer container_data() noexcept\n-Direct access to the underlying data in the container.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mdarray.hh:534\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bt_\bd_\b:_\b:_\bm_\bd_\ba_\br_\br_\ba_\by_\b:_\b:_\bi_\bs_\b__\be_\bx_\bh_\ba_\bu_\bs_\bt_\bi_\bv_\be\n-constexpr bool is_exhaustive() const noexcept\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mdarray.hh:526\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bt_\bd_\b:_\b:_\bm_\bd_\ba_\br_\br_\ba_\by_\b:_\b:_\bp_\bo_\bi_\bn_\bt_\be_\br\n-decltype(Std::to_address(std::declval< container_type >().begin())) pointer\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mdarray.hh:93\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bt_\bd_\b:_\b:_\bm_\bd_\ba_\br_\br_\ba_\by_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b[_\b]\n-constexpr reference operator[](Index index)\n-Access specified element at position [i0] For a rank one mdarray, the operator\n-[i] is added to support...\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mdarray.hh:408\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bt_\bd_\b:_\b:_\bm_\bd_\ba_\br_\br_\ba_\by_\b:_\b:_\be_\bx_\bt_\be_\bn_\bt_\bs\n-constexpr const extents_type & extents() const noexcept\n-Number of elements in all dimensions of the array,.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mdarray.hh:468\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bt_\bd_\b:_\b:_\bm_\bd_\ba_\br_\br_\ba_\by_\b:_\b:_\bi_\bs_\b__\bs_\bt_\br_\bi_\bd_\be_\bd\n-constexpr bool is_strided() const noexcept\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mdarray.hh:527\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bt_\bd_\b:_\b:_\bm_\bd_\ba_\br_\br_\ba_\by_\b:_\b:_\bm_\bd_\ba_\br_\br_\ba_\by\n-constexpr mdarray(const mapping_type &m, const container_type &c)\n-Construct from layout mapping and the storage container.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mdarray.hh:188\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bt_\bd_\b:_\b:_\bm_\bd_\ba_\br_\br_\ba_\by_\b:_\b:_\bi_\bs_\b__\ba_\bl_\bw_\ba_\by_\bs_\b__\bu_\bn_\bi_\bq_\bu_\be\n-static constexpr bool is_always_unique() noexcept\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mdarray.hh:521\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bt_\bd_\b:_\b:_\bm_\bd_\ba_\br_\br_\ba_\by_\b:_\b:_\bm_\bd_\ba_\br_\br_\ba_\by\n-constexpr mdarray(const mapping_type &m, container_type &&c, const Alloc &a)\n-Construct from layout mapping, container and allocator.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mdarray.hh:296\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bt_\bd_\b:_\b:_\bm_\bd_\ba_\br_\br_\ba_\by_\b:_\b:_\bm_\bd_\ba_\br_\br_\ba_\by\n-constexpr mdarray(const E &e, container_type &&c)\n-Construct from extents and the storage container.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mdarray.hh:182\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bt_\bd_\b:_\b:_\bm_\bd_\ba_\br_\br_\ba_\by_\b:_\b:_\bc_\bo_\bn_\bt_\ba_\bi_\bn_\be_\br\n-constexpr const container_type & container() const noexcept\n-The underlying storage container.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mdarray.hh:474\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bt_\bd_\b:_\b:_\bm_\bd_\ba_\br_\br_\ba_\by_\b:_\b:_\bc_\bo_\bn_\bt_\ba_\bi_\bn_\be_\br_\b__\bs_\bi_\bz_\be\n-constexpr std::size_t container_size() const\n-Size of the underlying container.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mdarray.hh:510\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bt_\bd_\b:_\b:_\bm_\bd_\ba_\br_\br_\ba_\by_\b:_\b:_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be\n-typename extents_type::size_type size_type\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mdarray.hh:87\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bt_\bd_\b:_\b:_\bm_\bd_\ba_\br_\br_\ba_\by_\b:_\b:_\br_\ba_\bn_\bk\n-static constexpr rank_type rank() noexcept\n-Number of dimensions of the array.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mdarray.hh:489\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bt_\bd_\b:_\b:_\bm_\bd_\ba_\br_\br_\ba_\by_\b:_\b:_\be_\bm_\bp_\bt_\by\n-constexpr bool empty() const noexcept\n-Check whether the index space is empty.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mdarray.hh:513\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bt_\bd_\b:_\b:_\bm_\bd_\ba_\br_\br_\ba_\by_\b:_\b:_\bm_\bd_\ba_\br_\br_\ba_\by\n-constexpr mdarray(const extents_type &e, container_type &&c, const Alloc &a)\n-Construct from extents, container and allocator.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mdarray.hh:280\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bt_\bd_\b:_\b:_\bm_\bd_\ba_\br_\br_\ba_\by_\b:_\b:_\bm_\bd_\bs_\bp_\ba_\bn_\b__\bt_\by_\bp_\be\n-mdspan< element_type, extents_type, layout_type > mdspan_type\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mdarray.hh:90\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bt_\bd_\b:_\b:_\bm_\bd_\ba_\br_\br_\ba_\by_\b:_\b:_\bs_\bi_\bz_\be\n-constexpr size_type size() const noexcept\n-Size of the multi-dimensional index space.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mdarray.hh:501\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bt_\bd_\b:_\b:_\bm_\bd_\ba_\br_\br_\ba_\by_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b=_\b=\n-friend constexpr bool operator==(const mdarray &lhs, const mdarray &rhs)\n-noexcept\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mdarray.hh:553\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bt_\bd_\b:_\b:_\bm_\bd_\ba_\br_\br_\ba_\by_\b:_\b:_\bs_\bw_\ba_\bp\n-friend constexpr void swap(mdarray &x, mdarray &y) noexcept\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mdarray.hh:542\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bt_\bd_\b:_\b:_\bm_\bd_\ba_\br_\br_\ba_\by_\b:_\b:_\bm_\ba_\bp_\bp_\bi_\bn_\bg\n-constexpr const mapping_type & mapping() const noexcept\n-Index mapping of a layout policy.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mdarray.hh:471\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bt_\bd_\b:_\b:_\bm_\bd_\ba_\br_\br_\ba_\by_\b:_\b:_\be_\bl_\be_\bm_\be_\bn_\bt_\b__\bt_\by_\bp_\be\n-Element element_type\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mdarray.hh:78\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bt_\bd_\b:_\b:_\bm_\bd_\ba_\br_\br_\ba_\by_\b:_\b:_\bm_\bd_\ba_\br_\br_\ba_\by\n-constexpr mdarray(const mapping_type &m, const value_type &v, const Alloc &a)\n-Construct from layout mapping, initial value and allocator.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mdarray.hh:264\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bt_\bd_\b:_\b:_\bm_\bd_\ba_\br_\br_\ba_\by_\b:_\b:_\bm_\bd_\ba_\br_\br_\ba_\by\n-constexpr mdarray(const extents_type &e, const value_type &v, const Alloc &a)\n-Construct from extents, initial value and allocator.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mdarray.hh:257\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bt_\bd_\b:_\b:_\bm_\bd_\ba_\br_\br_\ba_\by_\b:_\b:_\bc_\bo_\bn_\bs_\bt_\b__\bp_\bo_\bi_\bn_\bt_\be_\br\n-decltype(Std::to_address(std::declval< container_type >().cbegin()))\n-const_pointer\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mdarray.hh:95\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bt_\bd_\b:_\b:_\bm_\bd_\ba_\br_\br_\ba_\by_\b:_\b:_\br_\be_\bf_\be_\br_\be_\bn_\bc_\be\n-typename container_type::reference reference\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mdarray.hh:94\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bt_\bd_\b:_\b:_\bm_\bd_\ba_\br_\br_\ba_\by_\b:_\b:_\bt_\bo_\b__\bm_\bd_\bs_\bp_\ba_\bn\n-constexpr mdspan< element_type, extents_type, layout_type, AccessorPolicy >\n-to_mdspan(const AccessorPolicy &a=AccessorPolicy{})\n-Conversion function to mdspan.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mdarray.hh:584\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bt_\bd_\b:_\b:_\bm_\bd_\ba_\br_\br_\ba_\by_\b:_\b:_\bv_\ba_\bl_\bu_\be_\b__\bt_\by_\bp_\be\n-element_type value_type\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mdarray.hh:83\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bt_\bd_\b:_\b:_\bm_\bd_\ba_\br_\br_\ba_\by_\b:_\b:_\bl_\ba_\by_\bo_\bu_\bt_\b__\bt_\by_\bp_\be\n-LayoutPolicy layout_type\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mdarray.hh:80\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bt_\bd_\b:_\b:_\bm_\bd_\ba_\br_\br_\ba_\by_\b:_\b:_\be_\bx_\bt_\br_\ba_\bc_\bt_\b__\bc_\bo_\bn_\bt_\ba_\bi_\bn_\be_\br\n-constexpr container_type && extract_container() &&noexcept\n-Move the container out of the mdarray.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mdarray.hh:482\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bt_\bd_\b:_\b:_\bm_\bd_\ba_\br_\br_\ba_\by_\b:_\b:_\bm_\bd_\ba_\br_\br_\ba_\by\n-constexpr mdarray(const extents_type &e, const container_type &c, const Alloc\n-&a)\n-Construct from extents, container and allocator.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mdarray.hh:272\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bt_\bd_\b:_\b:_\bm_\bd_\ba_\br_\br_\ba_\by_\b:_\b:_\br_\ba_\bn_\bk_\b__\bt_\by_\bp_\be\n-typename extents_type::rank_type rank_type\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mdarray.hh:88\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bt_\bd_\b:_\b:_\bm_\bd_\ba_\br_\br_\ba_\by_\b:_\b:_\br_\ba_\bn_\bk_\b__\bd_\by_\bn_\ba_\bm_\bi_\bc\n-static constexpr rank_type rank_dynamic() noexcept\n-Number of dimension with dynamic size.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mdarray.hh:492\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bt_\bd_\b:_\b:_\bm_\bd_\ba_\br_\br_\ba_\by_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b(_\b)\n-constexpr reference operator()(Indices... indices)\n-Access element at position (i0,i1,...)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mdarray.hh:363\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bt_\bd_\b:_\b:_\bm_\bd_\ba_\br_\br_\ba_\by_\b:_\b:_\bm_\bd_\ba_\br_\br_\ba_\by\n-constexpr mdarray(const extents_type &e)\n-Construct from the extents of the array.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mdarray.hh:138\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bt_\bd_\b:_\b:_\bm_\bd_\ba_\br_\br_\ba_\by_\b:_\b:_\bc_\bo_\bn_\bt_\ba_\bi_\bn_\be_\br_\b_\n-container_type container_\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mdarray.hh:600\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bt_\bd_\b:_\b:_\bm_\bd_\ba_\br_\br_\ba_\by_\b:_\b:_\bi_\bn_\bd_\be_\bx_\b__\bt_\by_\bp_\be\n-typename extents_type::index_type index_type\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mdarray.hh:86\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bt_\bd_\b:_\b:_\bm_\bd_\ba_\br_\br_\ba_\by_\b:_\b:_\bm_\bd_\ba_\br_\br_\ba_\by\n-constexpr mdarray(IndexTypes... exts)\n-Construct from the dynamic extents.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mdarray.hh:133\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bt_\bd_\b:_\b:_\bm_\bd_\ba_\br_\br_\ba_\by_\b:_\b:_\bi_\bs_\b__\ba_\bl_\bw_\ba_\by_\bs_\b__\bs_\bt_\br_\bi_\bd_\be_\bd\n-static constexpr bool is_always_strided() noexcept\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mdarray.hh:523\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bt_\bd_\b:_\b:_\bm_\bd_\bs_\bp_\ba_\bn\n-A multi-dimensional non-owning array view.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mdspan.hh:64\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bt_\bd_\b:_\b:_\bm_\bd_\bs_\bp_\ba_\bn_\b:_\b:_\be_\bx_\bt_\be_\bn_\bt\n-constexpr index_type extent(rank_type r) const noexcept\n-Number of elements in the r'th dimension of the tensor.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mdspan.hh:275\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bt_\bd_\b:_\b:_\bm_\bd_\bs_\bp_\ba_\bn_\b:_\b:_\bs_\bi_\bz_\be\n-constexpr size_type size() const noexcept\n-The number of elements accessible by this multi-dimensional span.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mdspan.hh:278\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bt_\bd_\b:_\b:_\bs_\bp_\ba_\bn\n-A contiguous sequence of elements with static or dynamic extent.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn span.hh:126\n+_\b1_\b0_\b2 static const _\bD_\be_\bb_\bu_\bg_\bL_\be_\bv_\be_\bl _\bV_\bE_\bR_\bB_\bO_\bS_\bE_\b__\bD_\bE_\bB_\bU_\bG_\b__\bL_\bE_\bV_\bE_\bL = 2;\n+103\n+_\b1_\b0_\b8 typedef _\bD_\be_\bb_\bu_\bg_\bS_\bt_\br_\be_\ba_\bm_\b<_\bV_\bE_\bR_\bB_\bO_\bS_\bE_\b__\bD_\bE_\bB_\bU_\bG_\b__\bL_\bE_\bV_\bE_\bL_\b,_\b _\bM_\bI_\bN_\bI_\bM_\bA_\bL_\b__\bD_\bE_\bB_\bU_\bG_\b__\bL_\bE_\bV_\bE_\bL_\b> _\bD_\bV_\be_\br_\bb_\bT_\by_\bp_\be;\n+109\n+_\b1_\b1_\b7 extern _\bD_\bV_\be_\br_\bb_\bT_\by_\bp_\be _\bd_\bv_\be_\br_\bb;\n+118\n+_\b1_\b2_\b3 static const _\bD_\be_\bb_\bu_\bg_\bL_\be_\bv_\be_\bl _\bI_\bN_\bF_\bO_\b__\bD_\bE_\bB_\bU_\bG_\b__\bL_\bE_\bV_\bE_\bL = 3;\n+124\n+_\b1_\b2_\b9 typedef _\bD_\be_\bb_\bu_\bg_\bS_\bt_\br_\be_\ba_\bm_\b<_\bI_\bN_\bF_\bO_\b__\bD_\bE_\bB_\bU_\bG_\b__\bL_\bE_\bV_\bE_\bL_\b,_\b _\bM_\bI_\bN_\bI_\bM_\bA_\bL_\b__\bD_\bE_\bB_\bU_\bG_\b__\bL_\bE_\bV_\bE_\bL_\b> _\bD_\bI_\bn_\bf_\bo_\bT_\by_\bp_\be;\n+130\n+_\b1_\b4_\b1 extern _\bD_\bI_\bn_\bf_\bo_\bT_\by_\bp_\be _\bd_\bi_\bn_\bf_\bo;\n+142\n+_\b1_\b4_\b7 static const _\bD_\be_\bb_\bu_\bg_\bL_\be_\bv_\be_\bl _\bW_\bA_\bR_\bN_\b__\bD_\bE_\bB_\bU_\bG_\b__\bL_\bE_\bV_\bE_\bL = 4;\n+148\n+_\b1_\b5_\b3 typedef _\bD_\be_\bb_\bu_\bg_\bS_\bt_\br_\be_\ba_\bm_\b<_\bW_\bA_\bR_\bN_\b__\bD_\bE_\bB_\bU_\bG_\b__\bL_\bE_\bV_\bE_\bL_\b,_\b _\bM_\bI_\bN_\bI_\bM_\bA_\bL_\b__\bD_\bE_\bB_\bU_\bG_\b__\bL_\bE_\bV_\bE_\bL_\b> _\bD_\bW_\ba_\br_\bn_\bT_\by_\bp_\be;\n+154\n+_\b1_\b6_\b2 extern _\bD_\bW_\ba_\br_\bn_\bT_\by_\bp_\be _\bd_\bw_\ba_\br_\bn;\n+163\n+_\b1_\b6_\b8 static const _\bD_\be_\bb_\bu_\bg_\bL_\be_\bv_\be_\bl _\bG_\bR_\bA_\bV_\bE_\b__\bD_\bE_\bB_\bU_\bG_\b__\bL_\bE_\bV_\bE_\bL = 5;\n+169\n+_\b1_\b7_\b1 typedef _\bD_\be_\bb_\bu_\bg_\bS_\bt_\br_\be_\ba_\bm_\b<_\bG_\bR_\bA_\bV_\bE_\b__\bD_\bE_\bB_\bU_\bG_\b__\bL_\bE_\bV_\bE_\bL_\b,_\b _\bM_\bI_\bN_\bI_\bM_\bA_\bL_\b__\bD_\bE_\bB_\bU_\bG_\b__\bL_\bE_\bV_\bE_\bL_\b> _\bD_\bG_\br_\ba_\bv_\be_\bT_\by_\bp_\be;\n+172\n+_\b1_\b8_\b0 extern _\bD_\bG_\br_\ba_\bv_\be_\bT_\by_\bp_\be _\bd_\bg_\br_\ba_\bv_\be;\n+181\n+_\b1_\b8_\b3 typedef _\bD_\be_\bb_\bu_\bg_\bS_\bt_\br_\be_\ba_\bm_\b<_\b1_\b> _\bD_\bE_\br_\br_\bT_\by_\bp_\be;\n+184\n+_\b1_\b9_\b6 extern _\bD_\bE_\br_\br_\bT_\by_\bp_\be _\bd_\be_\br_\br;\n+197\n+199}\n+200\n+201#endif\n+_\bd_\be_\bb_\bu_\bg_\bs_\bt_\br_\be_\ba_\bm_\b._\bh_\bh\n+Defines several output streams for messages of different importance.\n+_\bD_\bu_\bn_\be_\b:_\b:_\bD_\be_\bb_\bu_\bg_\bL_\be_\bv_\be_\bl\n+unsigned int DebugLevel\n+Type for debug levels.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn debugstream.hh:118\n+_\bD_\bu_\bn_\be_\b:_\b:_\bD_\bV_\bV_\be_\br_\bb_\bT_\by_\bp_\be\n+DebugStream< VERY_VERBOSE_DEBUG_LEVEL, MINIMAL_DEBUG_LEVEL > DVVerbType\n+Type of very verbose debug stream.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn stdstreams.hh:82\n+_\bD_\bu_\bn_\be_\b:_\b:_\bD_\bW_\ba_\br_\bn_\bT_\by_\bp_\be\n+DebugStream< WARN_DEBUG_LEVEL, MINIMAL_DEBUG_LEVEL > DWarnType\n+Type of debug stream with warn level.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn stdstreams.hh:153\n+_\bD_\bu_\bn_\be_\b:_\b:_\bd_\bv_\bv_\be_\br_\bb\n+DVVerbType dvverb(std::cout)\n+stream for very verbose output.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn stdstreams.hh:96\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\bI_\bN_\bI_\bM_\bA_\bL_\b__\bD_\bE_\bB_\bU_\bG_\b__\bL_\bE_\bV_\bE_\bL\n+static const DebugLevel MINIMAL_DEBUG_LEVEL\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn stdstreams.hh:70\n+_\bD_\bU_\bN_\bE_\b__\bM_\bI_\bN_\bI_\bM_\bA_\bL_\b__\bD_\bE_\bB_\bU_\bG_\b__\bL_\bE_\bV_\bE_\bL\n+#define DUNE_MINIMAL_DEBUG_LEVEL\n+The default minimum debug level.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn stdstreams.hh:68\n+_\bD_\bu_\bn_\be_\b:_\b:_\bV_\bE_\bR_\bY_\b__\bV_\bE_\bR_\bB_\bO_\bS_\bE_\b__\bD_\bE_\bB_\bU_\bG_\b__\bL_\bE_\bV_\bE_\bL\n+static const DebugLevel VERY_VERBOSE_DEBUG_LEVEL\n+The level of the very verbose debug stream.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn stdstreams.hh:76\n+_\bD_\bu_\bn_\be_\b:_\b:_\bd_\bw_\ba_\br_\bn\n+DWarnType dwarn(std::cerr)\n+Stream for warnings indicating problems.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn stdstreams.hh:162\n+_\bD_\bu_\bn_\be_\b:_\b:_\bG_\bR_\bA_\bV_\bE_\b__\bD_\bE_\bB_\bU_\bG_\b__\bL_\bE_\bV_\bE_\bL\n+static const DebugLevel GRAVE_DEBUG_LEVEL\n+The level of the debug stream for fatal errors.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn stdstreams.hh:168\n+_\bD_\bu_\bn_\be_\b:_\b:_\bD_\bV_\be_\br_\bb_\bT_\by_\bp_\be\n+DebugStream< VERBOSE_DEBUG_LEVEL, MINIMAL_DEBUG_LEVEL > DVerbType\n+Type of more verbose debug stream.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn stdstreams.hh:108\n+_\bD_\bu_\bn_\be_\b:_\b:_\bD_\bG_\br_\ba_\bv_\be_\bT_\by_\bp_\be\n+DebugStream< GRAVE_DEBUG_LEVEL, MINIMAL_DEBUG_LEVEL > DGraveType\n+Type of debug stream for fatal errors.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn stdstreams.hh:171\n+_\bD_\bu_\bn_\be_\b:_\b:_\bd_\bg_\br_\ba_\bv_\be\n+DGraveType dgrave(std::cerr)\n+Stream for warnings indicating fatal errors.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn stdstreams.hh:180\n+_\bD_\bu_\bn_\be_\b:_\b:_\bD_\bE_\br_\br_\bT_\by_\bp_\be\n+DebugStream< 1 > DErrType\n+The type of the stream used for error messages.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn stdstreams.hh:183\n+_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bN_\bF_\bO_\b__\bD_\bE_\bB_\bU_\bG_\b__\bL_\bE_\bV_\bE_\bL\n+static const DebugLevel INFO_DEBUG_LEVEL\n+The level of the informative debug stream.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn stdstreams.hh:123\n+_\bD_\bu_\bn_\be_\b:_\b:_\bD_\bI_\bn_\bf_\bo_\bT_\by_\bp_\be\n+DebugStream< INFO_DEBUG_LEVEL, MINIMAL_DEBUG_LEVEL > DInfoType\n+Type of debug stream with info level.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn stdstreams.hh:129\n+_\bD_\bu_\bn_\be_\b:_\b:_\bd_\bi_\bn_\bf_\bo\n+DInfoType dinfo(std::cout)\n+Stream for informative output.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn stdstreams.hh:141\n+_\bD_\bu_\bn_\be_\b:_\b:_\bd_\bv_\be_\br_\bb\n+DVerbType dverb(std::cout)\n+Singleton of verbose debug stream.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn stdstreams.hh:117\n+_\bD_\bu_\bn_\be_\b:_\b:_\bV_\bE_\bR_\bB_\bO_\bS_\bE_\b__\bD_\bE_\bB_\bU_\bG_\b__\bL_\bE_\bV_\bE_\bL\n+static const DebugLevel VERBOSE_DEBUG_LEVEL\n+The level of the verbose debug stream.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn stdstreams.hh:102\n+_\bD_\bu_\bn_\be_\b:_\b:_\bd_\be_\br_\br\n+DErrType derr(std::cerr)\n+Stream for error messages.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn stdstreams.hh:196\n+_\bD_\bu_\bn_\be_\b:_\b:_\bW_\bA_\bR_\bN_\b__\bD_\bE_\bB_\bU_\bG_\b__\bL_\bE_\bV_\bE_\bL\n+static const DebugLevel WARN_DEBUG_LEVEL\n+The level of the debug stream for warnings.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn stdstreams.hh:147\n+_\bD_\bu_\bn_\be\n+Dune namespace.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn alignedallocator.hh:13\n+_\bD_\bu_\bn_\be_\b:_\b:_\bD_\be_\bb_\bu_\bg_\bS_\bt_\br_\be_\ba_\bm\n+Generic class to implement debug output streams.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn debugstream.hh:192\n ===============================================================================\n Generated by\u00a0_\b[_\bd_\bo_\bx_\by_\bg_\be_\bn_\b] 1.9.8\n"}]}, {"source1": "./usr/share/doc/libdune-common-doc/doxygen/a00155.html", "source2": "./usr/share/doc/libdune-common-doc/doxygen/a00155.html", "unified_diff": "@@ -1,15 +1,15 @@\n \n \n \n \n \n \n \n-dune-common: mdspan.hh File Reference\n+dune-common: typetraits.hh File Reference\n \n \n \n \n \n \n \n@@ -65,78 +65,144 @@\n \n \n \n \n \n \n \n
    \n \n-
    mdspan.hh File Reference
    \n+
    typetraits.hh File Reference
    \n
    \n
    \n-
    #include <array>
    \n+\n+

    Traits for type conversions and type information. \n+More...

    \n+
    #include <complex>
    \n #include <type_traits>
    \n #include <utility>
    \n-#include <dune/common/indices.hh>
    \n-#include <dune/common/std/default_accessor.hh>
    \n-#include <dune/common/std/extents.hh>
    \n-#include <dune/common/std/layout_right.hh>
    \n-#include <dune/common/std/span.hh>
    \n+#include <vector>
    \n
    \n

    Go to the source code of this file.

    \n \n \n-\n-\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n \n

    \n Classes

    class  Dune::Std::mdspan< Element, Extents, LayoutPolicy, AccessorPolicy >
     A multi-dimensional non-owning array view. More...
    struct  Dune::Empty
     Just an empty class. More...
     
    struct  Dune::IsInteroperable< T1, T2 >
     Checks whether two types are interoperable. More...
     
    struct  Dune::EnableIfInterOperable< T1, T2, Type >
     Enable typedef if two types are interoperable. More...
     
    struct  Dune::AlwaysFalse< T >
     template which always yields a false value More...
     
    struct  Dune::AlwaysTrue< T >
     template which always yields a true value More...
     
    struct  Dune::IsCallable< F(Args...), R >
     Check if a type is callable with ()-operator and given arguments. More...
     
    struct  Dune::IsNumber< T >
     Whether this type acts as a scalar in the context of (hierarchically blocked) containers. More...
     
    struct  Dune::HasNaN< T >
     Whether this type has a value of NaN. More...
     
    struct  Dune::IsIndexable< T, I >
     Type trait to determine whether an instance of T has an operator[](I), i.e. whether it can be indexed with an index of type I. More...
     
    struct  Dune::IsIterable< T, typename >
     typetrait to check that a class has begin() and end() members More...
     
    struct  Dune::IsTuple< T >
     Check if T is a std::tuple<...> More...
     
    struct  Dune::IsTupleOrDerived< T >
     Check if T derived from a std::tuple<...> More...
     
    struct  Dune::IsIntegralConstant< T >
     Check if T is an std::integral_constant<I, i> More...
     
    struct  Dune::IsCompileTimeConstant< T >
     Check if T is an integral constant or any type derived from std::integral_constant. More...
     
    struct  Dune::SizeOf< T >
     Compute size of variadic type list. More...
     
    struct  Dune::AutonomousValueType< T >
     Type free of internal references that T can be converted to. More...
     
    struct  Dune::AutonomousValueType< T & >
     Specialization to remove lvalue references. More...
     
    struct  Dune::AutonomousValueType< T && >
     Specialization to remove rvalue references. More...
     
    struct  Dune::AutonomousValueType< const T >
     Specialization to remove const qualifiers. More...
     
    struct  Dune::AutonomousValueType< volatile T >
     Specialization to remove volatile qualifiers. More...
     
    struct  Dune::AutonomousValueType< std::vector< bool >::reference >
     Specialization for the proxies of vector<bool> More...
     
    struct  Dune::AutonomousValueType< volatile const T >
     Specialization to remove both const and volatile qualifiers. More...
     
    \n \n \n \n \n-\n-\n-\n+

    \n Namespaces

    namespace  Dune
     Dune namespace.
     
    namespace  Dune::Std
     Namespace for features backported from new C++ standards.
     
    \n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n

    \n+Typedefs

    template<class... Types>
    using Dune::void_t = typename Impl::voider< Types... >::type
     Is void for all valid input types. The workhorse for C++11 SFINAE-techniques.
     
    template<class Type >
    using Dune::field_t = typename FieldTraits< Type >::field_type
     Convenient access to FieldTraits<Type>::field_type.
     
    template<class Type >
    using Dune::real_t = typename FieldTraits< Type >::real_type
     Convenient access to FieldTraits<Type>::real_type.
     
    template<class T >
    using Dune::AutonomousValue = typename AutonomousValueType< T >::type
     Type free of internal references that T can be converted to.
     
    \n \n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n+\n+\n+\n+\n+\n+\n+\n+\n

    \n Functions

    template<class CArray , std::enable_if_t< std::is_array_v< CArray >, int > = 0, std::enable_if_t<(std::rank_v< CArray >==1), int > = 0>
     Dune::Std::mdspan (CArray &) -> mdspan< std::remove_all_extents_t< CArray >, Std::extents< std::size_t, std::extent_v< CArray, 0 > > >
     
    template<class Pointer , std::enable_if_t< std::is_pointer_v< std::remove_reference_t< Pointer > >, int > = 0>
     Dune::Std::mdspan (Pointer &&) -> mdspan< std::remove_pointer_t< std::remove_reference_t< Pointer > >, Std::extents< std::size_t > >
     
    template<class ElementType , class... II, std::enable_if_t<(... &&std::is_convertible_v< II, std::size_t >), int > = 0, std::enable_if_t<(sizeof...(II) > 0), int > = 0>
     Dune::Std::mdspan (ElementType *, II...) -> mdspan< ElementType, Std::dextents< std::size_t, sizeof...(II)> >
     
    template<class ElementType , class SizeType , std::size_t N>
     Dune::Std::mdspan (ElementType *, Std::span< SizeType, N > &) -> mdspan< ElementType, Std::dextents< std::size_t, N > >
     
    template<class ElementType , class SizeType , std::size_t N>
     Dune::Std::mdspan (ElementType *, const std::array< SizeType, N > &) -> mdspan< ElementType, Std::dextents< std::size_t, N > >
     
    template<class ElementType , class IndexType , std::size_t... exts>
     Dune::Std::mdspan (ElementType *, const Std::extents< IndexType, exts... > &) -> mdspan< ElementType, Std::extents< IndexType, exts... > >
     
    template<class ElementType , class Mapping , class Extents = typename Mapping::extents_type, class Layout = typename Mapping::layout_type>
     Dune::Std::mdspan (ElementType *, const Mapping &) -> mdspan< ElementType, Extents, Layout >
     
    template<class Mapping , class Accessor , class DataHandle = typename Accessor::data_handle_type, class Element = typename Accessor::element_type, class Extents = typename Mapping::extents_type, class Layout = typename Mapping::layout_type>
     Dune::Std::mdspan (const DataHandle &, const Mapping &, const Accessor &) -> mdspan< Element, Extents, Layout, Accessor >
     
    template<class T , T... t, std::size_t index>
    constexpr auto Dune::integerSequenceEntry (std::integer_sequence< T, t... >, std::integral_constant< std::size_t, index > i)
     Get entry of std::integer_sequence.
     
    template<class T >
    constexpr AutonomousValue< T > Dune::autoCopy (T &&v)
     Autonomous copy of an expression's value for use in auto type deduction.
     
    \n-
    \n+

    Detailed Description

    \n+

    Traits for type conversions and type information.

    \n+
    Author
    Markus Blatt, Christian Engwer
    \n+
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,72 +1,125 @@\n dune-common\u00a02.10\n Loading...\n Searching...\n No Matches\n * _\bd_\bu_\bn_\be\n * _\bc_\bo_\bm_\bm_\bo_\bn\n- * _\bs_\bt_\bd\n-_\bC_\bl_\ba_\bs_\bs_\be_\bs | _\bN_\ba_\bm_\be_\bs_\bp_\ba_\bc_\be_\bs | _\bF_\bu_\bn_\bc_\bt_\bi_\bo_\bn_\bs\n-mdspan.hh File Reference\n-#include \n+_\bC_\bl_\ba_\bs_\bs_\be_\bs | _\bN_\ba_\bm_\be_\bs_\bp_\ba_\bc_\be_\bs | _\bT_\by_\bp_\be_\bd_\be_\bf_\bs | _\bF_\bu_\bn_\bc_\bt_\bi_\bo_\bn_\bs\n+typetraits.hh File Reference\n+Traits for type conversions and type information. _\bM_\bo_\br_\be_\b._\b._\b.\n+#include \n #include \n #include \n-#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bi_\bn_\bd_\bi_\bc_\be_\bs_\b._\bh_\bh>\n-#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bs_\bt_\bd_\b/_\bd_\be_\bf_\ba_\bu_\bl_\bt_\b__\ba_\bc_\bc_\be_\bs_\bs_\bo_\br_\b._\bh_\bh>\n-#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bs_\bt_\bd_\b/_\be_\bx_\bt_\be_\bn_\bt_\bs_\b._\bh_\bh>\n-#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bs_\bt_\bd_\b/_\bl_\ba_\by_\bo_\bu_\bt_\b__\br_\bi_\bg_\bh_\bt_\b._\bh_\bh>\n-#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bs_\bt_\bd_\b/_\bs_\bp_\ba_\bn_\b._\bh_\bh>\n+#include \n _\bG_\bo_\b _\bt_\bo_\b _\bt_\bh_\be_\b _\bs_\bo_\bu_\br_\bc_\be_\b _\bc_\bo_\bd_\be_\b _\bo_\bf_\b _\bt_\bh_\bi_\bs_\b _\bf_\bi_\bl_\be_\b.\n C\bCl\bla\bas\bss\bse\bes\bs\n-class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bS_\bt_\bd_\b:_\b:_\bm_\bd_\bs_\bp_\ba_\bn_\b<_\b _\bE_\bl_\be_\bm_\be_\bn_\bt_\b,_\b _\bE_\bx_\bt_\be_\bn_\bt_\bs_\b,_\b _\bL_\ba_\by_\bo_\bu_\bt_\bP_\bo_\bl_\bi_\bc_\by_\b,_\b _\bA_\bc_\bc_\be_\bs_\bs_\bo_\br_\bP_\bo_\bl_\bi_\bc_\by_\b _\b>\n-\u00a0 A multi-dimensional non-owning array view. _\bM_\bo_\br_\be_\b._\b._\b.\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bE_\bm_\bp_\bt_\by\n+\u00a0 Just an empty class. _\bM_\bo_\br_\be_\b._\b._\b.\n+\u00a0\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bI_\bs_\bI_\bn_\bt_\be_\br_\bo_\bp_\be_\br_\ba_\bb_\bl_\be_\b<_\b _\bT_\b1_\b,_\b _\bT_\b2_\b _\b>\n+\u00a0 Checks whether two types are interoperable. _\bM_\bo_\br_\be_\b._\b._\b.\n+\u00a0\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bE_\bn_\ba_\bb_\bl_\be_\bI_\bf_\bI_\bn_\bt_\be_\br_\bO_\bp_\be_\br_\ba_\bb_\bl_\be_\b<_\b _\bT_\b1_\b,_\b _\bT_\b2_\b,_\b _\bT_\by_\bp_\be_\b _\b>\n+\u00a0 Enable typedef if two types are interoperable. _\bM_\bo_\br_\be_\b._\b._\b.\n+\u00a0\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bl_\bw_\ba_\by_\bs_\bF_\ba_\bl_\bs_\be_\b<_\b _\bT_\b _\b>\n+\u00a0 template which always yields a false value _\bM_\bo_\br_\be_\b._\b._\b.\n+\u00a0\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bl_\bw_\ba_\by_\bs_\bT_\br_\bu_\be_\b<_\b _\bT_\b _\b>\n+\u00a0 template which always yields a true value _\bM_\bo_\br_\be_\b._\b._\b.\n+\u00a0\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bI_\bs_\bC_\ba_\bl_\bl_\ba_\bb_\bl_\be_\b<_\b _\bF_\b(_\bA_\br_\bg_\bs_\b._\b._\b._\b)_\b,_\b _\bR_\b _\b>\n+\u00a0 Check if a type is callable with ()-operator and given arguments.\n+ _\bM_\bo_\br_\be_\b._\b._\b.\n+\u00a0\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bI_\bs_\bN_\bu_\bm_\bb_\be_\br_\b<_\b _\bT_\b _\b>\n+\u00a0 Whether this type acts as a scalar in the context of (hierarchically\n+ blocked) containers. _\bM_\bo_\br_\be_\b._\b._\b.\n+\u00a0\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bH_\ba_\bs_\bN_\ba_\bN_\b<_\b _\bT_\b _\b>\n+\u00a0 Whether this type has a value of NaN. _\bM_\bo_\br_\be_\b._\b._\b.\n+\u00a0\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bI_\bs_\bI_\bn_\bd_\be_\bx_\ba_\bb_\bl_\be_\b<_\b _\bT_\b,_\b _\bI_\b _\b>\n+\u00a0 Type trait to determine whether an instance of T has an operator[](I),\n+ i.e. whether it can be indexed with an index of type I. _\bM_\bo_\br_\be_\b._\b._\b.\n+\u00a0\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bI_\bs_\bI_\bt_\be_\br_\ba_\bb_\bl_\be_\b<_\b _\bT_\b,_\b _\bt_\by_\bp_\be_\bn_\ba_\bm_\be_\b _\b>\n+\u00a0 typetrait to check that a class has begin() and end() members _\bM_\bo_\br_\be_\b._\b._\b.\n+\u00a0\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bI_\bs_\bT_\bu_\bp_\bl_\be_\b<_\b _\bT_\b _\b>\n+\u00a0 Check if T is a std::tuple<...> _\bM_\bo_\br_\be_\b._\b._\b.\n+\u00a0\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bI_\bs_\bT_\bu_\bp_\bl_\be_\bO_\br_\bD_\be_\br_\bi_\bv_\be_\bd_\b<_\b _\bT_\b _\b>\n+\u00a0 Check if T derived from a std::tuple<...> _\bM_\bo_\br_\be_\b._\b._\b.\n+\u00a0\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bI_\bs_\bI_\bn_\bt_\be_\bg_\br_\ba_\bl_\bC_\bo_\bn_\bs_\bt_\ba_\bn_\bt_\b<_\b _\bT_\b _\b>\n+\u00a0 Check if T is an std::integral_constant _\bM_\bo_\br_\be_\b._\b._\b.\n+\u00a0\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bI_\bs_\bC_\bo_\bm_\bp_\bi_\bl_\be_\bT_\bi_\bm_\be_\bC_\bo_\bn_\bs_\bt_\ba_\bn_\bt_\b<_\b _\bT_\b _\b>\n+\u00a0 Check if T is an integral constant or any type derived from std::\n+ integral_constant. _\bM_\bo_\br_\be_\b._\b._\b.\n+\u00a0\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bS_\bi_\bz_\be_\bO_\bf_\b<_\b _\bT_\b _\b>\n+\u00a0 Compute size of variadic type list. _\bM_\bo_\br_\be_\b._\b._\b.\n+\u00a0\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bu_\bt_\bo_\bn_\bo_\bm_\bo_\bu_\bs_\bV_\ba_\bl_\bu_\be_\bT_\by_\bp_\be_\b<_\b _\bT_\b _\b>\n+\u00a0 Type free of internal references that T can be converted to. _\bM_\bo_\br_\be_\b._\b._\b.\n+\u00a0\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bu_\bt_\bo_\bn_\bo_\bm_\bo_\bu_\bs_\bV_\ba_\bl_\bu_\be_\bT_\by_\bp_\be_\b<_\b _\bT_\b _\b&_\b _\b>\n+\u00a0 Specialization to remove lvalue references. _\bM_\bo_\br_\be_\b._\b._\b.\n+\u00a0\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bu_\bt_\bo_\bn_\bo_\bm_\bo_\bu_\bs_\bV_\ba_\bl_\bu_\be_\bT_\by_\bp_\be_\b<_\b _\bT_\b _\b&_\b&_\b _\b>\n+\u00a0 Specialization to remove rvalue references. _\bM_\bo_\br_\be_\b._\b._\b.\n+\u00a0\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bu_\bt_\bo_\bn_\bo_\bm_\bo_\bu_\bs_\bV_\ba_\bl_\bu_\be_\bT_\by_\bp_\be_\b<_\b _\bc_\bo_\bn_\bs_\bt_\b _\bT_\b _\b>\n+\u00a0 Specialization to remove const qualifiers. _\bM_\bo_\br_\be_\b._\b._\b.\n+\u00a0\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bu_\bt_\bo_\bn_\bo_\bm_\bo_\bu_\bs_\bV_\ba_\bl_\bu_\be_\bT_\by_\bp_\be_\b<_\b _\bv_\bo_\bl_\ba_\bt_\bi_\bl_\be_\b _\bT_\b _\b>\n+\u00a0 Specialization to remove volatile qualifiers. _\bM_\bo_\br_\be_\b._\b._\b.\n+\u00a0\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bu_\bt_\bo_\bn_\bo_\bm_\bo_\bu_\bs_\bV_\ba_\bl_\bu_\be_\bT_\by_\bp_\be_\b<_\b _\bs_\bt_\bd_\b:_\b:_\bv_\be_\bc_\bt_\bo_\br_\b<_\b _\bb_\bo_\bo_\bl_\b _\b>_\b:_\b:_\br_\be_\bf_\be_\br_\be_\bn_\bc_\be_\b _\b>\n+\u00a0 Specialization for the proxies of vector _\bM_\bo_\br_\be_\b._\b._\b.\n+\u00a0\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bu_\bt_\bo_\bn_\bo_\bm_\bo_\bu_\bs_\bV_\ba_\bl_\bu_\be_\bT_\by_\bp_\be_\b<_\b _\bv_\bo_\bl_\ba_\bt_\bi_\bl_\be_\b _\bc_\bo_\bn_\bs_\bt_\b _\bT_\b _\b>\n+\u00a0 Specialization to remove both const and volatile qualifiers. _\bM_\bo_\br_\be_\b._\b._\b.\n \u00a0\n N\bNa\bam\bme\bes\bsp\bpa\bac\bce\bes\bs\n namespace \u00a0 _\bD_\bu_\bn_\be\n \u00a0 _\bD_\bu_\bn_\be namespace.\n \u00a0\n-namespace \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bS_\bt_\bd\n-\u00a0 Namespace for features backported from new C++ standards.\n+T\bTy\byp\bpe\bed\bde\bef\bfs\bs\n+template\n+using\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bv_\bo_\bi_\bd_\b__\bt = typename Impl::voider< Types... >::type\n+\u00a0 Is void for all valid input types. The workhorse for C++11 SFINAE-\n+ techniques.\n+\u00a0\n+template\n+using\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bf_\bi_\be_\bl_\bd_\b__\bt = typename _\bF_\bi_\be_\bl_\bd_\bT_\br_\ba_\bi_\bt_\bs< Type >::field_type\n+\u00a0 Convenient access to _\bF_\bi_\be_\bl_\bd_\bT_\br_\ba_\bi_\bt_\bs_\b<_\bT_\by_\bp_\be_\b>_\b:_\b:_\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be.\n+\u00a0\n+template\n+using\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\br_\be_\ba_\bl_\b__\bt = typename _\bF_\bi_\be_\bl_\bd_\bT_\br_\ba_\bi_\bt_\bs< Type >::real_type\n+\u00a0 Convenient access to _\bF_\bi_\be_\bl_\bd_\bT_\br_\ba_\bi_\bt_\bs_\b<_\bT_\by_\bp_\be_\b>_\b:_\b:_\br_\be_\ba_\bl_\b__\bt_\by_\bp_\be.\n+\u00a0\n+template\n+using\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bu_\bt_\bo_\bn_\bo_\bm_\bo_\bu_\bs_\bV_\ba_\bl_\bu_\be = typename _\bA_\bu_\bt_\bo_\bn_\bo_\bm_\bo_\bu_\bs_\bV_\ba_\bl_\bu_\be_\bT_\by_\bp_\be< T >::type\n+\u00a0 Type free of internal references that T can be converted to.\n \u00a0\n F\bFu\bun\bnc\bct\bti\bio\bon\bns\bs\n-template, int > = 0,\n-std::enable_if_t<(std::rank_v< CArray >==1), int > = 0>\n-\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bS_\bt_\bd_\b:_\b:_\bm_\bd_\bs_\bp_\ba_\bn (CArray &) -> _\bm_\bd_\bs_\bp_\ba_\bn< std::remove_all_extents_t< CArray >,\n- _\bS_\bt_\bd_\b:_\b:_\be_\bx_\bt_\be_\bn_\bt_\bs< std::size_t, std::extent_v< CArray, 0 > > >\n-\u00a0\n-template >, int > = 0>\n-\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bS_\bt_\bd_\b:_\b:_\bm_\bd_\bs_\bp_\ba_\bn (Pointer &&) -> _\bm_\bd_\bs_\bp_\ba_\bn< std::remove_pointer_t< std::\n- remove_reference_t< Pointer > >, _\bS_\bt_\bd_\b:_\b:_\be_\bx_\bt_\be_\bn_\bt_\bs< std::size_t > >\n-\u00a0\n-template), int > = 0, std::enable_if_t<(sizeof...\n-(II) > 0), int > = 0>\n-\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bS_\bt_\bd_\b:_\b:_\bm_\bd_\bs_\bp_\ba_\bn (ElementType *, II...) -> _\bm_\bd_\bs_\bp_\ba_\bn< ElementType, _\bS_\bt_\bd_\b:_\b:\n- _\bd_\be_\bx_\bt_\be_\bn_\bt_\bs< std::size_t, sizeof...(II)> >\n-\u00a0\n-template\n-\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bS_\bt_\bd_\b:_\b:_\bm_\bd_\bs_\bp_\ba_\bn (ElementType *, _\bS_\bt_\bd_\b:_\b:_\bs_\bp_\ba_\bn< SizeType, N > &) -> _\bm_\bd_\bs_\bp_\ba_\bn<\n- ElementType, _\bS_\bt_\bd_\b:_\b:_\bd_\be_\bx_\bt_\be_\bn_\bt_\bs< std::size_t, N > >\n-\u00a0\n-template\n-\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bS_\bt_\bd_\b:_\b:_\bm_\bd_\bs_\bp_\ba_\bn (ElementType *, const std::array< SizeType, N > &) -\n- > _\bm_\bd_\bs_\bp_\ba_\bn< ElementType, _\bS_\bt_\bd_\b:_\b:_\bd_\be_\bx_\bt_\be_\bn_\bt_\bs< std::size_t, N > >\n-\u00a0\n-template\n-\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bS_\bt_\bd_\b:_\b:_\bm_\bd_\bs_\bp_\ba_\bn (ElementType *, const _\bS_\bt_\bd_\b:_\b:_\be_\bx_\bt_\be_\bn_\bt_\bs< IndexType, exts... > &)\n- -> _\bm_\bd_\bs_\bp_\ba_\bn< ElementType, _\bS_\bt_\bd_\b:_\b:_\be_\bx_\bt_\be_\bn_\bt_\bs< IndexType, exts... > >\n-\u00a0\n-template\n-\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bS_\bt_\bd_\b:_\b:_\bm_\bd_\bs_\bp_\ba_\bn (ElementType *, const Mapping &) -> _\bm_\bd_\bs_\bp_\ba_\bn< ElementType,\n- Extents, Layout >\n-\u00a0\n-template\n-\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bS_\bt_\bd_\b:_\b:_\bm_\bd_\bs_\bp_\ba_\bn (const DataHandle &, const Mapping &, const Accessor &) -\n- > _\bm_\bd_\bs_\bp_\ba_\bn< Element, Extents, Layout, Accessor >\n-\u00a0\n+template\n+ constexpr auto\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bi_\bn_\bt_\be_\bg_\be_\br_\bS_\be_\bq_\bu_\be_\bn_\bc_\be_\bE_\bn_\bt_\br_\by (std::\n+ integer_sequence< T, t... >, std::\n+ integral_constant< std::size_t, index > i)\n+\u00a0 Get entry of std::integer_sequence.\n+\u00a0\n+template\n+constexpr _\bA_\bu_\bt_\bo_\bn_\bo_\bm_\bo_\bu_\bs_\bV_\ba_\bl_\bu_\be< T >\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\ba_\bu_\bt_\bo_\bC_\bo_\bp_\by (T &&v)\n+\u00a0 Autonomous copy of an expression's value for\n+ use in auto type deduction.\n+\u00a0\n+*\b**\b**\b**\b**\b* D\bDe\bet\bta\bai\bil\ble\bed\bd D\bDe\bes\bsc\bcr\bri\bip\bpt\bti\bio\bon\bn *\b**\b**\b**\b**\b*\n+Traits for type conversions and type information.\n+ Author\n+ Markus Blatt, Christian Engwer\n ===============================================================================\n Generated by\u00a0_\b[_\bd_\bo_\bx_\by_\bg_\be_\bn_\b] 1.9.8\n"}]}, {"source1": "./usr/share/doc/libdune-common-doc/doxygen/a00155_source.html", "source2": "./usr/share/doc/libdune-common-doc/doxygen/a00155_source.html", "unified_diff": "@@ -1,15 +1,15 @@\n \n \n \n \n \n \n \n-dune-common: mdspan.hh Source File\n+dune-common: typetraits.hh Source File\n \n \n \n \n \n \n \n@@ -70,395 +70,443 @@\n \n \n \n \n \n \n \n
    \n-
    mdspan.hh
    \n+
    typetraits.hh
    \n
    \n
    \n Go to the documentation of this file.
    1// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
    \n
    2// vi: set et ts=4 sw=2 sts=2:
    \n
    3// SPDX-FileCopyrightInfo: Copyright \u00a9 DUNE Project contributors, see file LICENSE.md in module root
    \n
    4// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception
    \n-
    5#ifndef DUNE_COMMON_STD_MDSPAN_HH
    \n-
    6#define DUNE_COMMON_STD_MDSPAN_HH
    \n+
    5#ifndef DUNE_TYPETRAITS_HH
    \n+
    6#define DUNE_TYPETRAITS_HH
    \n
    7
    \n-
    8#include <array>
    \n+
    8#include <complex>
    \n
    9#include <type_traits>
    \n
    10#include <utility>
    \n-
    11#if __has_include(<version>)
    \n-
    12 #include <version>
    \n-
    13#endif
    \n-
    14
    \n-\n-\n-\n-\n-\n-
    20
    \n-
    21namespace Dune::Std {
    \n-
    22
    \n-
    61template <class Element, class Extents, class LayoutPolicy = Std::layout_right,
    \n-
    62 class AccessorPolicy = Std::default_accessor<Element>>
    \n-
    \n-
    63class mdspan
    \n-
    64{
    \n-
    65 static_assert(std::is_object_v<Element>);
    \n-
    66 static_assert(!std::is_abstract_v<Element>);
    \n-
    67 static_assert(!std::is_array_v<Element>);
    \n-
    68 static_assert(std::is_same_v<Element, typename AccessorPolicy::element_type>);
    \n-
    69
    \n-
    70public:
    \n-
    71 using element_type = Element;
    \n-
    72 using extents_type = Extents;
    \n-
    73 using layout_type = LayoutPolicy;
    \n-
    74 using accessor_type = AccessorPolicy;
    \n-
    75
    \n-
    76 using value_type = std::remove_cv_t<Element>;
    \n-
    77 using mapping_type = typename layout_type::template mapping<extents_type>;
    \n-
    78 using index_type = typename extents_type::index_type;
    \n-
    79 using size_type = typename extents_type::size_type;
    \n-
    80 using rank_type = typename extents_type::rank_type;
    \n-
    81 using data_handle_type = typename accessor_type::data_handle_type;
    \n-
    82 using reference = typename accessor_type::reference;
    \n-
    83
    \n-
    84private:
    \n-
    85 // [mdspan.layout.reqmts]
    \n-
    86 static_assert(std::is_nothrow_move_constructible_v<mapping_type>);
    \n-
    87 static_assert(std::is_nothrow_move_assignable_v<mapping_type>);
    \n-
    88 static_assert(std::is_nothrow_swappable_v<mapping_type>);
    \n-
    89
    \n-
    90 // [mdspan.accessor.reqmts]
    \n-
    91 static_assert(std::is_nothrow_move_constructible_v<accessor_type>);
    \n-
    92 static_assert(std::is_nothrow_move_assignable_v<accessor_type>);
    \n-
    93 static_assert(std::is_nothrow_swappable_v<accessor_type>);
    \n-
    94
    \n-
    95public:
    \n-
    98
    \n-
    100 template <class E = extents_type, class D = data_handle_type, class M = mapping_type, class A = accessor_type,
    \n-
    101 std::enable_if_t<(E::rank_dynamic() > 0), int> = 0,
    \n-
    102 std::enable_if_t<std::is_default_constructible_v<D>, int> = 0,
    \n-
    103 std::enable_if_t<std::is_default_constructible_v<M>, int> = 0,
    \n-
    104 std::enable_if_t<std::is_default_constructible_v<A>, int> = 0>
    \n-
    \n-
    105 constexpr mdspan ()
    \n-
    106 : data_handle_{}
    \n-
    107 , mapping_{}
    \n-
    108 , accessor_{}
    \n-
    109 {}
    \n-
    \n-
    110
    \n-
    112 template <class... IndexTypes,
    \n-
    113 class E = extents_type, class M = mapping_type, class A = accessor_type,
    \n-
    114 std::enable_if_t<(sizeof...(IndexTypes) == E::rank() || sizeof...(IndexTypes) == E::rank_dynamic()), int> = 0,
    \n-
    115 std::enable_if_t<(... && std::is_convertible_v<IndexTypes, index_type>), int> = 0,
    \n-
    116 std::enable_if_t<(... && std::is_nothrow_constructible_v<index_type, IndexTypes>), int> = 0,
    \n-
    117 std::enable_if_t<std::is_constructible_v<M, E>, int> = 0,
    \n-
    118 std::enable_if_t<std::is_default_constructible_v<A>, int> = 0>
    \n-
    \n-
    119 explicit constexpr mdspan (data_handle_type p, IndexTypes... exts)
    \n-
    120 : mdspan(std::move(p), extents_type(index_type(std::move(exts))...))
    \n-
    121 {}
    \n-
    \n-
    122
    \n-
    124 template <class IndexType, std::size_t N,
    \n-
    125 std::enable_if_t<std::is_convertible_v<const IndexType&, index_type>, int> = 0,
    \n-
    126 std::enable_if_t<std::is_nothrow_constructible_v<index_type,const IndexType&>, int> = 0,
    \n-
    127 std::enable_if_t<(N == extents_type::rank_dynamic() || N == extents_type::rank()), int> = 0>
    \n-
    128 #if __cpp_conditional_explicit >= 201806L
    \n-
    129 explicit(N != extents_type::rank_dynamic())
    \n-
    130 #endif
    \n-
    \n-\n-
    132 : mdspan(std::move(p), extents_type(exts))
    \n-
    133 {}
    \n-
    \n-
    134
    \n-
    136 template <class IndexType, std::size_t N,
    \n-
    137 std::enable_if_t<std::is_convertible_v<IndexType, index_type>, int> = 0,
    \n-
    138 std::enable_if_t<(N == extents_type::rank_dynamic() || N == extents_type::rank()), int> = 0>
    \n-
    139 #if __cpp_conditional_explicit >= 201806L
    \n-
    140 explicit(N != extents_type::rank_dynamic())
    \n-
    141 #endif
    \n-
    \n-
    142 constexpr mdspan (data_handle_type p, const std::array<IndexType,N>& exts)
    \n-
    143 : mdspan(std::move(p), extents_type(exts))
    \n-
    144 {}
    \n-
    \n-
    145
    \n-
    147 template <class M = mapping_type,
    \n-
    148 std::enable_if_t<std::is_constructible_v<M, const extents_type&>, int> = 0>
    \n-
    \n-
    149 constexpr mdspan (data_handle_type p, const extents_type& e)
    \n-
    150 : mdspan(std::move(p), mapping_type(e))
    \n-
    151 {}
    \n-
    \n-
    152
    \n-
    154 template <class A = accessor_type,
    \n-
    155 std::enable_if_t<std::is_default_constructible_v<A>, int> = 0>
    \n-
    \n-
    156 constexpr mdspan (data_handle_type p, const mapping_type& m)
    \n-
    157 : mdspan(std::move(p), m, accessor_type{})
    \n-
    158 {}
    \n-
    \n-
    159
    \n-
    \n-
    161 constexpr mdspan (data_handle_type p, const mapping_type& m, const accessor_type& a)
    \n-
    162 : data_handle_(std::move(p))
    \n-
    163 , mapping_(m)
    \n-
    164 , accessor_(a)
    \n-
    165 {}
    \n-
    \n-
    166
    \n-
    167
    \n-
    169 template <class OtherElementType, class OtherExtends, class OtherLayoutPolicy, class OtherAccessor,
    \n-
    170 std::enable_if_t<std::is_constructible_v<mapping_type, const typename OtherElementType::template mapping<OtherExtends>&>, int> = 0,
    \n-
    171 std::enable_if_t<std::is_constructible_v<accessor_type, const OtherAccessor&>, int> = 0>
    \n-
    172 #if __cpp_conditional_explicit >= 201806L
    \n-
    173 explicit(!std::is_convertible_v<const typename OtherElementType::template mapping<OtherExtends>&, mapping_type>
    \n-
    174 || !std::is_convertible_v<const OtherAccessor&, accessor_type>)
    \n-
    175 #endif
    \n-
    \n-\n-\n-
    178 accessor_type(other.accessor()))
    \n-
    179 {}
    \n-
    \n-
    180
    \n-
    182
    \n-
    183
    \n-
    186
    \n-
    191 template <class... Indices,
    \n-
    192 std::enable_if_t<(sizeof...(Indices) == extents_type::rank()), int> = 0,
    \n-
    193 std::enable_if_t<(... && std::is_convertible_v<Indices, index_type>), int> = 0,
    \n-
    194 std::enable_if_t<(... && std::is_nothrow_constructible_v<index_type,Indices>), int> = 0>
    \n-
    \n-
    195 constexpr reference operator() (Indices... indices) const
    \n-
    196 {
    \n-
    197 return accessor_.access(data_handle_, mapping_(index_type(std::move(indices))...));
    \n-
    198 }
    \n-
    \n-
    199
    \n-
    200#if __cpp_multidimensional_subscript >= 202110L
    \n-
    201
    \n-
    203 template <class... Indices,
    \n-
    204 std::enable_if_t<(sizeof...(Indices) == extents_type::rank()), int> = 0,
    \n-
    205 std::enable_if_t<(... && std::is_convertible_v<Indices, index_type>), int> = 0,
    \n-
    206 std::enable_if_t<(... && std::is_nothrow_constructible_v<index_type,Indices>), int> = 0>
    \n-
    207 constexpr reference operator[] (Indices... indices) const
    \n-
    208 {
    \n-
    209 return accessor_.access(data_handle_, mapping_(index_type(std::move(indices))...));
    \n-
    210 }
    \n-
    211
    \n-
    212#else // __cpp_multidimensional_subscript
    \n-
    213
    \n-
    216 template <class Index, class E = extents_type,
    \n-
    217 std::enable_if_t<std::is_convertible_v<Index,index_type>, int> = 0,
    \n-
    218 std::enable_if_t<(E::rank() == 1), int> = 0>
    \n-
    \n-
    219 constexpr reference operator[] (Index index) const
    \n-
    220 {
    \n-
    221 return accessor_.access(data_handle_, mapping_(index_type(std::move(index))));
    \n-
    222 }
    \n-
    \n+
    11#include <vector>
    \n+
    12
    \n+
    13namespace Dune
    \n+
    14{
    \n+
    15
    \n+
    16 namespace Impl
    \n+
    17 {
    \n+
    19
    \n+
    23 template <class...>
    \n+
    24 struct voider
    \n+
    25 {
    \n+
    26 using type = void;
    \n+
    27 };
    \n+
    28 }
    \n+
    29
    \n+
    31
    \n+
    39 template <class... Types>
    \n+
    40 using void_t = typename Impl::voider<Types...>::type;
    \n+
    41
    \n+
    55 struct Empty {};
    \n+
    56
    \n+
    63 template<class T1, class T2>
    \n+
    \n+\n+
    65 {
    \n+
    70 constexpr static bool value = std::is_convertible<T1,T2>::value || std::is_convertible<T2,T1>::value;
    \n+
    71 };
    \n+
    \n+
    72
    \n+
    78 template<class T1, class T2, class Type>
    \n+
    \n+\n+
    80 : public std::enable_if<IsInteroperable<T1,T2>::value, Type>
    \n+
    81 {};
    \n+
    \n+
    82
    \n+
    100
    \n+
    116
    \n+
    123 template<typename T>
    \n+
    124 struct AlwaysFalse : public std::false_type {};
    \n+
    125
    \n+
    133 template<typename T>
    \n+
    134 struct AlwaysTrue : public std::true_type {};
    \n+
    135
    \n+
    161 template<typename D, typename R = void>
    \n+\n+
    163
    \n+
    168 template<typename R, typename F, typename... Args>
    \n+
    \n+
    169 struct IsCallable<F(Args...), R>
    \n+
    170 : public std::bool_constant<
    \n+
    171 std::is_invocable_r_v<R, F, Args...>
    \n+
    172 && !std::is_member_pointer_v<std::decay_t<F>>
    \n+
    173 > {};
    \n+
    \n+
    174
    \n+
    177
    \n+
    192 template <typename T>
    \n+
    \n+
    193 struct IsNumber
    \n+
    194 : public std::integral_constant<bool, std::is_arithmetic<T>::value> {
    \n+
    195 };
    \n+
    \n+
    196
    \n+
    197#ifndef DOXYGEN
    \n+
    198
    \n+
    199 template <typename T>
    \n+
    200 struct IsNumber<std::complex<T>>
    \n+
    201 : public std::integral_constant<bool, IsNumber<T>::value> {
    \n+
    202 };
    \n+
    203
    \n+
    204#endif // DOXYGEN
    \n+
    205
    \n+
    207
    \n+
    210 template <typename T>
    \n+
    \n+
    211 struct HasNaN
    \n+
    212 : public std::integral_constant<bool, std::is_floating_point<T>::value> {
    \n+
    213 };
    \n+
    \n+
    214
    \n+
    215#ifndef DOXYGEN
    \n+
    216
    \n+
    217 template <typename T>
    \n+
    218 struct HasNaN<std::complex<T>>
    \n+
    219 : public std::integral_constant<bool, std::is_floating_point<T>::value> {
    \n+
    220 };
    \n+
    221
    \n+
    222#endif // DOXYGEN
    \n
    223
    \n-
    224#endif // __cpp_multidimensional_subscript
    \n+
    224#ifndef DOXYGEN
    \n
    225
    \n-
    227 template <class Index,
    \n-
    228 std::enable_if_t<std::is_convertible_v<const Index&, index_type>, int> = 0,
    \n-
    229 std::enable_if_t<std::is_nothrow_constructible_v<index_type, const Index&>, int> = 0>
    \n-
    \n-
    230 constexpr reference operator[] (Std::span<Index,extents_type::rank()> indices) const
    \n-
    231 {
    \n-
    232 return unpackIntegerSequence([&](auto... ii) -> reference {
    \n-
    233 return accessor_.access(data_handle_, mapping_(index_type(indices[ii])...)); },
    \n-
    234 std::make_index_sequence<extents_type::rank()>{});
    \n-
    235 }
    \n-
    \n-
    236
    \n-
    238 template <class Index,
    \n-
    239 std::enable_if_t<std::is_convertible_v<const Index&, index_type>, int> = 0,
    \n-
    240 std::enable_if_t<std::is_nothrow_constructible_v<index_type, const Index&>, int> = 0>
    \n-
    \n-
    241 constexpr reference operator[] (const std::array<Index,extents_type::rank()>& indices) const
    \n-
    242 {
    \n-
    243 return std::apply([&](auto... ii) -> reference {
    \n-
    244 return accessor_.access(data_handle_, mapping_(index_type(ii)...)); }, indices);
    \n-
    245 }
    \n-
    \n-
    246
    \n-
    248
    \n-
    250 constexpr const extents_type& extents () const noexcept { return mapping_.extents(); }
    \n+
    226 namespace Impl {
    \n+
    227
    \n+
    228 template<typename T, typename I, typename = int>
    \n+
    229 struct IsIndexable
    \n+
    230 : public std::false_type
    \n+
    231 {};
    \n+
    232
    \n+
    233 template<typename T, typename I>
    \n+
    234 struct IsIndexable<T,I,typename std::enable_if<(sizeof(std::declval<T>()[std::declval<I>()]) > 0),int>::type>
    \n+
    235 : public std::true_type
    \n+
    236 {};
    \n+
    237
    \n+
    238 }
    \n+
    239
    \n+
    240#endif // DOXYGEN
    \n+
    241
    \n+
    243
    \n+
    247 template<typename T, typename I = std::size_t>
    \n+
    \n+\n+
    249 : public Impl::IsIndexable<T,I>
    \n+
    250 {};
    \n+
    \n
    251
    \n-
    253 constexpr const mapping_type& mapping () const noexcept { return mapping_; }
    \n-
    254
    \n-
    256 constexpr const accessor_type& accessor () const noexcept { return accessor_; }
    \n-
    257
    \n-
    259 constexpr const data_handle_type& data_handle () const noexcept { return data_handle_; };
    \n-
    260
    \n-
    261
    \n-
    264
    \n-
    266 static constexpr rank_type rank () noexcept { return extents_type::rank(); }
    \n-
    267
    \n-
    269 static constexpr rank_type rank_dynamic () noexcept { return extents_type::rank_dynamic(); }
    \n-
    270
    \n-
    272 static constexpr std::size_t static_extent (rank_type r) noexcept { return extents_type::static_extent(r); }
    \n-
    273
    \n-
    275 constexpr index_type extent (rank_type r) const noexcept { return extents().extent(r); }
    \n-
    276
    \n-
    \n-
    278 constexpr size_type size () const noexcept
    \n-
    279 {
    \n-
    280 size_type s = 1;
    \n-
    281 for (rank_type r = 0; r < rank(); ++r)
    \n-
    282 s *= extent(r);
    \n-
    283 return s;
    \n-
    284 }
    \n-
    \n-
    285
    \n-
    287 [[nodiscard]] constexpr bool empty () const noexcept { return size() == 0; }
    \n-
    288
    \n-
    290
    \n-
    291
    \n-
    293 static constexpr bool is_always_unique () { return mapping_type::is_always_unique(); }
    \n+
    252#ifndef DOXYGEN
    \n+
    253
    \n+
    254 namespace Impl {
    \n+
    255 // This function does nothing.
    \n+
    256 // By passing expressions to this function one can avoid
    \n+
    257 // "value computed is not used" warnings that may show up
    \n+
    258 // in a comma expression.
    \n+
    259 template<class...T>
    \n+
    260 void ignore(T&&... /*t*/)
    \n+
    261 {}
    \n+
    262 }
    \n+
    263
    \n+
    264#endif // DOXYGEN
    \n+
    265
    \n+
    269 // default version, gets picked if SFINAE fails
    \n+
    270 template<typename T, typename = void>
    \n+
    \n+\n+
    272 : public std::false_type
    \n+
    273 {};
    \n+
    \n+
    274
    \n+
    275#ifndef DOXYGEN
    \n+
    276 // version for types with begin() and end()
    \n+
    277 template<typename T>
    \n+
    278 struct IsIterable<T, decltype(Impl::ignore(
    \n+
    279 std::declval<T>().begin(),
    \n+
    280 std::declval<T>().end(),
    \n+
    281 std::declval<T>().begin() != std::declval<T>().end(),
    \n+
    282 decltype(std::declval<T>().begin()){std::declval<T>().end()},
    \n+
    283 ++(std::declval<std::add_lvalue_reference_t<decltype(std::declval<T>().begin())>>()),
    \n+
    284 *(std::declval<T>().begin())
    \n+
    285 ))>
    \n+
    286 : public std::true_type
    \n+
    287 {};
    \n+
    288#endif
    \n+
    289
    \n+
    290#ifndef DOXYGEN
    \n+
    291 // this is just a forward declaration
    \n+
    292 template <class> struct FieldTraits;
    \n+
    293#endif
    \n
    294
    \n-
    296 static constexpr bool is_always_exhaustive () { return mapping_type::is_always_exhaustive(); }
    \n-
    297
    \n-
    299 static constexpr bool is_always_strided () { return mapping_type::is_always_strided(); }
    \n-
    300
    \n-
    302 constexpr bool is_unique () const { return mapping_.is_unique(); }
    \n+
    296 template <class Type>
    \n+\n+
    298
    \n+
    300 template <class Type>
    \n+\n+
    302
    \n
    303
    \n-
    306 constexpr bool is_exhaustive () const { return mapping_.is_exhaustive(); }
    \n-
    307
    \n-
    313 constexpr bool is_strided () const { return mapping_.is_strided(); }
    \n-
    314
    \n-
    316 constexpr index_type stride (rank_type r) const { return mapping_.stride(r); }
    \n-
    317
    \n+
    304#ifndef DOXYGEN
    \n+
    305
    \n+
    306 // Implementation of IsTuple
    \n+
    307 namespace Impl {
    \n+
    308
    \n+
    309 template<class T>
    \n+
    310 struct IsTuple : public std::false_type
    \n+
    311 {};
    \n+
    312
    \n+
    313 template<class... T>
    \n+
    314 struct IsTuple<std::tuple<T...>> : public std::true_type
    \n+
    315 {};
    \n+
    316
    \n+
    317 } // namespace Impl
    \n
    318
    \n-
    \n-
    320 friend constexpr void swap (mdspan& x, mdspan& y) noexcept
    \n-
    321 {
    \n-
    322 using std::swap;
    \n-
    323 swap(x.data_handle_, y.data_handle_);
    \n-
    324 swap(x.mapping_, y.mapping_);
    \n-
    325 swap(x.accessor_, y.accessor_);
    \n-
    326 }
    \n-
    \n-
    327
    \n-
    328
    \n-
    329private:
    \n-
    330 data_handle_type data_handle_;
    \n-
    331 [[no_unique_address]] mapping_type mapping_;
    \n-
    332 [[no_unique_address]] accessor_type accessor_;
    \n-
    333};
    \n-
    \n-
    334
    \n-
    335// deduction guides
    \n-
    336// @{
    \n-
    337
    \n-
    338template <class CArray,
    \n-
    339 std::enable_if_t<std::is_array_v<CArray>, int> = 0,
    \n-
    340 std::enable_if_t<(std::rank_v<CArray> == 1), int> = 0>
    \n-
    341mdspan (CArray&)
    \n-\n-
    343
    \n-
    344template <class Pointer,
    \n-
    345 std::enable_if_t<std::is_pointer_v<std::remove_reference_t<Pointer>>, int> = 0>
    \n-
    346mdspan (Pointer&&)
    \n-\n+
    319#endif // DOXYGEN
    \n+
    320
    \n+
    326 template<class T>
    \n+
    \n+
    327 struct IsTuple :
    \n+
    328 public Impl::IsTuple<T>
    \n+
    329 {};
    \n+
    \n+
    330
    \n+
    331
    \n+
    332#ifndef DOXYGEN
    \n+
    333
    \n+
    334 // Implementation of IsTupleOrDerived
    \n+
    335 namespace Impl {
    \n+
    336
    \n+
    337 template<class... T, class Dummy>
    \n+
    338 std::true_type isTupleOrDerived(const std::tuple<T...>*, Dummy)
    \n+
    339 { return {}; }
    \n+
    340
    \n+
    341 template<class Dummy>
    \n+
    342 std::false_type isTupleOrDerived(const void*, Dummy)
    \n+
    343 { return {}; }
    \n+
    344
    \n+
    345 } // namespace Impl
    \n+
    346
    \n+
    347#endif // DOXYGEN
    \n
    348
    \n-
    349template <class ElementType, class... II,
    \n-
    350 std::enable_if_t<(... && std::is_convertible_v<II,std::size_t>), int> = 0,
    \n-
    351 std::enable_if_t<(sizeof...(II) > 0), int> = 0>
    \n-
    352mdspan (ElementType*, II...)
    \n-
    353 -> mdspan<ElementType, Std::dextents<std::size_t, sizeof...(II)>>;
    \n-
    354
    \n-
    355template <class ElementType, class SizeType, std::size_t N>
    \n-\n-\n+
    354 template<class T>
    \n+
    \n+\n+
    356 public decltype(Impl::isTupleOrDerived(std::declval<T*>(), true))
    \n+
    357 {};
    \n+
    \n
    358
    \n-
    359template <class ElementType, class SizeType, std::size_t N>
    \n-
    360mdspan (ElementType*, const std::array<SizeType,N>&)
    \n-\n-
    362
    \n-
    363template <class ElementType, class IndexType, std::size_t... exts>
    \n-\n-
    365 -> mdspan<ElementType, Std::extents<IndexType,exts...>>;
    \n-
    366
    \n-
    367template <class ElementType, class Mapping,
    \n-
    368 class Extents = typename Mapping::extents_type,
    \n-
    369 class Layout = typename Mapping::layout_type>
    \n-
    370mdspan (ElementType*, const Mapping&)
    \n-\n+
    359
    \n+
    360#ifndef DOXYGEN
    \n+
    361
    \n+
    362 // Implementation of is IsIntegralConstant
    \n+
    363 namespace Impl {
    \n+
    364
    \n+
    365 template<class T>
    \n+
    366 struct IsIntegralConstant : public std::false_type
    \n+
    367 {};
    \n+
    368
    \n+
    369 template<class T, T t>
    \n+
    370 struct IsIntegralConstant<std::integral_constant<T, t>> : public std::true_type
    \n+
    371 {};
    \n
    372
    \n-
    373template <class Mapping, class Accessor,
    \n-
    374 class DataHandle = typename Accessor::data_handle_type,
    \n-
    375 class Element = typename Accessor::element_type,
    \n-
    376 class Extents = typename Mapping::extents_type,
    \n-
    377 class Layout = typename Mapping::layout_type>
    \n-
    378mdspan (const DataHandle&, const Mapping&, const Accessor&)
    \n-\n-
    380
    \n-
    381// @}
    \n-
    382
    \n-
    383} // end namespace Dune::Std
    \n-
    384
    \n-
    385#endif // DUNE_COMMON_STD_MDSPAN_HH
    \n-\n-\n-\n-\n-\n-
    decltype(auto) constexpr unpackIntegerSequence(F &&f, std::integer_sequence< I, i... > sequence)
    Unpack an std::integer_sequence<I,i...> to std::integral_constant<I,i>...
    Definition indices.hh:124
    \n-
    typename Impl::DExtentsImpl< IndexType, std::make_integer_sequence< std::size_t, R > >::type dextents
    Alias of extents of given rank R and purely dynamic extents. See [mdspan.extents.dextents].
    Definition extents.hh:259
    \n+
    373 } // namespace Impl
    \n+
    374
    \n+
    375#endif // DOXYGEN
    \n+
    376
    \n+
    382 template<class T>
    \n+
    \n+
    383 struct IsIntegralConstant : public Impl::IsIntegralConstant<std::decay_t<T>>
    \n+
    384 {};
    \n+
    \n+
    385
    \n+
    386
    \n+
    387#ifndef DOXYGEN
    \n+
    388
    \n+
    389 namespace Impl {
    \n+
    390
    \n+\n+
    392 {
    \n+
    393 template <class T, T value>
    \n+
    394 static std::true_type check(std::integral_constant<T,value>);
    \n+
    395 static std::false_type check(...);
    \n+
    396 };
    \n+
    397
    \n+
    398 } // namespace Impl
    \n+
    399
    \n+
    400#endif // DOXYGEN
    \n+
    401
    \n+
    408 template<class T>
    \n+
    \n+\n+
    410 : public decltype(Impl::IsCompileTimeConstant::check(std::declval<T>()))
    \n+
    411 {};
    \n+
    \n+
    412
    \n+
    413
    \n+
    414
    \n+
    430 template<typename... T>
    \n+
    \n+
    431 struct
    \n+
    432 [[deprecated("This class is deprecated and will be removed after Dune 2.10. Use sizeof...(T) instead.")]]
    \n+
    433 SizeOf
    \n+
    434 : public std::integral_constant<std::size_t,sizeof...(T)>
    \n+
    435 {};
    \n+
    \n+
    436
    \n+
    437
    \n+
    438#ifndef DOXYGEN
    \n+
    439
    \n+
    440 namespace Impl {
    \n+
    441
    \n+
    442 template<class T, T...>
    \n+
    443 struct IntegerSequenceHelper;
    \n+
    444
    \n+
    445 // Helper struct to compute the i-th entry of a std::integer_sequence
    \n+
    446 //
    \n+
    447 // This could also be implemented using std::get<index>(std::make_tuple(t...)).
    \n+
    448 // However, the gcc-6 implementation of std::make_tuple increases the instantiation
    \n+
    449 // depth by 15 levels for each argument, such that the maximal instantiation depth
    \n+
    450 // is easily hit, especially with clang where it is set to 256.
    \n+
    451 template<class T, T head, T... tail>
    \n+
    452 struct IntegerSequenceHelper<T, head, tail...>
    \n+
    453 {
    \n+
    454
    \n+
    455 // get first entry
    \n+
    456 static constexpr auto get(std::integral_constant<std::size_t, 0>)
    \n+
    457 {
    \n+
    458 return std::integral_constant<T, head>();
    \n+
    459 }
    \n+
    460
    \n+
    461 // call get with first entry cut off and decremented index
    \n+
    462 template<std::size_t index,
    \n+
    463 std::enable_if_t<(index > 0) and (index < sizeof...(tail)+1), int> = 0>
    \n+
    464 static constexpr auto get(std::integral_constant<std::size_t, index>)
    \n+
    465 {
    \n+
    466 return IntegerSequenceHelper<T, tail...>::get(std::integral_constant<std::size_t, index-1>());
    \n+
    467 }
    \n+
    468
    \n+
    469 // use static assertion if index exceeds size
    \n+
    470 template<std::size_t index,
    \n+
    471 std::enable_if_t<(index >= sizeof...(tail)+1), int> = 0>
    \n+
    472 static constexpr auto get(std::integral_constant<std::size_t, index>)
    \n+
    473 {
    \n+
    474 static_assert(index < sizeof...(tail)+1, "index used in IntegerSequenceEntry exceed size");
    \n+
    475 }
    \n+
    476 };
    \n+
    477
    \n+
    478 } // end namespace Impl
    \n+
    479
    \n+
    480#endif // DOXYGEN
    \n+
    481
    \n+
    482
    \n+
    491 template<class T, T... t, std::size_t index>
    \n+
    \n+
    492 constexpr auto integerSequenceEntry(std::integer_sequence<T, t...> /*seq*/, std::integral_constant<std::size_t, index> i)
    \n+
    493 {
    \n+
    494 static_assert(index < sizeof...(t), "index used in IntegerSequenceEntry exceed size");
    \n+
    495 return Impl::IntegerSequenceHelper<T, t...>::get(i);
    \n+
    496 }
    \n+
    \n+
    497
    \n+
    498
    \n+
    505 template<class IntegerSequence, std::size_t index>
    \n+\n+
    507
    \n+
    508#ifndef DOXYGEN
    \n+
    509
    \n+
    510 template<class T, T... t, std::size_t i>
    \n+
    511 struct IntegerSequenceEntry<std::integer_sequence<T, t...>, i>
    \n+
    512 : public decltype(Impl::IntegerSequenceHelper<T, t...>::get(std::integral_constant<std::size_t, i>()))
    \n+
    513 {};
    \n+
    514
    \n+
    515#endif // DOXYGEN
    \n+
    516
    \n+
    530 template<class T>
    \n+
    531 struct AutonomousValueType { using type = T; };
    \n+
    532
    \n+
    534 template<class T>
    \n+\n+
    536
    \n+
    538 template<class T>
    \n+\n+
    540
    \n+
    542 template<class T>
    \n+\n+
    544
    \n+
    546 template<class T>
    \n+
    547 struct AutonomousValueType<volatile T> : AutonomousValueType<T> {};
    \n+
    548
    \n+
    550 template<>
    \n+
    \n+
    551 struct AutonomousValueType<std::vector<bool>::reference>
    \n+
    552 {
    \n+
    553 using type = bool;
    \n+
    554 };
    \n+
    \n+
    555
    \n+
    557 template<class T>
    \n+
    558 struct AutonomousValueType<volatile const T> : AutonomousValueType<T> {};
    \n+
    559
    \n+
    587 template<class T>
    \n+\n+
    589
    \n+
    671 template<class T>
    \n+
    \n+\n+
    673 {
    \n+
    674 return v;
    \n+
    675 }
    \n+
    \n+
    676
    \n+
    678}
    \n+
    679#endif
    \n+
    constexpr auto integerSequenceEntry(std::integer_sequence< T, t... >, std::integral_constant< std::size_t, index > i)
    Get entry of std::integer_sequence.
    Definition typetraits.hh:492
    \n+
    typename FieldTraits< Type >::real_type real_t
    Convenient access to FieldTraits<Type>::real_type.
    Definition typetraits.hh:301
    \n+
    constexpr AutonomousValue< T > autoCopy(T &&v)
    Autonomous copy of an expression's value for use in auto type deduction.
    Definition typetraits.hh:672
    \n+
    typename AutonomousValueType< T >::type AutonomousValue
    Type free of internal references that T can be converted to.
    Definition typetraits.hh:588
    \n+
    typename Impl::voider< Types... >::type void_t
    Is void for all valid input types. The workhorse for C++11 SFINAE-techniques.
    Definition typetraits.hh:40
    \n+
    typename FieldTraits< Type >::field_type field_t
    Convenient access to FieldTraits<Type>::field_type.
    Definition typetraits.hh:297
    \n
    STL namespace.
    \n-
    Namespace for features backported from new C++ standards.
    Definition default_accessor.hh:10
    \n-
    Multidimensional index space with dynamic and static extents.
    Definition extents.hh:54
    \n-
    A multi-dimensional non-owning array view.
    Definition mdspan.hh:64
    \n-
    typename accessor_type::reference reference
    Definition mdspan.hh:82
    \n-
    Element element_type
    Definition mdspan.hh:71
    \n-
    constexpr mdspan(data_handle_type p, const mapping_type &m, const accessor_type &a)
    Construct from the pointer to the data of the tensor, an index mapping, and an accessor.
    Definition mdspan.hh:161
    \n-
    Extents extents_type
    Definition mdspan.hh:72
    \n-
    static constexpr rank_type rank_dynamic() noexcept
    Number of dimensions of the tensor.
    Definition mdspan.hh:269
    \n-
    static constexpr bool is_always_unique()
    Return true only if for every i and j where (i != j || ...) => mapping(i...) != mapping(j....
    Definition mdspan.hh:293
    \n-
    typename extents_type::index_type index_type
    Definition mdspan.hh:78
    \n-
    LayoutPolicy layout_type
    Definition mdspan.hh:73
    \n-
    constexpr bool is_strided() const
    Return true only if for every rank index r of extents there exists an integer sr such that,...
    Definition mdspan.hh:313
    \n-
    constexpr mdspan(data_handle_type p, const mapping_type &m)
    Construct from the pointer to the data of the tensor and an index mapping.
    Definition mdspan.hh:156
    \n-
    typename extents_type::rank_type rank_type
    Definition mdspan.hh:80
    \n-
    constexpr mdspan(data_handle_type p, const extents_type &e)
    Construct from the pointer to the data of the tensor and its extents.
    Definition mdspan.hh:149
    \n-
    std::remove_cv_t< Element > value_type
    Definition mdspan.hh:76
    \n-
    static constexpr bool is_always_exhaustive()
    Return true only if for all k in the range [0, mapping.required_span_size() ) there exists an i such ...
    Definition mdspan.hh:296
    \n-
    constexpr reference operator[](Index index) const
    Access specified element at position [i0] For a rank one mdspan, the operator[i] is added to support ...
    Definition mdspan.hh:219
    \n-
    constexpr const extents_type & extents() const noexcept
    Number of elements in all dimensions of the tensor,.
    Definition mdspan.hh:250
    \n-
    constexpr index_type extent(rank_type r) const noexcept
    Number of elements in the r'th dimension of the tensor.
    Definition mdspan.hh:275
    \n-
    friend constexpr void swap(mdspan &x, mdspan &y) noexcept
    Overloads the std::swap algorithm for std::mdspan. Exchanges the state of x with that of y.
    Definition mdspan.hh:320
    \n-
    static constexpr bool is_always_strided()
    Return true only if for every rank index r of extents there exists an integer sr such that,...
    Definition mdspan.hh:299
    \n-
    constexpr size_type size() const noexcept
    The number of elements accessible by this multi-dimensional span.
    Definition mdspan.hh:278
    \n-
    typename accessor_type::data_handle_type data_handle_type
    Definition mdspan.hh:81
    \n-
    constexpr bool empty() const noexcept
    Checks if the size of the index space is zero.
    Definition mdspan.hh:287
    \n-
    constexpr const accessor_type & accessor() const noexcept
    The accessor policy object.
    Definition mdspan.hh:256
    \n-
    AccessorPolicy accessor_type
    Definition mdspan.hh:74
    \n-
    constexpr bool is_exhaustive() const
    Return true only if for all k in the range [0, mapping.required_span_size() ) there exists an i such ...
    Definition mdspan.hh:306
    \n-
    static constexpr rank_type rank() noexcept
    Number of dimensions of the tensor.
    Definition mdspan.hh:266
    \n-
    static constexpr std::size_t static_extent(rank_type r) noexcept
    Number of elements in the r'th dimension of the tensor.
    Definition mdspan.hh:272
    \n-
    constexpr const mapping_type & mapping() const noexcept
    Index mapping of a layout policy.
    Definition mdspan.hh:253
    \n-
    constexpr const data_handle_type & data_handle() const noexcept
    The pointer to the underlying flat sequence.
    Definition mdspan.hh:259
    \n-
    constexpr index_type stride(rank_type r) const
    The stride along the specified dimension.
    Definition mdspan.hh:316
    \n-
    constexpr bool is_unique() const
    Return true only if for every i and j where (i != j || ...) => mapping(i...) != mapping(j....
    Definition mdspan.hh:302
    \n-
    constexpr mdspan()
    Default constructor value-initializes all members.
    Definition mdspan.hh:105
    \n-
    typename extents_type::size_type size_type
    Definition mdspan.hh:79
    \n-
    typename layout_type::template mapping< extents_type > mapping_type
    Definition mdspan.hh:77
    \n-
    A contiguous sequence of elements with static or dynamic extent.
    Definition span.hh:126
    \n+
    Dune namespace.
    Definition alignedallocator.hh:13
    \n+
    constexpr std::integer_sequence< T, II... > tail(std::integer_sequence< T, I0, II... >)
    For a sequence [head,tail...) return the tail sequence.
    Definition integersequence.hh:58
    \n+
    constexpr std::integral_constant< T, I0 > head(std::integer_sequence< T, I0, II... >)
    For a sequence [head,tail...) return the single head element.
    Definition integersequence.hh:53
    \n+
    constexpr auto get(std::integer_sequence< T, II... >, std::integral_constant< std::size_t, pos >={})
    Return the entry at position pos of the given sequence.
    Definition integersequence.hh:22
    \n+
    Whether this type acts as a scalar in the context of (hierarchically blocked) containers.
    Definition typetraits.hh:194
    \n+
    T field_type
    export the type representing the field
    Definition ftraits.hh:28
    \n+
    T real_type
    export the type representing the real type of the field
    Definition ftraits.hh:30
    \n+
    Just an empty class.
    Definition typetraits.hh:55
    \n+
    Checks whether two types are interoperable.
    Definition typetraits.hh:65
    \n+
    static constexpr bool value
    True if either a conversion from T1 to T2 or vice versa exists.
    Definition typetraits.hh:70
    \n+
    Enable typedef if two types are interoperable.
    Definition typetraits.hh:81
    \n+
    template which always yields a false value
    Definition typetraits.hh:124
    \n+
    template which always yields a true value
    Definition typetraits.hh:134
    \n+
    Check if a type is callable with ()-operator and given arguments.
    Definition typetraits.hh:162
    \n+
    Whether this type has a value of NaN.
    Definition typetraits.hh:212
    \n+
    Type trait to determine whether an instance of T has an operator[](I), i.e. whether it can be indexed...
    Definition typetraits.hh:250
    \n+
    typetrait to check that a class has begin() and end() members
    Definition typetraits.hh:273
    \n+
    Check if T is a std::tuple<...>
    Definition typetraits.hh:329
    \n+
    Check if T derived from a std::tuple<...>
    Definition typetraits.hh:357
    \n+
    Check if T is an std::integral_constant<I, i>
    Definition typetraits.hh:384
    \n+
    Check if T is an integral constant or any type derived from std::integral_constant.
    Definition typetraits.hh:411
    \n+
    Compute size of variadic type list.
    Definition typetraits.hh:435
    \n+
    Get entry of std::integer_sequence.
    Definition typetraits.hh:506
    \n+
    Type free of internal references that T can be converted to.
    Definition typetraits.hh:531
    \n+
    T type
    Definition typetraits.hh:531
    \n+\n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,522 +1,501 @@\n dune-common\u00a02.10\n Loading...\n Searching...\n No Matches\n * _\bd_\bu_\bn_\be\n * _\bc_\bo_\bm_\bm_\bo_\bn\n- * _\bs_\bt_\bd\n-mdspan.hh\n+typetraits.hh\n _\bG_\bo_\b _\bt_\bo_\b _\bt_\bh_\be_\b _\bd_\bo_\bc_\bu_\bm_\be_\bn_\bt_\ba_\bt_\bi_\bo_\bn_\b _\bo_\bf_\b _\bt_\bh_\bi_\bs_\b _\bf_\bi_\bl_\be_\b.\n 1// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-\n 2// vi: set et ts=4 sw=2 sts=2:\n 3// SPDX-FileCopyrightInfo: Copyright \u00c2\u00a9 DUNE Project contributors, see file\n LICENSE.md in module root\n 4// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception\n-5#ifndef DUNE_COMMON_STD_MDSPAN_HH\n-6#define DUNE_COMMON_STD_MDSPAN_HH\n+5#ifndef DUNE_TYPETRAITS_HH\n+6#define DUNE_TYPETRAITS_HH\n 7\n-8#include \n+8#include \n 9#include \n 10#include \n-11#if __has_include()\n-12 #include \n-13#endif\n-14\n-15#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bi_\bn_\bd_\bi_\bc_\be_\bs_\b._\bh_\bh>\n-16#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bs_\bt_\bd_\b/_\bd_\be_\bf_\ba_\bu_\bl_\bt_\b__\ba_\bc_\bc_\be_\bs_\bs_\bo_\br_\b._\bh_\bh>\n-17#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bs_\bt_\bd_\b/_\be_\bx_\bt_\be_\bn_\bt_\bs_\b._\bh_\bh>\n-18#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bs_\bt_\bd_\b/_\bl_\ba_\by_\bo_\bu_\bt_\b__\br_\bi_\bg_\bh_\bt_\b._\bh_\bh>\n-19#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bs_\bt_\bd_\b/_\bs_\bp_\ba_\bn_\b._\bh_\bh>\n-20\n-21namespace _\bD_\bu_\bn_\be_\b:_\b:_\bS_\bt_\bd {\n-22\n-61template >\n-_\b6_\b3class _\bm_\bd_\bs_\bp_\ba_\bn\n-64{\n-65 static_assert(std::is_object_v);\n-66 static_assert(!std::is_abstract_v);\n-67 static_assert(!std::is_array_v);\n-68 static_assert(std::is_same_v);\n-69\n-70public:\n-_\b7_\b1 using _\be_\bl_\be_\bm_\be_\bn_\bt_\b__\bt_\by_\bp_\be = Element;\n-_\b7_\b2 using _\be_\bx_\bt_\be_\bn_\bt_\bs_\b__\bt_\by_\bp_\be = Extents;\n-_\b7_\b3 using _\bl_\ba_\by_\bo_\bu_\bt_\b__\bt_\by_\bp_\be = LayoutPolicy;\n-_\b7_\b4 using _\ba_\bc_\bc_\be_\bs_\bs_\bo_\br_\b__\bt_\by_\bp_\be = AccessorPolicy;\n-75\n-_\b7_\b6 using _\bv_\ba_\bl_\bu_\be_\b__\bt_\by_\bp_\be = std::remove_cv_t;\n-_\b7_\b7 using _\bm_\ba_\bp_\bp_\bi_\bn_\bg_\b__\bt_\by_\bp_\be = typename layout_type::template mapping;\n-_\b7_\b8 using _\bi_\bn_\bd_\be_\bx_\b__\bt_\by_\bp_\be = typename extents_type::index_type;\n-_\b7_\b9 using _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be = typename extents_type::size_type;\n-_\b8_\b0 using _\br_\ba_\bn_\bk_\b__\bt_\by_\bp_\be = typename extents_type::rank_type;\n-_\b8_\b1 using _\bd_\ba_\bt_\ba_\b__\bh_\ba_\bn_\bd_\bl_\be_\b__\bt_\by_\bp_\be = typename accessor_type::data_handle_type;\n-_\b8_\b2 using _\br_\be_\bf_\be_\br_\be_\bn_\bc_\be = typename accessor_type::reference;\n-83\n-84private:\n-85 // [mdspan.layout.reqmts]\n-86 static_assert(std::is_nothrow_move_constructible_v);\n-87 static_assert(std::is_nothrow_move_assignable_v);\n-88 static_assert(std::is_nothrow_swappable_v);\n-89\n-90 // [mdspan.accessor.reqmts]\n-91 static_assert(std::is_nothrow_move_constructible_v);\n-92 static_assert(std::is_nothrow_move_assignable_v);\n-93 static_assert(std::is_nothrow_swappable_v);\n-94\n-95public:\n-98\n-100 template 0), int> = 0,\n-102 std::enable_if_t, int> = 0,\n-103 std::enable_if_t, int> = 0,\n-104 std::enable_if_t, int> = 0>\n-_\b1_\b0_\b5 constexpr _\bm_\bd_\bs_\bp_\ba_\bn ()\n-106 : data_handle_{}\n-107 , mapping_{}\n-108 , accessor_{}\n-109 {}\n-110\n-112 template = 0,\n-115 std::enable_if_t<(... && std::is_convertible_v),\n-int> = 0,\n-116 std::enable_if_t<(... && std::is_nothrow_constructible_v), int> = 0,\n-117 std::enable_if_t, int> = 0,\n-118 std::enable_if_t, int> = 0>\n-_\b1_\b1_\b9 explicit constexpr _\bm_\bd_\bs_\bp_\ba_\bn (_\bd_\ba_\bt_\ba_\b__\bh_\ba_\bn_\bd_\bl_\be_\b__\bt_\by_\bp_\be p, IndexTypes... exts)\n-120 : _\bm_\bd_\bs_\bp_\ba_\bn(std::move(p), _\be_\bx_\bt_\be_\bn_\bt_\bs_\b__\bt_\by_\bp_\be(_\bi_\bn_\bd_\be_\bx_\b__\bt_\by_\bp_\be(std::move(exts))...))\n-121 {}\n-122\n-124 template , int>\n-= 0,\n-126 std::enable_if_t, int> = 0,\n-127 std::enable_if_t<(N == extents_type::rank_dynamic() || N == extents_type::\n-rank()), int> = 0>\n-128 #if __cpp_conditional_explicit >= 201806L\n-129 explicit(N != extents_type::rank_dynamic())\n-130 #endif\n-_\b1_\b3_\b1 constexpr _\bm_\bd_\bs_\bp_\ba_\bn (_\bd_\ba_\bt_\ba_\b__\bh_\ba_\bn_\bd_\bl_\be_\b__\bt_\by_\bp_\be p, _\bS_\bt_\bd_\b:_\b:_\bs_\bp_\ba_\bn_\b<_\bI_\bn_\bd_\be_\bx_\bT_\by_\bp_\be_\b,_\bN_\b> exts)\n-132 : _\bm_\bd_\bs_\bp_\ba_\bn(std::move(p), _\be_\bx_\bt_\be_\bn_\bt_\bs_\b__\bt_\by_\bp_\be(exts))\n-133 {}\n-134\n-136 template , int> = 0,\n-138 std::enable_if_t<(N == extents_type::rank_dynamic() || N == extents_type::\n-rank()), int> = 0>\n-139 #if __cpp_conditional_explicit >= 201806L\n-140 explicit(N != extents_type::rank_dynamic())\n-141 #endif\n-_\b1_\b4_\b2 constexpr _\bm_\bd_\bs_\bp_\ba_\bn (_\bd_\ba_\bt_\ba_\b__\bh_\ba_\bn_\bd_\bl_\be_\b__\bt_\by_\bp_\be p, const std::array& exts)\n-143 : _\bm_\bd_\bs_\bp_\ba_\bn(std::move(p), _\be_\bx_\bt_\be_\bn_\bt_\bs_\b__\bt_\by_\bp_\be(exts))\n-144 {}\n-145\n-147 template , int> = 0>\n-_\b1_\b4_\b9 constexpr _\bm_\bd_\bs_\bp_\ba_\bn (_\bd_\ba_\bt_\ba_\b__\bh_\ba_\bn_\bd_\bl_\be_\b__\bt_\by_\bp_\be p, const _\be_\bx_\bt_\be_\bn_\bt_\bs_\b__\bt_\by_\bp_\be& e)\n-150 : _\bm_\bd_\bs_\bp_\ba_\bn(_\bs_\bt_\bd::move(p), _\bm_\ba_\bp_\bp_\bi_\bn_\bg_\b__\bt_\by_\bp_\be(e))\n-151 {}\n-152\n-154 template , int> = 0>\n-_\b1_\b5_\b6 constexpr _\bm_\bd_\bs_\bp_\ba_\bn (_\bd_\ba_\bt_\ba_\b__\bh_\ba_\bn_\bd_\bl_\be_\b__\bt_\by_\bp_\be p, const _\bm_\ba_\bp_\bp_\bi_\bn_\bg_\b__\bt_\by_\bp_\be& m)\n-157 : _\bm_\bd_\bs_\bp_\ba_\bn(_\bs_\bt_\bd::move(p), m, _\ba_\bc_\bc_\be_\bs_\bs_\bo_\br_\b__\bt_\by_\bp_\be{})\n-158 {}\n-159\n-_\b1_\b6_\b1 constexpr _\bm_\bd_\bs_\bp_\ba_\bn (_\bd_\ba_\bt_\ba_\b__\bh_\ba_\bn_\bd_\bl_\be_\b__\bt_\by_\bp_\be p, const _\bm_\ba_\bp_\bp_\bi_\bn_\bg_\b__\bt_\by_\bp_\be& m, const\n-_\ba_\bc_\bc_\be_\bs_\bs_\bo_\br_\b__\bt_\by_\bp_\be& a)\n-162 : data_handle_(_\bs_\bt_\bd::move(p))\n-163 , mapping_(m)\n-164 , accessor_(a)\n-165 {}\n-166\n-167\n-169 template &>, int> = 0,\n-171 std::enable_if_t, int> = 0>\n-172 #if __cpp_conditional_explicit >= 201806L\n-173 explicit(!std::is_convertible_v&, _\bm_\ba_\bp_\bp_\bi_\bn_\bg_\b__\bt_\by_\bp_\be>\n-174 || !std::is_convertible_v)\n-175 #endif\n-_\b1_\b7_\b6 constexpr _\bm_\bd_\bs_\bp_\ba_\bn (const\n-_\bm_\bd_\bs_\bp_\ba_\bn_\b<_\bO_\bt_\bh_\be_\br_\bE_\bl_\be_\bm_\be_\bn_\bt_\bT_\by_\bp_\be_\b,_\bO_\bt_\bh_\be_\br_\bE_\bx_\bt_\be_\bn_\bd_\bs_\b,_\bO_\bt_\bh_\be_\br_\bL_\ba_\by_\bo_\bu_\bt_\bP_\bo_\bl_\bi_\bc_\by_\b,_\bO_\bt_\bh_\be_\br_\bA_\bc_\bc_\be_\bs_\bs_\bo_\br_\b>& other)\n-noexcept\n-177 : _\bm_\bd_\bs_\bp_\ba_\bn(_\bd_\ba_\bt_\ba_\b__\bh_\ba_\bn_\bd_\bl_\be_\b__\bt_\by_\bp_\be(other._\bd_\ba_\bt_\ba_\b__\bh_\ba_\bn_\bd_\bl_\be()), _\bm_\ba_\bp_\bp_\bi_\bn_\bg_\b__\bt_\by_\bp_\be(other._\bm_\ba_\bp_\bp_\bi_\bn_\bg\n-()),\n-178 _\ba_\bc_\bc_\be_\bs_\bs_\bo_\br_\b__\bt_\by_\bp_\be(other._\ba_\bc_\bc_\be_\bs_\bs_\bo_\br()))\n-179 {}\n-180\n-182\n-183\n-186\n-191 template = 0,\n-193 std::enable_if_t<(... && std::is_convertible_v), int>\n-= 0,\n-194 std::enable_if_t<(... && std::\n-is_nothrow_constructible_v), int> = 0>\n-_\b1_\b9_\b5 constexpr _\br_\be_\bf_\be_\br_\be_\bn_\bc_\be operator() (Indices... indices) const\n-196 {\n-197 return accessor_.access(data_handle_, mapping_(_\bi_\bn_\bd_\be_\bx_\b__\bt_\by_\bp_\be(std::move\n-(indices))...));\n-198 }\n-199\n-200#if __cpp_multidimensional_subscript >= 202110L\n-201\n-203 template = 0,\n-205 std::enable_if_t<(... && std::is_convertible_v), int>\n-= 0,\n-206 std::enable_if_t<(... && std::\n-is_nothrow_constructible_v), int> = 0>\n-207 constexpr _\br_\be_\bf_\be_\br_\be_\bn_\bc_\be operator[] (Indices... indices) const\n-208 {\n-209 return accessor_.access(data_handle_, mapping_(_\bi_\bn_\bd_\be_\bx_\b__\bt_\by_\bp_\be(std::move\n-(indices))...));\n-210 }\n-211\n-212#else // __cpp_multidimensional_subscript\n-213\n-216 template , int> = 0,\n-218 std::enable_if_t<(E::rank() == 1), int> = 0>\n-_\b2_\b1_\b9 constexpr _\br_\be_\bf_\be_\br_\be_\bn_\bc_\be operator[] (Index index) const\n-220 {\n-221 return accessor_.access(data_handle_, mapping_(_\bi_\bn_\bd_\be_\bx_\b__\bt_\by_\bp_\be(std::move\n-(index))));\n-222 }\n+11#include \n+12\n+13namespace _\bD_\bu_\bn_\be\n+14{\n+15\n+16 namespace Impl\n+17 {\n+19\n+23 template \n+24 struct voider\n+25 {\n+26 using type = void;\n+27 };\n+28 }\n+29\n+31\n+39 template \n+_\b4_\b0 using _\bv_\bo_\bi_\bd_\b__\bt = typename Impl::voider::type;\n+41\n+_\b5_\b5 struct _\bE_\bm_\bp_\bt_\by {};\n+56\n+63 template\n+_\b6_\b4 struct _\bI_\bs_\bI_\bn_\bt_\be_\br_\bo_\bp_\be_\br_\ba_\bb_\bl_\be\n+65 {\n+_\b7_\b0 constexpr static bool _\bv_\ba_\bl_\bu_\be = std::is_convertible::value || std::\n+is_convertible::value;\n+71 };\n+72\n+78 template\n+_\b7_\b9 struct _\bE_\bn_\ba_\bb_\bl_\be_\bI_\bf_\bI_\bn_\bt_\be_\br_\bO_\bp_\be_\br_\ba_\bb_\bl_\be\n+80 : public std::enable_if::value, Type>\n+81 {};\n+82\n+100\n+116\n+123 template\n+_\b1_\b2_\b4 struct _\bA_\bl_\bw_\ba_\by_\bs_\bF_\ba_\bl_\bs_\be : public std::false_type {};\n+125\n+133 template\n+_\b1_\b3_\b4 struct _\bA_\bl_\bw_\ba_\by_\bs_\bT_\br_\bu_\be : public std::true_type {};\n+135\n+161 template\n+_\b1_\b6_\b2 struct _\bI_\bs_\bC_\ba_\bl_\bl_\ba_\bb_\bl_\be;\n+163\n+168 template\n+_\b1_\b6_\b9 struct _\bI_\bs_\bC_\ba_\bl_\bl_\ba_\bb_\bl_\be\n+170 : public std::bool_constant<\n+171 std::is_invocable_r_v\n+172 && !std::is_member_pointer_v>\n+173 > {};\n+174\n+177\n+192 template \n+_\b1_\b9_\b3 struct _\bI_\bs_\bN_\bu_\bm_\bb_\be_\br\n+194 : public std::integral_constant::value> {\n+195 };\n+196\n+197#ifndef DOXYGEN\n+198\n+199 template \n+200 struct _\bI_\bs_\bN_\bu_\bm_\bb_\be_\br<_\bs_\bt_\bd::complex>\n+201 : public std::integral_constant::value> {\n+202 };\n+203\n+204#endif // DOXYGEN\n+205\n+207\n+210 template \n+_\b2_\b1_\b1 struct _\bH_\ba_\bs_\bN_\ba_\bN\n+212 : public std::integral_constant::value> {\n+213 };\n+214\n+215#ifndef DOXYGEN\n+216\n+217 template \n+218 struct _\bH_\ba_\bs_\bN_\ba_\bN<_\bs_\bt_\bd::complex>\n+219 : public std::integral_constant::value> {\n+220 };\n+221\n+222#endif // DOXYGEN\n 223\n-224#endif // __cpp_multidimensional_subscript\n+224#ifndef DOXYGEN\n 225\n-227 template , int> = 0,\n-229 std::enable_if_t,\n-int> = 0>\n-_\b2_\b3_\b0 constexpr _\br_\be_\bf_\be_\br_\be_\bn_\bc_\be _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b[_\b]_\b (_\bS_\bt_\bd_\b:_\b:_\bs_\bp_\ba_\bn\n-indices) const\n-231 {\n-232 return _\bu_\bn_\bp_\ba_\bc_\bk_\bI_\bn_\bt_\be_\bg_\be_\br_\bS_\be_\bq_\bu_\be_\bn_\bc_\be([&](auto... ii) -> _\br_\be_\bf_\be_\br_\be_\bn_\bc_\be {\n-233 return accessor_.access(data_handle_, mapping_(_\bi_\bn_\bd_\be_\bx_\b__\bt_\by_\bp_\be(indices\n-[ii])...)); },\n-234 std::make_index_sequence{});\n-235 }\n-236\n-238 template , int> = 0,\n-240 std::enable_if_t,\n-int> = 0>\n-_\b2_\b4_\b1 constexpr _\br_\be_\bf_\be_\br_\be_\bn_\bc_\be _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b[_\b]_\b (const std::array& indices) const\n-242 {\n-243 return std::apply([&](auto... ii) -> _\br_\be_\bf_\be_\br_\be_\bn_\bc_\be {\n-244 return accessor_.access(data_handle_, mapping_(_\bi_\bn_\bd_\be_\bx_\b__\bt_\by_\bp_\be(ii)...)); },\n-indices);\n-245 }\n-246\n-248\n-_\b2_\b5_\b0 constexpr const _\be_\bx_\bt_\be_\bn_\bt_\bs_\b__\bt_\by_\bp_\be& _\be_\bx_\bt_\be_\bn_\bt_\bs () const noexcept { return\n-mapping_.extents(); }\n+226 namespace Impl {\n+227\n+228 template\n+229 struct IsIndexable\n+230 : public std::false_type\n+231 {};\n+232\n+233 template\n+234 struct IsIndexable()\n+[std::declval()]) > 0),int>::type>\n+235 : public std::true_type\n+236 {};\n+237\n+238 }\n+239\n+240#endif // DOXYGEN\n+241\n+243\n+247 template\n+_\b2_\b4_\b8 struct _\bI_\bs_\bI_\bn_\bd_\be_\bx_\ba_\bb_\bl_\be\n+249 : public Impl::IsIndexable\n+250 {};\n 251\n-_\b2_\b5_\b3 constexpr const _\bm_\ba_\bp_\bp_\bi_\bn_\bg_\b__\bt_\by_\bp_\be& _\bm_\ba_\bp_\bp_\bi_\bn_\bg () const noexcept { return mapping_;\n-}\n-254\n-_\b2_\b5_\b6 constexpr const _\ba_\bc_\bc_\be_\bs_\bs_\bo_\br_\b__\bt_\by_\bp_\be& _\ba_\bc_\bc_\be_\bs_\bs_\bo_\br () const noexcept { return\n-accessor_; }\n-257\n-_\b2_\b5_\b9 constexpr const _\bd_\ba_\bt_\ba_\b__\bh_\ba_\bn_\bd_\bl_\be_\b__\bt_\by_\bp_\be& _\bd_\ba_\bt_\ba_\b__\bh_\ba_\bn_\bd_\bl_\be () const noexcept { return\n-data_handle_; };\n-260\n-261\n-264\n-_\b2_\b6_\b6 static constexpr _\br_\ba_\bn_\bk_\b__\bt_\by_\bp_\be _\br_\ba_\bn_\bk () noexcept { return extents_type::rank();\n-}\n-267\n-_\b2_\b6_\b9 static constexpr _\br_\ba_\bn_\bk_\b__\bt_\by_\bp_\be _\br_\ba_\bn_\bk_\b__\bd_\by_\bn_\ba_\bm_\bi_\bc () noexcept { return extents_type::\n-rank_dynamic(); }\n-270\n-_\b2_\b7_\b2 static constexpr std::size_t _\bs_\bt_\ba_\bt_\bi_\bc_\b__\be_\bx_\bt_\be_\bn_\bt (_\br_\ba_\bn_\bk_\b__\bt_\by_\bp_\be r) noexcept { return\n-extents_type::static_extent(r); }\n-273\n-_\b2_\b7_\b5 constexpr _\bi_\bn_\bd_\be_\bx_\b__\bt_\by_\bp_\be _\be_\bx_\bt_\be_\bn_\bt (_\br_\ba_\bn_\bk_\b__\bt_\by_\bp_\be r) const noexcept { return _\be_\bx_\bt_\be_\bn_\bt_\bs\n-().extent(r); }\n-276\n-_\b2_\b7_\b8 constexpr _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be _\bs_\bi_\bz_\be () const noexcept\n-279 {\n-280 _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be s = 1;\n-281 for (_\br_\ba_\bn_\bk_\b__\bt_\by_\bp_\be r = 0; r < _\br_\ba_\bn_\bk(); ++r)\n-282 s *= _\be_\bx_\bt_\be_\bn_\bt(r);\n-283 return s;\n-284 }\n-285\n-_\b2_\b8_\b7 [[nodiscard]] constexpr bool _\be_\bm_\bp_\bt_\by () const noexcept { return _\bs_\bi_\bz_\be() == 0;\n-}\n-288\n-290\n-291\n-_\b2_\b9_\b3 static constexpr bool _\bi_\bs_\b__\ba_\bl_\bw_\ba_\by_\bs_\b__\bu_\bn_\bi_\bq_\bu_\be () { return mapping_type::\n-is_always_unique(); }\n+252#ifndef DOXYGEN\n+253\n+254 namespace Impl {\n+255 // This function does nothing.\n+256 // By passing expressions to this function one can avoid\n+257 // \"value computed is not used\" warnings that may show up\n+258 // in a comma expression.\n+259 template\n+260 void ignore(T&&... /*t*/)\n+261 {}\n+262 }\n+263\n+264#endif // DOXYGEN\n+265\n+269 // default version, gets picked if SFINAE fails\n+270 template\n+_\b2_\b7_\b1 struct _\bI_\bs_\bI_\bt_\be_\br_\ba_\bb_\bl_\be\n+272 : public std::false_type\n+273 {};\n+274\n+275#ifndef DOXYGEN\n+276 // version for types with begin() and end()\n+277 template\n+278 struct _\bI_\bs_\bI_\bt_\be_\br_\ba_\bb_\bl_\be().begin(),\n+280 std::declval().end(),\n+281 std::declval().begin() != std::declval().end(),\n+282 decltype(std::declval().begin()){std::declval().end()},\n+283 ++(std::declval\n+().begin())>>()),\n+284 *(std::declval().begin())\n+285 ))>\n+286 : public std::true_type\n+287 {};\n+288#endif\n+289\n+290#ifndef DOXYGEN\n+291 // this is just a forward declaration\n+292 template struct FieldTraits;\n+293#endif\n 294\n-_\b2_\b9_\b6 static constexpr bool _\bi_\bs_\b__\ba_\bl_\bw_\ba_\by_\bs_\b__\be_\bx_\bh_\ba_\bu_\bs_\bt_\bi_\bv_\be () { return mapping_type::\n-is_always_exhaustive(); }\n-297\n-_\b2_\b9_\b9 static constexpr bool _\bi_\bs_\b__\ba_\bl_\bw_\ba_\by_\bs_\b__\bs_\bt_\br_\bi_\bd_\be_\bd () { return mapping_type::\n-is_always_strided(); }\n-300\n-_\b3_\b0_\b2 constexpr bool _\bi_\bs_\b__\bu_\bn_\bi_\bq_\bu_\be () const { return mapping_.is_unique(); }\n+296 template \n+_\b2_\b9_\b7 using _\bf_\bi_\be_\bl_\bd_\b__\bt = typename _\bF_\bi_\be_\bl_\bd_\bT_\br_\ba_\bi_\bt_\bs_\b<_\bT_\by_\bp_\be_\b>_\b:_\b:_\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be;\n+298\n+300 template \n+_\b3_\b0_\b1 using _\br_\be_\ba_\bl_\b__\bt = typename _\bF_\bi_\be_\bl_\bd_\bT_\br_\ba_\bi_\bt_\bs_\b<_\bT_\by_\bp_\be_\b>_\b:_\b:_\br_\be_\ba_\bl_\b__\bt_\by_\bp_\be;\n+302\n 303\n-_\b3_\b0_\b6 constexpr bool _\bi_\bs_\b__\be_\bx_\bh_\ba_\bu_\bs_\bt_\bi_\bv_\be () const { return mapping_.is_exhaustive(); }\n-307\n-_\b3_\b1_\b3 constexpr bool _\bi_\bs_\b__\bs_\bt_\br_\bi_\bd_\be_\bd () const { return mapping_.is_strided(); }\n-314\n-_\b3_\b1_\b6 constexpr _\bi_\bn_\bd_\be_\bx_\b__\bt_\by_\bp_\be _\bs_\bt_\br_\bi_\bd_\be (_\br_\ba_\bn_\bk_\b__\bt_\by_\bp_\be r) const { return mapping_.stride\n-(r); }\n-317\n+304#ifndef DOXYGEN\n+305\n+306 // Implementation of IsTuple\n+307 namespace Impl {\n+308\n+309 template\n+310 struct _\bI_\bs_\bT_\bu_\bp_\bl_\be : public std::false_type\n+311 {};\n+312\n+313 template\n+314 struct _\bI_\bs_\bT_\bu_\bp_\bl_\be<_\bs_\bt_\bd::tuple> : public std::true_type\n+315 {};\n+316\n+317 } // namespace Impl\n 318\n-_\b3_\b2_\b0 friend constexpr void _\bs_\bw_\ba_\bp (_\bm_\bd_\bs_\bp_\ba_\bn& x, _\bm_\bd_\bs_\bp_\ba_\bn& y) noexcept\n-321 {\n-322 using std::swap;\n-323 _\bs_\bw_\ba_\bp(x.data_handle_, y.data_handle_);\n-324 _\bs_\bw_\ba_\bp(x.mapping_, y.mapping_);\n-325 _\bs_\bw_\ba_\bp(x.accessor_, y.accessor_);\n-326 }\n-327\n-328\n-329private:\n-330 _\bd_\ba_\bt_\ba_\b__\bh_\ba_\bn_\bd_\bl_\be_\b__\bt_\by_\bp_\be data_handle_;\n-331 [[no_unique_address]] _\bm_\ba_\bp_\bp_\bi_\bn_\bg_\b__\bt_\by_\bp_\be mapping_;\n-332 [[no_unique_address]] _\ba_\bc_\bc_\be_\bs_\bs_\bo_\br_\b__\bt_\by_\bp_\be accessor_;\n-333};\n-334\n-335// deduction guides\n-336// @{\n-337\n-338template , int> = 0,\n-340 std::enable_if_t<(std::rank_v == 1), int> = 0>\n-_\b3_\b4_\b1_\bm_\bd_\bs_\bp_\ba_\bn (CArray&)\n-342 -> _\bm_\bd_\bs_\bp_\ba_\bn_\b<_\bs_\bt_\bd_\b:_\b:_\br_\be_\bm_\bo_\bv_\be_\b__\ba_\bl_\bl_\b__\be_\bx_\bt_\be_\bn_\bt_\bs_\b__\bt_\b<_\bC_\bA_\br_\br_\ba_\by_\b>, _\bS_\bt_\bd_\b:_\b:_\be_\bx_\bt_\be_\bn_\bt_\bs_\b<_\bs_\bt_\bd_\b:_\b:_\bs_\bi_\bz_\be_\b__\bt_\b,\n-_\bs_\bt_\bd_\b:_\b:_\be_\bx_\bt_\be_\bn_\bt_\b__\bv_\b<_\bC_\bA_\br_\br_\ba_\by_\b,_\b0_\b>>>;\n-343\n-344template >, int>\n-= 0>\n-_\b3_\b4_\b6_\bm_\bd_\bs_\bp_\ba_\bn (Pointer&&)\n-347 -> _\bm_\bd_\bs_\bp_\ba_\bn_\b<_\bs_\bt_\bd_\b:_\b:_\br_\be_\bm_\bo_\bv_\be_\b__\bp_\bo_\bi_\bn_\bt_\be_\br_\b__\bt_\b<_\bs_\bt_\bd_\b:_\b:_\br_\be_\bm_\bo_\bv_\be_\b__\br_\be_\bf_\be_\br_\be_\bn_\bc_\be_\b__\bt_\b<_\bP_\bo_\bi_\bn_\bt_\be_\br_\b>>, _\bS_\bt_\bd_\b:_\b:\n-_\be_\bx_\bt_\be_\bn_\bt_\bs_\b<_\bs_\bt_\bd_\b:_\b:_\bs_\bi_\bz_\be_\b__\bt_\b>>;\n+319#endif // DOXYGEN\n+320\n+326 template\n+_\b3_\b2_\b7 struct _\bI_\bs_\bT_\bu_\bp_\bl_\be :\n+328 public Impl::IsTuple\n+329 {};\n+330\n+331\n+332#ifndef DOXYGEN\n+333\n+334 // Implementation of IsTupleOrDerived\n+335 namespace Impl {\n+336\n+337 template\n+338 std::true_type isTupleOrDerived(const std::tuple*, Dummy)\n+339 { return {}; }\n+340\n+341 template\n+342 std::false_type isTupleOrDerived(const void*, Dummy)\n+343 { return {}; }\n+344\n+345 } // namespace Impl\n+346\n+347#endif // DOXYGEN\n 348\n-349template ), int> = 0,\n-351 std::enable_if_t<(sizeof...(II) > 0), int> = 0>\n-_\b3_\b5_\b2_\bm_\bd_\bs_\bp_\ba_\bn (ElementType*, II...)\n-353 -> _\bm_\bd_\bs_\bp_\ba_\bn>;\n-354\n-355template \n-_\b3_\b5_\b6_\bm_\bd_\bs_\bp_\ba_\bn (ElementType*, _\bS_\bt_\bd_\b:_\b:_\bs_\bp_\ba_\bn_\b<_\bS_\bi_\bz_\be_\bT_\by_\bp_\be_\b,_\bN_\b>&)\n-357 -> _\bm_\bd_\bs_\bp_\ba_\bn_\b<_\bE_\bl_\be_\bm_\be_\bn_\bt_\bT_\by_\bp_\be_\b,_\b _\bS_\bt_\bd_\b:_\b:_\bd_\be_\bx_\bt_\be_\bn_\bt_\bs_\b<_\bs_\bt_\bd_\b:_\b:_\bs_\bi_\bz_\be_\b__\bt_\b,_\b _\bN_\b>>;\n+354 template\n+_\b3_\b5_\b5 struct _\bI_\bs_\bT_\bu_\bp_\bl_\be_\bO_\br_\bD_\be_\br_\bi_\bv_\be_\bd :\n+356 public decltype(Impl::isTupleOrDerived(std::declval(), true))\n+357 {};\n 358\n-359template \n-_\b3_\b6_\b0_\bm_\bd_\bs_\bp_\ba_\bn (ElementType*, const std::array&)\n-361 -> _\bm_\bd_\bs_\bp_\ba_\bn_\b<_\bE_\bl_\be_\bm_\be_\bn_\bt_\bT_\by_\bp_\be_\b,_\b _\bS_\bt_\bd_\b:_\b:_\bd_\be_\bx_\bt_\be_\bn_\bt_\bs_\b<_\bs_\bt_\bd_\b:_\b:_\bs_\bi_\bz_\be_\b__\bt_\b,_\b _\bN_\b>>;\n-362\n-363template \n-_\b3_\b6_\b4_\bm_\bd_\bs_\bp_\ba_\bn (ElementType*, const _\bS_\bt_\bd_\b:_\b:_\be_\bx_\bt_\be_\bn_\bt_\bs_\b<_\bI_\bn_\bd_\be_\bx_\bT_\by_\bp_\be_\b,_\be_\bx_\bt_\bs_\b._\b._\b._\b>&)\n-365 -> _\bm_\bd_\bs_\bp_\ba_\bn>;\n-366\n-367template \n-_\b3_\b7_\b0_\bm_\bd_\bs_\bp_\ba_\bn (ElementType*, const Mapping&)\n-371 -> _\bm_\bd_\bs_\bp_\ba_\bn_\b<_\bE_\bl_\be_\bm_\be_\bn_\bt_\bT_\by_\bp_\be_\b,_\b _\bE_\bx_\bt_\be_\bn_\bt_\bs_\b,_\b _\bL_\ba_\by_\bo_\bu_\bt_\b>;\n+359\n+360#ifndef DOXYGEN\n+361\n+362 // Implementation of is IsIntegralConstant\n+363 namespace Impl {\n+364\n+365 template\n+366 struct _\bI_\bs_\bI_\bn_\bt_\be_\bg_\br_\ba_\bl_\bC_\bo_\bn_\bs_\bt_\ba_\bn_\bt : public std::false_type\n+367 {};\n+368\n+369 template\n+370 struct IsIntegralConstant<_\bs_\bt_\bd::integral_constant> : public std::\n+true_type\n+371 {};\n 372\n-373template \n-_\b3_\b7_\b8_\bm_\bd_\bs_\bp_\ba_\bn (const DataHandle&, const Mapping&, const Accessor&)\n-379 -> _\bm_\bd_\bs_\bp_\ba_\bn_\b<_\bE_\bl_\be_\bm_\be_\bn_\bt_\b,_\b _\bE_\bx_\bt_\be_\bn_\bt_\bs_\b,_\b _\bL_\ba_\by_\bo_\bu_\bt_\b,_\b _\bA_\bc_\bc_\be_\bs_\bs_\bo_\br_\b>;\n-380\n-381// @}\n-382\n-383} // end namespace Dune::Std\n-384\n-385#endif // DUNE_COMMON_STD_MDSPAN_HH\n-_\bl_\ba_\by_\bo_\bu_\bt_\b__\br_\bi_\bg_\bh_\bt_\b._\bh_\bh\n-_\bd_\be_\bf_\ba_\bu_\bl_\bt_\b__\ba_\bc_\bc_\be_\bs_\bs_\bo_\br_\b._\bh_\bh\n-_\be_\bx_\bt_\be_\bn_\bt_\bs_\b._\bh_\bh\n-_\bs_\bp_\ba_\bn_\b._\bh_\bh\n-_\bi_\bn_\bd_\bi_\bc_\be_\bs_\b._\bh_\bh\n-_\bD_\bu_\bn_\be_\b:_\b:_\bu_\bn_\bp_\ba_\bc_\bk_\bI_\bn_\bt_\be_\bg_\be_\br_\bS_\be_\bq_\bu_\be_\bn_\bc_\be\n-decltype(auto) constexpr unpackIntegerSequence(F &&f, std::integer_sequence< I,\n-i... > sequence)\n-Unpack an std::integer_sequence to std::integral_constant...\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn indices.hh:124\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bt_\bd_\b:_\b:_\bd_\be_\bx_\bt_\be_\bn_\bt_\bs\n-typename Impl::DExtentsImpl< IndexType, std::make_integer_sequence< std::\n-size_t, R > >::type dextents\n-Alias of extents of given rank R and purely dynamic extents. See\n-[mdspan.extents.dextents].\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn extents.hh:259\n+373 } // namespace Impl\n+374\n+375#endif // DOXYGEN\n+376\n+382 template\n+_\b3_\b8_\b3 struct _\bI_\bs_\bI_\bn_\bt_\be_\bg_\br_\ba_\bl_\bC_\bo_\bn_\bs_\bt_\ba_\bn_\bt : public Impl::IsIntegralConstant>\n+384 {};\n+385\n+386\n+387#ifndef DOXYGEN\n+388\n+389 namespace Impl {\n+390\n+391 struct _\bI_\bs_\bC_\bo_\bm_\bp_\bi_\bl_\be_\bT_\bi_\bm_\be_\bC_\bo_\bn_\bs_\bt_\ba_\bn_\bt\n+392 {\n+393 template \n+394 static std::true_type check(std::integral_constant);\n+395 static std::false_type check(...);\n+396 };\n+397\n+398 } // namespace Impl\n+399\n+400#endif // DOXYGEN\n+401\n+408 template\n+_\b4_\b0_\b9 struct _\bI_\bs_\bC_\bo_\bm_\bp_\bi_\bl_\be_\bT_\bi_\bm_\be_\bC_\bo_\bn_\bs_\bt_\ba_\bn_\bt\n+410 : public decltype(Impl::IsCompileTimeConstant::check(std::declval()))\n+411 {};\n+412\n+413\n+414\n+430 template\n+_\b4_\b3_\b1 struct\n+432 [[deprecated(\"This class is deprecated and will be removed after Dune 2.10.\n+Use sizeof...(T) instead.\")]]\n+433 _\bS_\bi_\bz_\be_\bO_\bf\n+434 : public std::integral_constant\n+435 {};\n+436\n+437\n+438#ifndef DOXYGEN\n+439\n+440 namespace Impl {\n+441\n+442 template\n+443 struct IntegerSequenceHelper;\n+444\n+445 // Helper struct to compute the i-th entry of a std::integer_sequence\n+446 //\n+447 // This could also be implemented using std::get(std::make_tuple\n+(t...)).\n+448 // However, the gcc-6 implementation of std::make_tuple increases the\n+instantiation\n+449 // depth by 15 levels for each argument, such that the maximal\n+instantiation depth\n+450 // is easily hit, especially with clang where it is set to 256.\n+451 template\n+452 struct IntegerSequenceHelper\n+453 {\n+454\n+455 // get first entry\n+456 static constexpr auto _\bg_\be_\bt(std::integral_constant)\n+457 {\n+458 return std::integral_constant();\n+459 }\n+460\n+461 // call get with first entry cut off and decremented index\n+462 template 0) and (index < sizeof...(tail)+1), int> = 0>\n+464 static constexpr auto get(std::integral_constant)\n+465 {\n+466 return IntegerSequenceHelper::get(std::integral_constant());\n+467 }\n+468\n+469 // use static assertion if index exceeds size\n+470 template= sizeof...(tail)+1), int> = 0>\n+472 static constexpr auto _\bg_\be_\bt(std::integral_constant)\n+473 {\n+474 static_assert(index < sizeof...(tail)+1, \"index used in\n+IntegerSequenceEntry exceed size\");\n+475 }\n+476 };\n+477\n+478 } // end namespace Impl\n+479\n+480#endif // DOXYGEN\n+481\n+482\n+491 template\n+_\b4_\b9_\b2 constexpr auto _\bi_\bn_\bt_\be_\bg_\be_\br_\bS_\be_\bq_\bu_\be_\bn_\bc_\be_\bE_\bn_\bt_\br_\by(std::integer_sequence /*seq*/,\n+std::integral_constant i)\n+493 {\n+494 static_assert(index < sizeof...(t), \"index used in IntegerSequenceEntry\n+exceed size\");\n+495 return Impl::IntegerSequenceHelper::get(i);\n+496 }\n+497\n+498\n+505 template\n+_\b5_\b0_\b6 struct _\bI_\bn_\bt_\be_\bg_\be_\br_\bS_\be_\bq_\bu_\be_\bn_\bc_\be_\bE_\bn_\bt_\br_\by;\n+507\n+508#ifndef DOXYGEN\n+509\n+510 template\n+511 struct _\bI_\bn_\bt_\be_\bg_\be_\br_\bS_\be_\bq_\bu_\be_\bn_\bc_\be_\bE_\bn_\bt_\br_\by<_\bs_\bt_\bd::integer_sequence, i>\n+512 : public decltype(Impl::IntegerSequenceHelper::get(std::\n+integral_constant()))\n+513 {};\n+514\n+515#endif // DOXYGEN\n+516\n+530 template\n+_\b5_\b3_\b1 struct _\bA_\bu_\bt_\bo_\bn_\bo_\bm_\bo_\bu_\bs_\bV_\ba_\bl_\bu_\be_\bT_\by_\bp_\be { using _\bt_\by_\bp_\be = T; };\n+532\n+534 template\n+_\b5_\b3_\b5 struct _\bA_\bu_\bt_\bo_\bn_\bo_\bm_\bo_\bu_\bs_\bV_\ba_\bl_\bu_\be_\bT_\by_\bp_\be : _\bA_\bu_\bt_\bo_\bn_\bo_\bm_\bo_\bu_\bs_\bV_\ba_\bl_\bu_\be_\bT_\by_\bp_\be_\b<_\bT_\b> {};\n+536\n+538 template\n+_\b5_\b3_\b9 struct _\bA_\bu_\bt_\bo_\bn_\bo_\bm_\bo_\bu_\bs_\bV_\ba_\bl_\bu_\be_\bT_\by_\bp_\be : _\bA_\bu_\bt_\bo_\bn_\bo_\bm_\bo_\bu_\bs_\bV_\ba_\bl_\bu_\be_\bT_\by_\bp_\be_\b<_\bT_\b> {};\n+540\n+542 template\n+_\b5_\b4_\b3 struct _\bA_\bu_\bt_\bo_\bn_\bo_\bm_\bo_\bu_\bs_\bV_\ba_\bl_\bu_\be_\bT_\by_\bp_\be : _\bA_\bu_\bt_\bo_\bn_\bo_\bm_\bo_\bu_\bs_\bV_\ba_\bl_\bu_\be_\bT_\by_\bp_\be {};\n+544\n+546 template\n+_\b5_\b4_\b7 struct _\bA_\bu_\bt_\bo_\bn_\bo_\bm_\bo_\bu_\bs_\bV_\ba_\bl_\bu_\be_\bT_\by_\bp_\be : _\bA_\bu_\bt_\bo_\bn_\bo_\bm_\bo_\bu_\bs_\bV_\ba_\bl_\bu_\be_\bT_\by_\bp_\be {};\n+548\n+550 template<>\n+_\b5_\b5_\b1 struct _\bA_\bu_\bt_\bo_\bn_\bo_\bm_\bo_\bu_\bs_\bV_\ba_\bl_\bu_\be_\bT_\by_\bp_\be<_\bs_\bt_\bd::vector::reference>\n+552 {\n+_\b5_\b5_\b3 using _\bt_\by_\bp_\be = bool;\n+554 };\n+555\n+557 template\n+_\b5_\b5_\b8 struct _\bA_\bu_\bt_\bo_\bn_\bo_\bm_\bo_\bu_\bs_\bV_\ba_\bl_\bu_\be_\bT_\by_\bp_\be : _\bA_\bu_\bt_\bo_\bn_\bo_\bm_\bo_\bu_\bs_\bV_\ba_\bl_\bu_\be_\bT_\by_\bp_\be {};\n+559\n+587 template\n+_\b5_\b8_\b8 using _\bA_\bu_\bt_\bo_\bn_\bo_\bm_\bo_\bu_\bs_\bV_\ba_\bl_\bu_\be = typename _\bA_\bu_\bt_\bo_\bn_\bo_\bm_\bo_\bu_\bs_\bV_\ba_\bl_\bu_\be_\bT_\by_\bp_\be_\b<_\bT_\b>_\b:_\b:_\bt_\by_\bp_\be;\n+589\n+671 template\n+_\b6_\b7_\b2 constexpr _\bA_\bu_\bt_\bo_\bn_\bo_\bm_\bo_\bu_\bs_\bV_\ba_\bl_\bu_\be_\b<_\bT_\b> _\ba_\bu_\bt_\bo_\bC_\bo_\bp_\by(T &&v)\n+673 {\n+674 return v;\n+675 }\n+676\n+678}\n+679#endif\n+_\bD_\bu_\bn_\be_\b:_\b:_\bi_\bn_\bt_\be_\bg_\be_\br_\bS_\be_\bq_\bu_\be_\bn_\bc_\be_\bE_\bn_\bt_\br_\by\n+constexpr auto integerSequenceEntry(std::integer_sequence< T, t... >, std::\n+integral_constant< std::size_t, index > i)\n+Get entry of std::integer_sequence.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn typetraits.hh:492\n+_\bD_\bu_\bn_\be_\b:_\b:_\br_\be_\ba_\bl_\b__\bt\n+typename FieldTraits< Type >::real_type real_t\n+Convenient access to FieldTraits::real_type.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn typetraits.hh:301\n+_\bD_\bu_\bn_\be_\b:_\b:_\ba_\bu_\bt_\bo_\bC_\bo_\bp_\by\n+constexpr AutonomousValue< T > autoCopy(T &&v)\n+Autonomous copy of an expression's value for use in auto type deduction.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn typetraits.hh:672\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bu_\bt_\bo_\bn_\bo_\bm_\bo_\bu_\bs_\bV_\ba_\bl_\bu_\be\n+typename AutonomousValueType< T >::type AutonomousValue\n+Type free of internal references that T can be converted to.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn typetraits.hh:588\n+_\bD_\bu_\bn_\be_\b:_\b:_\bv_\bo_\bi_\bd_\b__\bt\n+typename Impl::voider< Types... >::type void_t\n+Is void for all valid input types. The workhorse for C++11 SFINAE-techniques.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn typetraits.hh:40\n+_\bD_\bu_\bn_\be_\b:_\b:_\bf_\bi_\be_\bl_\bd_\b__\bt\n+typename FieldTraits< Type >::field_type field_t\n+Convenient access to FieldTraits::field_type.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn typetraits.hh:297\n _\bs_\bt_\bd\n STL namespace.\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bt_\bd\n-Namespace for features backported from new C++ standards.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn default_accessor.hh:10\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bt_\bd_\b:_\b:_\be_\bx_\bt_\be_\bn_\bt_\bs\n-Multidimensional index space with dynamic and static extents.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn extents.hh:54\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bt_\bd_\b:_\b:_\bm_\bd_\bs_\bp_\ba_\bn\n-A multi-dimensional non-owning array view.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mdspan.hh:64\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bt_\bd_\b:_\b:_\bm_\bd_\bs_\bp_\ba_\bn_\b:_\b:_\br_\be_\bf_\be_\br_\be_\bn_\bc_\be\n-typename accessor_type::reference reference\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mdspan.hh:82\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bt_\bd_\b:_\b:_\bm_\bd_\bs_\bp_\ba_\bn_\b:_\b:_\be_\bl_\be_\bm_\be_\bn_\bt_\b__\bt_\by_\bp_\be\n-Element element_type\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mdspan.hh:71\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bt_\bd_\b:_\b:_\bm_\bd_\bs_\bp_\ba_\bn_\b:_\b:_\bm_\bd_\bs_\bp_\ba_\bn\n-constexpr mdspan(data_handle_type p, const mapping_type &m, const accessor_type\n-&a)\n-Construct from the pointer to the data of the tensor, an index mapping, and an\n-accessor.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mdspan.hh:161\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bt_\bd_\b:_\b:_\bm_\bd_\bs_\bp_\ba_\bn_\b:_\b:_\be_\bx_\bt_\be_\bn_\bt_\bs_\b__\bt_\by_\bp_\be\n-Extents extents_type\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mdspan.hh:72\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bt_\bd_\b:_\b:_\bm_\bd_\bs_\bp_\ba_\bn_\b:_\b:_\br_\ba_\bn_\bk_\b__\bd_\by_\bn_\ba_\bm_\bi_\bc\n-static constexpr rank_type rank_dynamic() noexcept\n-Number of dimensions of the tensor.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mdspan.hh:269\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bt_\bd_\b:_\b:_\bm_\bd_\bs_\bp_\ba_\bn_\b:_\b:_\bi_\bs_\b__\ba_\bl_\bw_\ba_\by_\bs_\b__\bu_\bn_\bi_\bq_\bu_\be\n-static constexpr bool is_always_unique()\n-Return true only if for every i and j where (i != j || ...) => mapping(i...) !=\n-mapping(j....\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mdspan.hh:293\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bt_\bd_\b:_\b:_\bm_\bd_\bs_\bp_\ba_\bn_\b:_\b:_\bi_\bn_\bd_\be_\bx_\b__\bt_\by_\bp_\be\n-typename extents_type::index_type index_type\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mdspan.hh:78\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bt_\bd_\b:_\b:_\bm_\bd_\bs_\bp_\ba_\bn_\b:_\b:_\bl_\ba_\by_\bo_\bu_\bt_\b__\bt_\by_\bp_\be\n-LayoutPolicy layout_type\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mdspan.hh:73\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bt_\bd_\b:_\b:_\bm_\bd_\bs_\bp_\ba_\bn_\b:_\b:_\bi_\bs_\b__\bs_\bt_\br_\bi_\bd_\be_\bd\n-constexpr bool is_strided() const\n-Return true only if for every rank index r of extents there exists an integer\n-sr such that,...\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mdspan.hh:313\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bt_\bd_\b:_\b:_\bm_\bd_\bs_\bp_\ba_\bn_\b:_\b:_\bm_\bd_\bs_\bp_\ba_\bn\n-constexpr mdspan(data_handle_type p, const mapping_type &m)\n-Construct from the pointer to the data of the tensor and an index mapping.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mdspan.hh:156\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bt_\bd_\b:_\b:_\bm_\bd_\bs_\bp_\ba_\bn_\b:_\b:_\br_\ba_\bn_\bk_\b__\bt_\by_\bp_\be\n-typename extents_type::rank_type rank_type\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mdspan.hh:80\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bt_\bd_\b:_\b:_\bm_\bd_\bs_\bp_\ba_\bn_\b:_\b:_\bm_\bd_\bs_\bp_\ba_\bn\n-constexpr mdspan(data_handle_type p, const extents_type &e)\n-Construct from the pointer to the data of the tensor and its extents.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mdspan.hh:149\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bt_\bd_\b:_\b:_\bm_\bd_\bs_\bp_\ba_\bn_\b:_\b:_\bv_\ba_\bl_\bu_\be_\b__\bt_\by_\bp_\be\n-std::remove_cv_t< Element > value_type\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mdspan.hh:76\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bt_\bd_\b:_\b:_\bm_\bd_\bs_\bp_\ba_\bn_\b:_\b:_\bi_\bs_\b__\ba_\bl_\bw_\ba_\by_\bs_\b__\be_\bx_\bh_\ba_\bu_\bs_\bt_\bi_\bv_\be\n-static constexpr bool is_always_exhaustive()\n-Return true only if for all k in the range [0, mapping.required_span_size() )\n-there exists an i such ...\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mdspan.hh:296\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bt_\bd_\b:_\b:_\bm_\bd_\bs_\bp_\ba_\bn_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b[_\b]\n-constexpr reference operator[](Index index) const\n-Access specified element at position [i0] For a rank one mdspan, the operator\n-[i] is added to support ...\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mdspan.hh:219\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bt_\bd_\b:_\b:_\bm_\bd_\bs_\bp_\ba_\bn_\b:_\b:_\be_\bx_\bt_\be_\bn_\bt_\bs\n-constexpr const extents_type & extents() const noexcept\n-Number of elements in all dimensions of the tensor,.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mdspan.hh:250\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bt_\bd_\b:_\b:_\bm_\bd_\bs_\bp_\ba_\bn_\b:_\b:_\be_\bx_\bt_\be_\bn_\bt\n-constexpr index_type extent(rank_type r) const noexcept\n-Number of elements in the r'th dimension of the tensor.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mdspan.hh:275\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bt_\bd_\b:_\b:_\bm_\bd_\bs_\bp_\ba_\bn_\b:_\b:_\bs_\bw_\ba_\bp\n-friend constexpr void swap(mdspan &x, mdspan &y) noexcept\n-Overloads the std::swap algorithm for std::mdspan. Exchanges the state of x\n-with that of y.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mdspan.hh:320\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bt_\bd_\b:_\b:_\bm_\bd_\bs_\bp_\ba_\bn_\b:_\b:_\bi_\bs_\b__\ba_\bl_\bw_\ba_\by_\bs_\b__\bs_\bt_\br_\bi_\bd_\be_\bd\n-static constexpr bool is_always_strided()\n-Return true only if for every rank index r of extents there exists an integer\n-sr such that,...\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mdspan.hh:299\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bt_\bd_\b:_\b:_\bm_\bd_\bs_\bp_\ba_\bn_\b:_\b:_\bs_\bi_\bz_\be\n-constexpr size_type size() const noexcept\n-The number of elements accessible by this multi-dimensional span.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mdspan.hh:278\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bt_\bd_\b:_\b:_\bm_\bd_\bs_\bp_\ba_\bn_\b:_\b:_\bd_\ba_\bt_\ba_\b__\bh_\ba_\bn_\bd_\bl_\be_\b__\bt_\by_\bp_\be\n-typename accessor_type::data_handle_type data_handle_type\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mdspan.hh:81\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bt_\bd_\b:_\b:_\bm_\bd_\bs_\bp_\ba_\bn_\b:_\b:_\be_\bm_\bp_\bt_\by\n-constexpr bool empty() const noexcept\n-Checks if the size of the index space is zero.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mdspan.hh:287\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bt_\bd_\b:_\b:_\bm_\bd_\bs_\bp_\ba_\bn_\b:_\b:_\ba_\bc_\bc_\be_\bs_\bs_\bo_\br\n-constexpr const accessor_type & accessor() const noexcept\n-The accessor policy object.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mdspan.hh:256\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bt_\bd_\b:_\b:_\bm_\bd_\bs_\bp_\ba_\bn_\b:_\b:_\ba_\bc_\bc_\be_\bs_\bs_\bo_\br_\b__\bt_\by_\bp_\be\n-AccessorPolicy accessor_type\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mdspan.hh:74\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bt_\bd_\b:_\b:_\bm_\bd_\bs_\bp_\ba_\bn_\b:_\b:_\bi_\bs_\b__\be_\bx_\bh_\ba_\bu_\bs_\bt_\bi_\bv_\be\n-constexpr bool is_exhaustive() const\n-Return true only if for all k in the range [0, mapping.required_span_size() )\n-there exists an i such ...\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mdspan.hh:306\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bt_\bd_\b:_\b:_\bm_\bd_\bs_\bp_\ba_\bn_\b:_\b:_\br_\ba_\bn_\bk\n-static constexpr rank_type rank() noexcept\n-Number of dimensions of the tensor.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mdspan.hh:266\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bt_\bd_\b:_\b:_\bm_\bd_\bs_\bp_\ba_\bn_\b:_\b:_\bs_\bt_\ba_\bt_\bi_\bc_\b__\be_\bx_\bt_\be_\bn_\bt\n-static constexpr std::size_t static_extent(rank_type r) noexcept\n-Number of elements in the r'th dimension of the tensor.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mdspan.hh:272\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bt_\bd_\b:_\b:_\bm_\bd_\bs_\bp_\ba_\bn_\b:_\b:_\bm_\ba_\bp_\bp_\bi_\bn_\bg\n-constexpr const mapping_type & mapping() const noexcept\n-Index mapping of a layout policy.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mdspan.hh:253\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bt_\bd_\b:_\b:_\bm_\bd_\bs_\bp_\ba_\bn_\b:_\b:_\bd_\ba_\bt_\ba_\b__\bh_\ba_\bn_\bd_\bl_\be\n-constexpr const data_handle_type & data_handle() const noexcept\n-The pointer to the underlying flat sequence.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mdspan.hh:259\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bt_\bd_\b:_\b:_\bm_\bd_\bs_\bp_\ba_\bn_\b:_\b:_\bs_\bt_\br_\bi_\bd_\be\n-constexpr index_type stride(rank_type r) const\n-The stride along the specified dimension.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mdspan.hh:316\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bt_\bd_\b:_\b:_\bm_\bd_\bs_\bp_\ba_\bn_\b:_\b:_\bi_\bs_\b__\bu_\bn_\bi_\bq_\bu_\be\n-constexpr bool is_unique() const\n-Return true only if for every i and j where (i != j || ...) => mapping(i...) !=\n-mapping(j....\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mdspan.hh:302\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bt_\bd_\b:_\b:_\bm_\bd_\bs_\bp_\ba_\bn_\b:_\b:_\bm_\bd_\bs_\bp_\ba_\bn\n-constexpr mdspan()\n-Default constructor value-initializes all members.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mdspan.hh:105\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bt_\bd_\b:_\b:_\bm_\bd_\bs_\bp_\ba_\bn_\b:_\b:_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be\n-typename extents_type::size_type size_type\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mdspan.hh:79\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bt_\bd_\b:_\b:_\bm_\bd_\bs_\bp_\ba_\bn_\b:_\b:_\bm_\ba_\bp_\bp_\bi_\bn_\bg_\b__\bt_\by_\bp_\be\n-typename layout_type::template mapping< extents_type > mapping_type\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mdspan.hh:77\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bt_\bd_\b:_\b:_\bs_\bp_\ba_\bn\n-A contiguous sequence of elements with static or dynamic extent.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn span.hh:126\n+_\bD_\bu_\bn_\be\n+Dune namespace.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn alignedallocator.hh:13\n+_\bD_\bu_\bn_\be_\b:_\b:_\bt_\ba_\bi_\bl\n+constexpr std::integer_sequence< T, II... > tail(std::integer_sequence< T, I0,\n+II... >)\n+For a sequence [head,tail...) return the tail sequence.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn integersequence.hh:58\n+_\bD_\bu_\bn_\be_\b:_\b:_\bh_\be_\ba_\bd\n+constexpr std::integral_constant< T, I0 > head(std::integer_sequence< T, I0,\n+II... >)\n+For a sequence [head,tail...) return the single head element.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn integersequence.hh:53\n+_\bD_\bu_\bn_\be_\b:_\b:_\bg_\be_\bt\n+constexpr auto get(std::integer_sequence< T, II... >, std::integral_constant<\n+std::size_t, pos >={})\n+Return the entry at position pos of the given sequence.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn integersequence.hh:22\n+_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bs_\bN_\bu_\bm_\bb_\be_\br\n+Whether this type acts as a scalar in the context of (hierarchically blocked)\n+containers.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn typetraits.hh:194\n+_\bD_\bu_\bn_\be_\b:_\b:_\bF_\bi_\be_\bl_\bd_\bT_\br_\ba_\bi_\bt_\bs_\b:_\b:_\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be\n+T field_type\n+export the type representing the field\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn ftraits.hh:28\n+_\bD_\bu_\bn_\be_\b:_\b:_\bF_\bi_\be_\bl_\bd_\bT_\br_\ba_\bi_\bt_\bs_\b:_\b:_\br_\be_\ba_\bl_\b__\bt_\by_\bp_\be\n+T real_type\n+export the type representing the real type of the field\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn ftraits.hh:30\n+_\bD_\bu_\bn_\be_\b:_\b:_\bE_\bm_\bp_\bt_\by\n+Just an empty class.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn typetraits.hh:55\n+_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bs_\bI_\bn_\bt_\be_\br_\bo_\bp_\be_\br_\ba_\bb_\bl_\be\n+Checks whether two types are interoperable.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn typetraits.hh:65\n+_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bs_\bI_\bn_\bt_\be_\br_\bo_\bp_\be_\br_\ba_\bb_\bl_\be_\b:_\b:_\bv_\ba_\bl_\bu_\be\n+static constexpr bool value\n+True if either a conversion from T1 to T2 or vice versa exists.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn typetraits.hh:70\n+_\bD_\bu_\bn_\be_\b:_\b:_\bE_\bn_\ba_\bb_\bl_\be_\bI_\bf_\bI_\bn_\bt_\be_\br_\bO_\bp_\be_\br_\ba_\bb_\bl_\be\n+Enable typedef if two types are interoperable.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn typetraits.hh:81\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bl_\bw_\ba_\by_\bs_\bF_\ba_\bl_\bs_\be\n+template which always yields a false value\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn typetraits.hh:124\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bl_\bw_\ba_\by_\bs_\bT_\br_\bu_\be\n+template which always yields a true value\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn typetraits.hh:134\n+_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bs_\bC_\ba_\bl_\bl_\ba_\bb_\bl_\be\n+Check if a type is callable with ()-operator and given arguments.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn typetraits.hh:162\n+_\bD_\bu_\bn_\be_\b:_\b:_\bH_\ba_\bs_\bN_\ba_\bN\n+Whether this type has a value of NaN.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn typetraits.hh:212\n+_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bs_\bI_\bn_\bd_\be_\bx_\ba_\bb_\bl_\be\n+Type trait to determine whether an instance of T has an operator[](I), i.e.\n+whether it can be indexed...\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn typetraits.hh:250\n+_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bs_\bI_\bt_\be_\br_\ba_\bb_\bl_\be\n+typetrait to check that a class has begin() and end() members\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn typetraits.hh:273\n+_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bs_\bT_\bu_\bp_\bl_\be\n+Check if T is a std::tuple<...>\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn typetraits.hh:329\n+_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bs_\bT_\bu_\bp_\bl_\be_\bO_\br_\bD_\be_\br_\bi_\bv_\be_\bd\n+Check if T derived from a std::tuple<...>\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn typetraits.hh:357\n+_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bs_\bI_\bn_\bt_\be_\bg_\br_\ba_\bl_\bC_\bo_\bn_\bs_\bt_\ba_\bn_\bt\n+Check if T is an std::integral_constant\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn typetraits.hh:384\n+_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bs_\bC_\bo_\bm_\bp_\bi_\bl_\be_\bT_\bi_\bm_\be_\bC_\bo_\bn_\bs_\bt_\ba_\bn_\bt\n+Check if T is an integral constant or any type derived from std::\n+integral_constant.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn typetraits.hh:411\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bi_\bz_\be_\bO_\bf\n+Compute size of variadic type list.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn typetraits.hh:435\n+_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bt_\be_\bg_\be_\br_\bS_\be_\bq_\bu_\be_\bn_\bc_\be_\bE_\bn_\bt_\br_\by\n+Get entry of std::integer_sequence.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn typetraits.hh:506\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bu_\bt_\bo_\bn_\bo_\bm_\bo_\bu_\bs_\bV_\ba_\bl_\bu_\be_\bT_\by_\bp_\be\n+Type free of internal references that T can be converted to.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn typetraits.hh:531\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bu_\bt_\bo_\bn_\bo_\bm_\bo_\bu_\bs_\bV_\ba_\bl_\bu_\be_\bT_\by_\bp_\be_\b:_\b:_\bt_\by_\bp_\be\n+T type\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn typetraits.hh:531\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bu_\bt_\bo_\bn_\bo_\bm_\bo_\bu_\bs_\bV_\ba_\bl_\bu_\be_\bT_\by_\bp_\be_\b<_\b _\bs_\bt_\bd_\b:_\b:_\bv_\be_\bc_\bt_\bo_\br_\b<_\b _\bb_\bo_\bo_\bl_\b _\b>_\b:_\b:_\br_\be_\bf_\be_\br_\be_\bn_\bc_\be_\b _\b>_\b:_\b:_\bt_\by_\bp_\be\n+bool type\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn typetraits.hh:553\n ===============================================================================\n Generated by\u00a0_\b[_\bd_\bo_\bx_\by_\bg_\be_\bn_\b] 1.9.8\n"}]}, {"source1": "./usr/share/doc/libdune-common-doc/doxygen/a00158.html", "source2": "./usr/share/doc/libdune-common-doc/doxygen/a00158.html", "unified_diff": "@@ -1,15 +1,15 @@\n \n \n \n \n \n \n \n-dune-common: functional.hh File Reference\n+dune-common: float_cmp.cc File Reference\n \n \n \n \n \n \n \n@@ -65,43 +65,124 @@\n \n \n \n \n \n \n \n
    \n \n-
    functional.hh File Reference
    \n+Namespaces |\n+Functions
    \n+
    float_cmp.cc File Reference
    \n \n
    \n-
    #include <functional>
    \n-#include <dune-common-config.hh>
    \n+
    #include "float_cmp.hh"
    \n+#include <vector>
    \n+#include <limits>
    \n+#include <algorithm>
    \n+#include <cstdlib>
    \n+#include <dune/common/fvector.hh>
    \n
    \n

    Go to the source code of this file.

    \n \n \n-\n-\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n \n

    \n Classes

    struct  Dune::Std::identity
     A function object type whose operator() returns its argument unchanged. More...
    struct  Dune::FloatCmp::EpsilonType< T >
     Mapping of value type to epsilon type. More...
     
    struct  Dune::FloatCmp::EpsilonType< std::vector< T, A > >
     Specialization of EpsilonType for std::vector. More...
     
    struct  Dune::FloatCmp::EpsilonType< FieldVector< T, n > >
     Specialization of EpsilonType for Dune::FieldVector. More...
     
    struct  Dune::FloatCmp::DefaultEpsilon< T, relativeWeak >
     
    struct  Dune::FloatCmp::DefaultEpsilon< T, relativeStrong >
     
    struct  Dune::FloatCmp::DefaultEpsilon< T, absolute >
     
    \n \n \n \n \n-\n-\n+\n \n+

    \n Namespaces

    namespace  Dune
     Dune namespace.
     
    namespace  Dune::Std
     Namespace for features backported from new C++ standards.
    namespace  Dune::FloatCmp
     
    \n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n

    \n+Functions

    template<class T , CmpStyle style>
    bool Dune::FloatCmp::eq (const T &first, const T &second, typename EpsilonType< T >::Type epsilon=DefaultEpsilon< T, style >::value())
     test for equality using epsilon
     
    template<class T , CmpStyle style>
    bool Dune::FloatCmp::ne (const T &first, const T &second, typename EpsilonType< T >::Type epsilon=DefaultEpsilon< T, style >::value())
     test for inequality using epsilon
     
    template<class T , CmpStyle style>
    bool Dune::FloatCmp::gt (const T &first, const T &second, typename EpsilonType< T >::Type epsilon=DefaultEpsilon< T, style >::value())
     test if first greater than second
     
    template<class T , CmpStyle style>
    bool Dune::FloatCmp::lt (const T &first, const T &second, typename EpsilonType< T >::Type epsilon=DefaultEpsilon< T, style >::value())
     test if first lesser than second
     
    template<class T , CmpStyle style>
    bool Dune::FloatCmp::ge (const T &first, const T &second, typename EpsilonType< T >::Type epsilon=DefaultEpsilon< T, style >::value())
     test if first greater or equal second
     
    template<class T , CmpStyle style>
    bool Dune::FloatCmp::le (const T &first, const T &second, typename EpsilonType< T >::Type epsilon=DefaultEpsilon< T, style >::value())
     test if first lesser or equal second
     
    template<class T >
    bool Dune::FloatCmp::eq (const T &first, const T &second, typename EpsilonType< T >::Type epsilon=DefaultEpsilon< T, defaultCmpStyle >::value())
     
    template<class T >
    bool Dune::FloatCmp::ne (const T &first, const T &second, typename EpsilonType< T >::Type epsilon=DefaultEpsilon< T, defaultCmpStyle >::value())
     
    template<class T >
    bool Dune::FloatCmp::gt (const T &first, const T &second, typename EpsilonType< T >::Type epsilon=DefaultEpsilon< T, defaultCmpStyle >::value())
     
    template<class T >
    bool Dune::FloatCmp::lt (const T &first, const T &second, typename EpsilonType< T >::Type epsilon=DefaultEpsilon< T, defaultCmpStyle >::value())
     
    template<class T >
    bool Dune::FloatCmp::ge (const T &first, const T &second, typename EpsilonType< T >::Type epsilon=DefaultEpsilon< T, defaultCmpStyle >::value())
     
    template<class T >
    bool Dune::FloatCmp::le (const T &first, const T &second, typename EpsilonType< T >::Type epsilon=DefaultEpsilon< T, defaultCmpStyle >::value())
     
    template<class I , class T , CmpStyle cstyle, RoundingStyle rstyle>
    Dune::FloatCmp::round (const T &val, typename EpsilonType< T >::Type epsilon=DefaultEpsilon< T, cstyle >::value())
     round using epsilon
     
    template<class I , class T , CmpStyle cstyle>
    Dune::FloatCmp::round (const T &val, typename EpsilonType< T >::Type epsilon=DefaultEpsilon< T, cstyle >::value())
     
    template<class I , class T >
    Dune::FloatCmp::round (const T &val, typename EpsilonType< T >::Type epsilon=DefaultEpsilon< T, defaultCmpStyle >::value())
     
    template<class I , class T , CmpStyle cstyle, RoundingStyle rstyle>
    Dune::FloatCmp::trunc (const T &val, typename EpsilonType< T >::Type epsilon=DefaultEpsilon< T, cstyle >::value())
     truncate using epsilon
     
    template<class I , class T , CmpStyle cstyle>
    Dune::FloatCmp::trunc (const T &val, typename EpsilonType< T >::Type epsilon=DefaultEpsilon< T, cstyle >::value())
     
    template<class I , class T >
    Dune::FloatCmp::trunc (const T &val, typename EpsilonType< T >::Type epsilon=DefaultEpsilon< T, defaultCmpStyle >::value())
     
    \n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,26 +1,126 @@\n dune-common\u00a02.10\n Loading...\n Searching...\n No Matches\n * _\bd_\bu_\bn_\be\n * _\bc_\bo_\bm_\bm_\bo_\bn\n- * _\bs_\bt_\bd\n-_\bC_\bl_\ba_\bs_\bs_\be_\bs | _\bN_\ba_\bm_\be_\bs_\bp_\ba_\bc_\be_\bs\n-functional.hh File Reference\n-#include \n-#include \n+_\bC_\bl_\ba_\bs_\bs_\be_\bs | _\bN_\ba_\bm_\be_\bs_\bp_\ba_\bc_\be_\bs | _\bF_\bu_\bn_\bc_\bt_\bi_\bo_\bn_\bs\n+float_cmp.cc File Reference\n+#include \"_\bf_\bl_\bo_\ba_\bt_\b__\bc_\bm_\bp_\b._\bh_\bh\"\n+#include \n+#include \n+#include \n+#include \n+#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bf_\bv_\be_\bc_\bt_\bo_\br_\b._\bh_\bh>\n _\bG_\bo_\b _\bt_\bo_\b _\bt_\bh_\be_\b _\bs_\bo_\bu_\br_\bc_\be_\b _\bc_\bo_\bd_\be_\b _\bo_\bf_\b _\bt_\bh_\bi_\bs_\b _\bf_\bi_\bl_\be_\b.\n C\bCl\bla\bas\bss\bse\bes\bs\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bS_\bt_\bd_\b:_\b:_\bi_\bd_\be_\bn_\bt_\bi_\bt_\by\n-\u00a0 A function object type whose operator() returns its argument\n- unchanged. _\bM_\bo_\br_\be_\b._\b._\b.\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bF_\bl_\bo_\ba_\bt_\bC_\bm_\bp_\b:_\b:_\bE_\bp_\bs_\bi_\bl_\bo_\bn_\bT_\by_\bp_\be_\b<_\b _\bT_\b _\b>\n+\u00a0 Mapping of value type to epsilon type. _\bM_\bo_\br_\be_\b._\b._\b.\n+\u00a0\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bF_\bl_\bo_\ba_\bt_\bC_\bm_\bp_\b:_\b:_\bE_\bp_\bs_\bi_\bl_\bo_\bn_\bT_\by_\bp_\be_\b<_\b _\bs_\bt_\bd_\b:_\b:_\bv_\be_\bc_\bt_\bo_\br_\b<_\b _\bT_\b,_\b _\bA_\b _\b>_\b _\b>\n+\u00a0 Specialization of _\bE_\bp_\bs_\bi_\bl_\bo_\bn_\bT_\by_\bp_\be for std::vector. _\bM_\bo_\br_\be_\b._\b._\b.\n+\u00a0\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bF_\bl_\bo_\ba_\bt_\bC_\bm_\bp_\b:_\b:_\bE_\bp_\bs_\bi_\bl_\bo_\bn_\bT_\by_\bp_\be_\b<_\b _\bF_\bi_\be_\bl_\bd_\bV_\be_\bc_\bt_\bo_\br_\b<_\b _\bT_\b,_\b _\bn_\b _\b>_\b _\b>\n+\u00a0 Specialization of _\bE_\bp_\bs_\bi_\bl_\bo_\bn_\bT_\by_\bp_\be for _\bD_\bu_\bn_\be_\b:_\b:_\bF_\bi_\be_\bl_\bd_\bV_\be_\bc_\bt_\bo_\br. _\bM_\bo_\br_\be_\b._\b._\b.\n+\u00a0\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bF_\bl_\bo_\ba_\bt_\bC_\bm_\bp_\b:_\b:_\bD_\be_\bf_\ba_\bu_\bl_\bt_\bE_\bp_\bs_\bi_\bl_\bo_\bn_\b<_\b _\bT_\b,_\b _\br_\be_\bl_\ba_\bt_\bi_\bv_\be_\bW_\be_\ba_\bk_\b _\b>\n+\u00a0\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bF_\bl_\bo_\ba_\bt_\bC_\bm_\bp_\b:_\b:_\bD_\be_\bf_\ba_\bu_\bl_\bt_\bE_\bp_\bs_\bi_\bl_\bo_\bn_\b<_\b _\bT_\b,_\b _\br_\be_\bl_\ba_\bt_\bi_\bv_\be_\bS_\bt_\br_\bo_\bn_\bg_\b _\b>\n+\u00a0\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bF_\bl_\bo_\ba_\bt_\bC_\bm_\bp_\b:_\b:_\bD_\be_\bf_\ba_\bu_\bl_\bt_\bE_\bp_\bs_\bi_\bl_\bo_\bn_\b<_\b _\bT_\b,_\b _\ba_\bb_\bs_\bo_\bl_\bu_\bt_\be_\b _\b>\n \u00a0\n N\bNa\bam\bme\bes\bsp\bpa\bac\bce\bes\bs\n namespace \u00a0 _\bD_\bu_\bn_\be\n \u00a0 _\bD_\bu_\bn_\be namespace.\n \u00a0\n-namespace \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bS_\bt_\bd\n-\u00a0 Namespace for features backported from new C++ standards.\n+namespace \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bF_\bl_\bo_\ba_\bt_\bC_\bm_\bp\n+\u00a0\n+F\bFu\bun\bnc\bct\bti\bio\bon\bns\bs\n+template\n+bool\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bF_\bl_\bo_\ba_\bt_\bC_\bm_\bp_\b:_\b:_\be_\bq (const T &first, const T &second, typename\n+ _\bE_\bp_\bs_\bi_\bl_\bo_\bn_\bT_\by_\bp_\be< T >::Type epsilon=_\bD_\be_\bf_\ba_\bu_\bl_\bt_\bE_\bp_\bs_\bi_\bl_\bo_\bn< T, style >::value())\n+\u00a0 test for equality using epsilon\n+\u00a0\n+template\n+bool\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bF_\bl_\bo_\ba_\bt_\bC_\bm_\bp_\b:_\b:_\bn_\be (const T &first, const T &second, typename\n+ _\bE_\bp_\bs_\bi_\bl_\bo_\bn_\bT_\by_\bp_\be< T >::Type epsilon=_\bD_\be_\bf_\ba_\bu_\bl_\bt_\bE_\bp_\bs_\bi_\bl_\bo_\bn< T, style >::value())\n+\u00a0 test for inequality using epsilon\n+\u00a0\n+template\n+bool\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bF_\bl_\bo_\ba_\bt_\bC_\bm_\bp_\b:_\b:_\bg_\bt (const T &first, const T &second, typename\n+ _\bE_\bp_\bs_\bi_\bl_\bo_\bn_\bT_\by_\bp_\be< T >::Type epsilon=_\bD_\be_\bf_\ba_\bu_\bl_\bt_\bE_\bp_\bs_\bi_\bl_\bo_\bn< T, style >::value())\n+\u00a0 test if first greater than second\n+\u00a0\n+template\n+bool\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bF_\bl_\bo_\ba_\bt_\bC_\bm_\bp_\b:_\b:_\bl_\bt (const T &first, const T &second, typename\n+ _\bE_\bp_\bs_\bi_\bl_\bo_\bn_\bT_\by_\bp_\be< T >::Type epsilon=_\bD_\be_\bf_\ba_\bu_\bl_\bt_\bE_\bp_\bs_\bi_\bl_\bo_\bn< T, style >::value())\n+\u00a0 test if first lesser than second\n+\u00a0\n+template\n+bool\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bF_\bl_\bo_\ba_\bt_\bC_\bm_\bp_\b:_\b:_\bg_\be (const T &first, const T &second, typename\n+ _\bE_\bp_\bs_\bi_\bl_\bo_\bn_\bT_\by_\bp_\be< T >::Type epsilon=_\bD_\be_\bf_\ba_\bu_\bl_\bt_\bE_\bp_\bs_\bi_\bl_\bo_\bn< T, style >::value())\n+\u00a0 test if first greater or equal second\n+\u00a0\n+template\n+bool\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bF_\bl_\bo_\ba_\bt_\bC_\bm_\bp_\b:_\b:_\bl_\be (const T &first, const T &second, typename\n+ _\bE_\bp_\bs_\bi_\bl_\bo_\bn_\bT_\by_\bp_\be< T >::Type epsilon=_\bD_\be_\bf_\ba_\bu_\bl_\bt_\bE_\bp_\bs_\bi_\bl_\bo_\bn< T, style >::value())\n+\u00a0 test if first lesser or equal second\n+\u00a0\n+template\n+bool\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bF_\bl_\bo_\ba_\bt_\bC_\bm_\bp_\b:_\b:_\be_\bq (const T &first, const T &second, typename\n+ _\bE_\bp_\bs_\bi_\bl_\bo_\bn_\bT_\by_\bp_\be< T >::Type epsilon=_\bD_\be_\bf_\ba_\bu_\bl_\bt_\bE_\bp_\bs_\bi_\bl_\bo_\bn< T, _\bd_\be_\bf_\ba_\bu_\bl_\bt_\bC_\bm_\bp_\bS_\bt_\by_\bl_\be >::\n+ value())\n+\u00a0\n+template\n+bool\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bF_\bl_\bo_\ba_\bt_\bC_\bm_\bp_\b:_\b:_\bn_\be (const T &first, const T &second, typename\n+ _\bE_\bp_\bs_\bi_\bl_\bo_\bn_\bT_\by_\bp_\be< T >::Type epsilon=_\bD_\be_\bf_\ba_\bu_\bl_\bt_\bE_\bp_\bs_\bi_\bl_\bo_\bn< T, _\bd_\be_\bf_\ba_\bu_\bl_\bt_\bC_\bm_\bp_\bS_\bt_\by_\bl_\be >::\n+ value())\n+\u00a0\n+template\n+bool\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bF_\bl_\bo_\ba_\bt_\bC_\bm_\bp_\b:_\b:_\bg_\bt (const T &first, const T &second, typename\n+ _\bE_\bp_\bs_\bi_\bl_\bo_\bn_\bT_\by_\bp_\be< T >::Type epsilon=_\bD_\be_\bf_\ba_\bu_\bl_\bt_\bE_\bp_\bs_\bi_\bl_\bo_\bn< T, _\bd_\be_\bf_\ba_\bu_\bl_\bt_\bC_\bm_\bp_\bS_\bt_\by_\bl_\be >::\n+ value())\n+\u00a0\n+template\n+bool\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bF_\bl_\bo_\ba_\bt_\bC_\bm_\bp_\b:_\b:_\bl_\bt (const T &first, const T &second, typename\n+ _\bE_\bp_\bs_\bi_\bl_\bo_\bn_\bT_\by_\bp_\be< T >::Type epsilon=_\bD_\be_\bf_\ba_\bu_\bl_\bt_\bE_\bp_\bs_\bi_\bl_\bo_\bn< T, _\bd_\be_\bf_\ba_\bu_\bl_\bt_\bC_\bm_\bp_\bS_\bt_\by_\bl_\be >::\n+ value())\n+\u00a0\n+template\n+bool\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bF_\bl_\bo_\ba_\bt_\bC_\bm_\bp_\b:_\b:_\bg_\be (const T &first, const T &second, typename\n+ _\bE_\bp_\bs_\bi_\bl_\bo_\bn_\bT_\by_\bp_\be< T >::Type epsilon=_\bD_\be_\bf_\ba_\bu_\bl_\bt_\bE_\bp_\bs_\bi_\bl_\bo_\bn< T, _\bd_\be_\bf_\ba_\bu_\bl_\bt_\bC_\bm_\bp_\bS_\bt_\by_\bl_\be >::\n+ value())\n+\u00a0\n+template\n+bool\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bF_\bl_\bo_\ba_\bt_\bC_\bm_\bp_\b:_\b:_\bl_\be (const T &first, const T &second, typename\n+ _\bE_\bp_\bs_\bi_\bl_\bo_\bn_\bT_\by_\bp_\be< T >::Type epsilon=_\bD_\be_\bf_\ba_\bu_\bl_\bt_\bE_\bp_\bs_\bi_\bl_\bo_\bn< T, _\bd_\be_\bf_\ba_\bu_\bl_\bt_\bC_\bm_\bp_\bS_\bt_\by_\bl_\be >::\n+ value())\n+\u00a0\n+template\n+ I\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bF_\bl_\bo_\ba_\bt_\bC_\bm_\bp_\b:_\b:_\br_\bo_\bu_\bn_\bd (const T &val, typename _\bE_\bp_\bs_\bi_\bl_\bo_\bn_\bT_\by_\bp_\be< T >::Type\n+ epsilon=_\bD_\be_\bf_\ba_\bu_\bl_\bt_\bE_\bp_\bs_\bi_\bl_\bo_\bn< T, cstyle >::value())\n+\u00a0 round using epsilon\n+\u00a0\n+template\n+ I\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bF_\bl_\bo_\ba_\bt_\bC_\bm_\bp_\b:_\b:_\br_\bo_\bu_\bn_\bd (const T &val, typename _\bE_\bp_\bs_\bi_\bl_\bo_\bn_\bT_\by_\bp_\be< T >::Type\n+ epsilon=_\bD_\be_\bf_\ba_\bu_\bl_\bt_\bE_\bp_\bs_\bi_\bl_\bo_\bn< T, cstyle >::value())\n+\u00a0\n+template\n+ I\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bF_\bl_\bo_\ba_\bt_\bC_\bm_\bp_\b:_\b:_\br_\bo_\bu_\bn_\bd (const T &val, typename _\bE_\bp_\bs_\bi_\bl_\bo_\bn_\bT_\by_\bp_\be< T >::Type\n+ epsilon=_\bD_\be_\bf_\ba_\bu_\bl_\bt_\bE_\bp_\bs_\bi_\bl_\bo_\bn< T, _\bd_\be_\bf_\ba_\bu_\bl_\bt_\bC_\bm_\bp_\bS_\bt_\by_\bl_\be >::value())\n+\u00a0\n+template\n+ I\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bF_\bl_\bo_\ba_\bt_\bC_\bm_\bp_\b:_\b:_\bt_\br_\bu_\bn_\bc (const T &val, typename _\bE_\bp_\bs_\bi_\bl_\bo_\bn_\bT_\by_\bp_\be< T >::Type\n+ epsilon=_\bD_\be_\bf_\ba_\bu_\bl_\bt_\bE_\bp_\bs_\bi_\bl_\bo_\bn< T, cstyle >::value())\n+\u00a0 truncate using epsilon\n+\u00a0\n+template\n+ I\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bF_\bl_\bo_\ba_\bt_\bC_\bm_\bp_\b:_\b:_\bt_\br_\bu_\bn_\bc (const T &val, typename _\bE_\bp_\bs_\bi_\bl_\bo_\bn_\bT_\by_\bp_\be< T >::Type\n+ epsilon=_\bD_\be_\bf_\ba_\bu_\bl_\bt_\bE_\bp_\bs_\bi_\bl_\bo_\bn< T, cstyle >::value())\n+\u00a0\n+template\n+ I\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bF_\bl_\bo_\ba_\bt_\bC_\bm_\bp_\b:_\b:_\bt_\br_\bu_\bn_\bc (const T &val, typename _\bE_\bp_\bs_\bi_\bl_\bo_\bn_\bT_\by_\bp_\be< T >::Type\n+ epsilon=_\bD_\be_\bf_\ba_\bu_\bl_\bt_\bE_\bp_\bs_\bi_\bl_\bo_\bn< T, _\bd_\be_\bf_\ba_\bu_\bl_\bt_\bC_\bm_\bp_\bS_\bt_\by_\bl_\be >::value())\n \u00a0\n ===============================================================================\n Generated by\u00a0_\b[_\bd_\bo_\bx_\by_\bg_\be_\bn_\b] 1.9.8\n"}]}, {"source1": "./usr/share/doc/libdune-common-doc/doxygen/a00158_source.html", "source2": "./usr/share/doc/libdune-common-doc/doxygen/a00158_source.html", "unified_diff": "@@ -1,15 +1,15 @@\n \n \n \n \n \n \n \n-dune-common: functional.hh Source File\n+dune-common: float_cmp.cc Source File\n \n \n \n \n \n \n \n@@ -70,56 +70,632 @@\n
    \n \n \n \n \n \n \n
    \n-
    functional.hh
    \n+
    float_cmp.cc
    \n
    \n
    \n-Go to the documentation of this file.
    1// -*- tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*-
    \n-
    2// vi: set ts=8 sw=2 et sts=2:
    \n+Go to the documentation of this file.
    1// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
    \n+
    2// vi: set et ts=4 sw=2 sts=2:
    \n
    3// SPDX-FileCopyrightInfo: Copyright \u00a9 DUNE Project contributors, see file LICENSE.md in module root
    \n
    4// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception
    \n-
    5#ifndef DUNE_COMMON_STD_FUNCTIONAL_HH
    \n-
    6#define DUNE_COMMON_STD_FUNCTIONAL_HH
    \n-
    7
    \n-
    8#include <functional>
    \n-
    9
    \n-
    10#include <dune-common-config.hh> // DUNE_HAVE_CXX_STD_IDENTITY
    \n-
    11
    \n-
    12namespace Dune
    \n-
    13{
    \n+
    5#include "float_cmp.hh"
    \n+
    6
    \n+
    7#include <vector>
    \n+
    8#include <limits>
    \n+
    9#include <algorithm>
    \n+
    10#include <cstdlib>
    \n+\n+
    12
    \n+
    13namespace Dune {
    \n
    14
    \n-
    15 namespace Std
    \n-
    16 {
    \n-
    17
    \n-
    24#if DUNE_HAVE_CXX_STD_IDENTITY
    \n-
    25 using std::identity;
    \n-
    26#else //DUNE_HAVE_CXX_STD_IDENTITY
    \n-
    \n-
    27 struct identity {
    \n-
    28 template<class T>
    \n-
    29 constexpr T&& operator()(T&& t ) const noexcept {return std::forward<T>(t);}
    \n-
    30 };
    \n-
    \n-
    31#endif
    \n-
    32 } // namespace Std
    \n-
    33
    \n-
    34} // namespace Dune
    \n-
    35
    \n-
    36#endif // #ifndef DUNE_COMMON_STD_FUNCTIONAL_HH
    \n+
    15
    \n+
    \n+
    16 namespace FloatCmp {
    \n+
    17 // traits
    \n+
    19
    \n+
    \n+
    23 template<class T> struct EpsilonType {
    \n+
    25 typedef T Type;
    \n+
    26 };
    \n+
    \n+
    28
    \n+
    33 template<class T, typename A>
    \n+
    \n+
    34 struct EpsilonType<std::vector<T, A> > {
    \n+
    36 typedef typename EpsilonType<T>::Type Type;
    \n+
    37 };
    \n+
    \n+
    39
    \n+
    44 template<class T, int n>
    \n+
    \n+
    45 struct EpsilonType<FieldVector<T, n> > {
    \n+
    47 typedef typename EpsilonType<T>::Type Type;
    \n+
    48 };
    \n+
    \n+
    49
    \n+
    50 // default epsilon
    \n+
    51 template<class T>
    \n+
    \n+\n+
    \n+
    53 static typename EpsilonType<T>::Type value()
    \n+
    54 { return std::numeric_limits<typename EpsilonType<T>::Type>::epsilon()*8.; }
    \n+
    \n+
    55 };
    \n+
    \n+
    56 template<class T>
    \n+
    \n+\n+
    \n+
    58 static typename EpsilonType<T>::Type value()
    \n+
    59 { return std::numeric_limits<typename EpsilonType<T>::Type>::epsilon()*8.; }
    \n+
    \n+
    60 };
    \n+
    \n+
    61 template<class T>
    \n+
    \n+\n+
    \n+
    63 static typename EpsilonType<T>::Type value()
    \n+
    64 { return std::max(std::numeric_limits<typename EpsilonType<T>::Type>::epsilon(), 1e-6); }
    \n+
    \n+
    65 };
    \n+
    \n+
    66
    \n+
    67 namespace Impl {
    \n+
    68 // basic comparison
    \n+
    69 template<class T, CmpStyle style = defaultCmpStyle>
    \n+
    70 struct eq_t;
    \n+
    71 template<class T>
    \n+
    72 struct eq_t<T, relativeWeak> {
    \n+
    73 static bool eq(const T &first,
    \n+
    74 const T &second,
    \n+\n+
    76 {
    \n+
    77 using std::abs;
    \n+
    78 return abs(first - second) <= epsilon*std::max(abs(first), abs(second));
    \n+
    79 }
    \n+
    80 };
    \n+
    81 template<class T>
    \n+
    82 struct eq_t<T, relativeStrong> {
    \n+
    83 static bool eq(const T &first,
    \n+
    84 const T &second,
    \n+\n+
    86 {
    \n+
    87 using std::abs;
    \n+
    88 return abs(first - second) <= epsilon*std::min(abs(first), abs(second));
    \n+
    89 }
    \n+
    90 };
    \n+
    91 template<class T>
    \n+
    92 struct eq_t<T, absolute> {
    \n+
    93 static bool eq(const T &first,
    \n+
    94 const T &second,
    \n+\n+
    96 {
    \n+
    97 using std::abs;
    \n+
    98 return abs(first-second) <= epsilon;
    \n+
    99 }
    \n+
    100 };
    \n+
    101 template<class T, CmpStyle cstyle>
    \n+
    102 struct eq_t_std_vec {
    \n+
    103 typedef std::vector<T> V;
    \n+
    104 static bool eq(const V &first,
    \n+
    105 const V &second,
    \n+
    106 typename EpsilonType<V>::Type epsilon = DefaultEpsilon<V>::value()) {
    \n+
    107 auto size = first.size();
    \n+
    108 if(size != second.size()) return false;
    \n+
    109 for(unsigned int i = 0; i < size; ++i)
    \n+
    110 if(!eq_t<T, cstyle>::eq(first[i], second[i], epsilon))
    \n+
    111 return false;
    \n+
    112 return true;
    \n+
    113 }
    \n+
    114 };
    \n+
    115 template< class T>
    \n+
    116 struct eq_t<std::vector<T>, relativeWeak> : eq_t_std_vec<T, relativeWeak> {};
    \n+
    117 template< class T>
    \n+
    118 struct eq_t<std::vector<T>, relativeStrong> : eq_t_std_vec<T, relativeStrong> {};
    \n+
    119 template< class T>
    \n+
    120 struct eq_t<std::vector<T>, absolute> : eq_t_std_vec<T, absolute> {};
    \n+
    121
    \n+
    122 template<class T, int n, CmpStyle cstyle>
    \n+
    123 struct eq_t_fvec {
    \n+
    124 typedef Dune::FieldVector<T, n> V;
    \n+
    125 static bool eq(const V &first,
    \n+
    126 const V &second,
    \n+
    127 typename EpsilonType<V>::Type epsilon = DefaultEpsilon<V>::value()) {
    \n+
    128 for(int i = 0; i < n; ++i)
    \n+
    129 if(!eq_t<T, cstyle>::eq(first[i], second[i], epsilon))
    \n+
    130 return false;
    \n+
    131 return true;
    \n+
    132 }
    \n+
    133 };
    \n+
    134 template< class T, int n >
    \n+
    135 struct eq_t< Dune::FieldVector<T, n>, relativeWeak> : eq_t_fvec<T, n, relativeWeak> {};
    \n+
    136 template< class T, int n >
    \n+
    137 struct eq_t< Dune::FieldVector<T, n>, relativeStrong> : eq_t_fvec<T, n, relativeStrong> {};
    \n+
    138 template< class T, int n >
    \n+
    139 struct eq_t< Dune::FieldVector<T, n>, absolute> : eq_t_fvec<T, n, absolute> {};
    \n+
    140 } // namespace Impl
    \n+
    141
    \n+
    142 // operations in functional style
    \n+
    143 template <class T, CmpStyle style>
    \n+
    \n+
    144 bool eq(const T &first,
    \n+
    145 const T &second,
    \n+
    146 typename EpsilonType<T>::Type epsilon)
    \n+
    147 {
    \n+
    148 return Impl::eq_t<T, style>::eq(first, second, epsilon);
    \n+
    149 }
    \n+
    \n+
    150 template <class T, CmpStyle style>
    \n+
    \n+
    151 bool ne(const T &first,
    \n+
    152 const T &second,
    \n+
    153 typename EpsilonType<T>::Type epsilon)
    \n+
    154 {
    \n+
    155 return !eq<T, style>(first, second, epsilon);
    \n+
    156 }
    \n+
    \n+
    157 template <class T, CmpStyle style>
    \n+
    \n+
    158 bool gt(const T &first,
    \n+
    159 const T &second,
    \n+
    160 typename EpsilonType<T>::Type epsilon)
    \n+
    161 {
    \n+
    162 return first > second && ne<T, style>(first, second, epsilon);
    \n+
    163 }
    \n+
    \n+
    164 template <class T, CmpStyle style>
    \n+
    \n+
    165 bool lt(const T &first,
    \n+
    166 const T &second,
    \n+
    167 typename EpsilonType<T>::Type epsilon)
    \n+
    168 {
    \n+
    169 return first < second && ne<T, style>(first, second, epsilon);
    \n+
    170 }
    \n+
    \n+
    171 template <class T, CmpStyle style>
    \n+
    \n+
    172 bool ge(const T &first,
    \n+
    173 const T &second,
    \n+
    174 typename EpsilonType<T>::Type epsilon)
    \n+
    175 {
    \n+
    176 return first > second || eq<T, style>(first, second, epsilon);
    \n+
    177 }
    \n+
    \n+
    178 template <class T, CmpStyle style>
    \n+
    \n+
    179 bool le(const T &first,
    \n+
    180 const T &second,
    \n+
    181 typename EpsilonType<T>::Type epsilon)
    \n+
    182 {
    \n+
    183 return first < second || eq<T, style>(first, second, epsilon);
    \n+
    184 }
    \n+
    \n+
    185
    \n+
    186 // default template arguments
    \n+
    187 template <class T>
    \n+
    \n+
    188 bool eq(const T &first,
    \n+
    189 const T &second,
    \n+\n+
    191 {
    \n+
    192 return eq<T, defaultCmpStyle>(first, second, epsilon);
    \n+
    193 }
    \n+
    \n+
    194 template <class T>
    \n+
    \n+
    195 bool ne(const T &first,
    \n+
    196 const T &second,
    \n+\n+
    198 {
    \n+
    199 return ne<T, defaultCmpStyle>(first, second, epsilon);
    \n+
    200 }
    \n+
    \n+
    201 template <class T>
    \n+
    \n+
    202 bool gt(const T &first,
    \n+
    203 const T &second,
    \n+\n+
    205 {
    \n+
    206 return gt<T, defaultCmpStyle>(first, second, epsilon);
    \n+
    207 }
    \n+
    \n+
    208 template <class T>
    \n+
    \n+
    209 bool lt(const T &first,
    \n+
    210 const T &second,
    \n+\n+
    212 {
    \n+
    213 return lt<T, defaultCmpStyle>(first, second, epsilon);
    \n+
    214 }
    \n+
    \n+
    215 template <class T>
    \n+
    \n+
    216 bool ge(const T &first,
    \n+
    217 const T &second,
    \n+\n+
    219 {
    \n+
    220 return ge<T, defaultCmpStyle>(first, second, epsilon);
    \n+
    221 }
    \n+
    \n+
    222 template <class T>
    \n+
    \n+
    223 bool le(const T &first,
    \n+
    224 const T &second,
    \n+\n+
    226 {
    \n+
    227 return le<T, defaultCmpStyle>(first, second, epsilon);
    \n+
    228 }
    \n+
    \n+
    229
    \n+
    230 // rounding operations
    \n+
    231 namespace Impl {
    \n+
    232 template<class I, class T, CmpStyle cstyle = defaultCmpStyle, RoundingStyle rstyle = defaultRoundingStyle>
    \n+
    233 struct round_t;
    \n+
    234 template<class I, class T, CmpStyle cstyle>
    \n+
    235 struct round_t<I, T, cstyle, downward> {
    \n+
    236 static I
    \n+
    237 round(const T &val,
    \n+\n+
    239 // first get an approximation
    \n+
    240 I lower = I(val);
    \n+
    241 I upper;
    \n+
    242 if(eq<T, cstyle>(T(lower), val, epsilon)) return lower;
    \n+
    243 if(T(lower) > val) { upper = lower; lower--; }
    \n+
    244 else upper = lower+1;
    \n+
    245 if(le<T, cstyle>(val - T(lower), T(upper) - val, epsilon))
    \n+
    246 return lower;
    \n+
    247 else return upper;
    \n+
    248 }
    \n+
    249 };
    \n+
    250 template<class I, class T, CmpStyle cstyle>
    \n+
    251 struct round_t<I, T, cstyle, upward> {
    \n+
    252 static I
    \n+
    253 round(const T &val,
    \n+\n+
    255 // first get an approximation
    \n+
    256 I lower = I(val);
    \n+
    257 I upper;
    \n+
    258 if(eq<T, cstyle>(T(lower), val, epsilon)) return lower;
    \n+
    259 if(T(lower) > val) { upper = lower; lower--; }
    \n+
    260 else upper = lower+1;
    \n+
    261 if(lt<T, cstyle>(val - T(lower), T(upper) - val, epsilon))
    \n+
    262 return lower;
    \n+
    263 else return upper;
    \n+
    264 }
    \n+
    265 };
    \n+
    266 template<class I, class T, CmpStyle cstyle>
    \n+
    267 struct round_t<I, T, cstyle, towardZero> {
    \n+
    268 static I
    \n+
    269 round(const T &val,
    \n+\n+
    271 if(val > T(0))
    \n+
    272 return round_t<I, T, cstyle, downward>::round(val, epsilon);
    \n+
    273 else return round_t<I, T, cstyle, upward>::round(val, epsilon);
    \n+
    274 }
    \n+
    275 };
    \n+
    276 template<class I, class T, CmpStyle cstyle>
    \n+
    277 struct round_t<I, T, cstyle, towardInf> {
    \n+
    278 static I
    \n+
    279 round(const T &val,
    \n+\n+
    281 if(val > T(0))
    \n+
    282 return round_t<I, T, cstyle, upward>::round(val, epsilon);
    \n+
    283 else return round_t<I, T, cstyle, downward>::round(val, epsilon);
    \n+
    284 }
    \n+
    285 };
    \n+
    286 template<class I, class T, CmpStyle cstyle, RoundingStyle rstyle>
    \n+
    287 struct round_t<std::vector<I>, std::vector<T>, cstyle, rstyle> {
    \n+
    288 static std::vector<I>
    \n+
    289 round(const T &val,
    \n+\n+
    291 unsigned int size = val.size();
    \n+
    292 std::vector<I> res(size);
    \n+
    293 for(unsigned int i = 0; i < size; ++i)
    \n+
    294 res[i] = round_t<I, T, cstyle, rstyle>::round(val[i], epsilon);
    \n+
    295 return res;
    \n+
    296 }
    \n+
    297 };
    \n+
    298 template<class I, class T, int n, CmpStyle cstyle, RoundingStyle rstyle>
    \n+
    299 struct round_t<Dune::FieldVector<I, n>, Dune::FieldVector<T, n>, cstyle, rstyle> {
    \n+\n+
    301 round(const T &val,
    \n+\n+\n+
    304 for(int i = 0; i < n; ++i)
    \n+
    305 res[i] = round_t<I, T, cstyle, rstyle>::round(val[i], epsilon);
    \n+
    306 return res;
    \n+
    307 }
    \n+
    308 };
    \n+
    309 } // end namespace Impl
    \n+
    310 template<class I, class T, CmpStyle cstyle, RoundingStyle rstyle>
    \n+
    \n+
    311 I round(const T &val, typename EpsilonType<T>::Type epsilon /*= DefaultEpsilon<T, cstyle>::value()*/)
    \n+
    312 {
    \n+
    313 return Impl::round_t<I, T, cstyle, rstyle>::round(val, epsilon);
    \n+
    314 }
    \n+
    \n+
    315 template<class I, class T, CmpStyle cstyle>
    \n+
    \n+
    316 I round(const T &val, typename EpsilonType<T>::Type epsilon = DefaultEpsilon<T, cstyle>::value())
    \n+
    317 {
    \n+
    318 return round<I, T, cstyle, defaultRoundingStyle>(val, epsilon);
    \n+
    319 }
    \n+
    \n+
    320 template<class I, class T, RoundingStyle rstyle>
    \n+
    321 I round(const T &val, typename EpsilonType<T>::Type epsilon = DefaultEpsilon<T, defaultCmpStyle>::value())
    \n+
    322 {
    \n+
    323 return round<I, T, defaultCmpStyle, rstyle>(val, epsilon);
    \n+
    324 }
    \n+
    325 template<class I, class T>
    \n+
    \n+\n+
    327 {
    \n+
    328 return round<I, T, defaultCmpStyle>(val, epsilon);
    \n+
    329 }
    \n+
    \n+
    330
    \n+
    331 // truncation
    \n+
    332 namespace Impl {
    \n+
    333 template<class I, class T, CmpStyle cstyle = defaultCmpStyle, RoundingStyle rstyle = defaultRoundingStyle>
    \n+
    334 struct trunc_t;
    \n+
    335 template<class I, class T, CmpStyle cstyle>
    \n+
    336 struct trunc_t<I, T, cstyle, downward> {
    \n+
    337 static I
    \n+
    338 trunc(const T &val,
    \n+\n+
    340 // this should be optimized away unless needed
    \n+
    341 if(!std::numeric_limits<I>::is_signed)
    \n+
    342 // make sure this works for all useful cases even if I is an unsigned type
    \n+
    343 if(eq<T, cstyle>(val, T(0), epsilon)) return I(0);
    \n+
    344 // first get an approximation
    \n+
    345 I lower = I(val); // now |val-lower| < 1
    \n+
    346 // make sure we're really lower in case the cast truncated to an unexpected direction
    \n+
    347 if(T(lower) > val) lower--; // now val-lower < 1
    \n+
    348 // check whether lower + 1 is approximately val
    \n+
    349 if(eq<T, cstyle>(T(lower+1), val, epsilon))
    \n+
    350 return lower+1;
    \n+
    351 else return lower;
    \n+
    352 }
    \n+
    353 };
    \n+
    354 template<class I, class T, CmpStyle cstyle>
    \n+
    355 struct trunc_t<I, T, cstyle, upward> {
    \n+
    356 static I
    \n+
    357 trunc(const T &val,
    \n+\n+
    359 I upper = trunc_t<I, T, cstyle, downward>::trunc(val, epsilon);
    \n+
    360 if(ne<T, cstyle>(T(upper), val, epsilon)) ++upper;
    \n+
    361 return upper;
    \n+
    362 }
    \n+
    363 };
    \n+
    364 template<class I, class T, CmpStyle cstyle>
    \n+
    365 struct trunc_t<I, T, cstyle, towardZero> {
    \n+
    366 static I
    \n+
    367 trunc(const T &val,
    \n+\n+
    369 if(val > T(0)) return trunc_t<I, T, cstyle, downward>::trunc(val, epsilon);
    \n+
    370 else return trunc_t<I, T, cstyle, upward>::trunc(val, epsilon);
    \n+
    371 }
    \n+
    372 };
    \n+
    373 template<class I, class T, CmpStyle cstyle>
    \n+
    374 struct trunc_t<I, T, cstyle, towardInf> {
    \n+
    375 static I
    \n+
    376 trunc(const T &val,
    \n+\n+
    378 if(val > T(0)) return trunc_t<I, T, cstyle, upward>::trunc(val, epsilon);
    \n+
    379 else return trunc_t<I, T, cstyle, downward>::trunc(val, epsilon);
    \n+
    380 }
    \n+
    381 };
    \n+
    382 template<class I, class T, CmpStyle cstyle, RoundingStyle rstyle>
    \n+
    383 struct trunc_t<std::vector<I>, std::vector<T>, cstyle, rstyle> {
    \n+
    384 static std::vector<I>
    \n+
    385 trunc(const std::vector<T> &val,
    \n+\n+
    387 unsigned int size = val.size();
    \n+
    388 std::vector<I> res(size);
    \n+
    389 for(unsigned int i = 0; i < size; ++i)
    \n+
    390 res[i] = trunc_t<I, T, cstyle, rstyle>::trunc(val[i], epsilon);
    \n+
    391 return res;
    \n+
    392 }
    \n+
    393 };
    \n+
    394 template<class I, class T, int n, CmpStyle cstyle, RoundingStyle rstyle>
    \n+
    395 struct trunc_t<Dune::FieldVector<I, n>, Dune::FieldVector<T, n>, cstyle, rstyle> {
    \n+\n+\n+\n+\n+
    400 for(int i = 0; i < n; ++i)
    \n+
    401 res[i] = trunc_t<I, T, cstyle, rstyle>::trunc(val[i], epsilon);
    \n+
    402 return res;
    \n+
    403 }
    \n+
    404 };
    \n+
    405 } // namespace Impl
    \n+
    406 template<class I, class T, CmpStyle cstyle, RoundingStyle rstyle>
    \n+
    \n+
    407 I trunc(const T &val, typename EpsilonType<T>::Type epsilon /*= DefaultEpsilon<T, cstyle>::value()*/)
    \n+
    408 {
    \n+
    409 return Impl::trunc_t<I, T, cstyle, rstyle>::trunc(val, epsilon);
    \n+
    410 }
    \n+
    \n+
    411 template<class I, class T, CmpStyle cstyle>
    \n+
    \n+
    412 I trunc(const T &val, typename EpsilonType<T>::Type epsilon = DefaultEpsilon<T, cstyle>::value())
    \n+
    413 {
    \n+
    414 return trunc<I, T, cstyle, defaultRoundingStyle>(val, epsilon);
    \n+
    415 }
    \n+
    \n+
    416 template<class I, class T, RoundingStyle rstyle>
    \n+
    417 I trunc(const T &val, typename EpsilonType<T>::Type epsilon = DefaultEpsilon<T, defaultCmpStyle>::value())
    \n+
    418 {
    \n+
    419 return trunc<I, T, defaultCmpStyle, rstyle>(val, epsilon);
    \n+
    420 }
    \n+
    421 template<class I, class T>
    \n+
    \n+\n+
    423 {
    \n+
    424 return trunc<I, T, defaultCmpStyle>(val, epsilon);
    \n+
    425 }
    \n+
    \n+
    426 } //namespace Dune
    \n+
    \n+
    427
    \n+
    428 // oo interface
    \n+
    429 template<class T, FloatCmp::CmpStyle cstyle_, FloatCmp::RoundingStyle rstyle_>
    \n+
    \n+\n+
    431 FloatCmpOps(EpsilonType epsilon) : epsilon_(epsilon) {}
    \n+
    \n+
    432
    \n+
    433
    \n+
    434 template<class T, FloatCmp::CmpStyle cstyle_, FloatCmp::RoundingStyle rstyle_>
    \n+\n+
    \n+\n+
    437 {
    \n+
    438 return epsilon_;
    \n+
    439 }
    \n+
    \n+
    440
    \n+
    441 template<class T, FloatCmp::CmpStyle cstyle_, FloatCmp::RoundingStyle rstyle_>
    \n+
    442 void
    \n+
    \n+\n+
    444 {
    \n+
    445 epsilon_ = epsilon__;
    \n+
    446 }
    \n+
    \n+
    447
    \n+
    448
    \n+
    449 template<class T, FloatCmp::CmpStyle cstyle_, FloatCmp::RoundingStyle rstyle_>
    \n+
    \n+\n+
    451 eq(const ValueType &first, const ValueType &second) const
    \n+
    452 {
    \n+
    453 return Dune::FloatCmp::eq<ValueType, cstyle>(first, second, epsilon_);
    \n+
    454 }
    \n+
    \n+
    455
    \n+
    456 template<class T, FloatCmp::CmpStyle cstyle_, FloatCmp::RoundingStyle rstyle_>
    \n+
    \n+\n+
    458 ne(const ValueType &first, const ValueType &second) const
    \n+
    459 {
    \n+
    460 return Dune::FloatCmp::ne<ValueType, cstyle>(first, second, epsilon_);
    \n+
    461 }
    \n+
    \n+
    462
    \n+
    463 template<class T, FloatCmp::CmpStyle cstyle_, FloatCmp::RoundingStyle rstyle_>
    \n+
    \n+\n+
    465 gt(const ValueType &first, const ValueType &second) const
    \n+
    466 {
    \n+
    467 return Dune::FloatCmp::gt<ValueType, cstyle>(first, second, epsilon_);
    \n+
    468 }
    \n+
    \n+
    469
    \n+
    470 template<class T, FloatCmp::CmpStyle cstyle_, FloatCmp::RoundingStyle rstyle_>
    \n+
    \n+\n+
    472 lt(const ValueType &first, const ValueType &second) const
    \n+
    473 {
    \n+
    474 return Dune::FloatCmp::lt<ValueType, cstyle>(first, second, epsilon_);
    \n+
    475 }
    \n+
    \n+
    476
    \n+
    477 template<class T, FloatCmp::CmpStyle cstyle_, FloatCmp::RoundingStyle rstyle_>
    \n+
    \n+\n+
    479 ge(const ValueType &first, const ValueType &second) const
    \n+
    480 {
    \n+
    481 return Dune::FloatCmp::ge<ValueType, cstyle>(first, second, epsilon_);
    \n+
    482 }
    \n+
    \n+
    483
    \n+
    484 template<class T, FloatCmp::CmpStyle cstyle_, FloatCmp::RoundingStyle rstyle_>
    \n+
    \n+\n+
    486 le(const ValueType &first, const ValueType &second) const
    \n+
    487 {
    \n+
    488 return Dune::FloatCmp::le<ValueType, cstyle>(first, second, epsilon_);
    \n+
    489 }
    \n+
    \n+
    490
    \n+
    491
    \n+
    492 template<class T, FloatCmp::CmpStyle cstyle_, FloatCmp::RoundingStyle rstyle_>
    \n+
    493 template<class I>
    \n+
    \n+\n+
    495 round(const ValueType &val) const
    \n+
    496 {
    \n+
    497 return Dune::FloatCmp::round<I, ValueType, cstyle, rstyle_>(val, epsilon_);
    \n+
    498 }
    \n+
    \n+
    499
    \n+
    500 template<class T, FloatCmp::CmpStyle cstyle_, FloatCmp::RoundingStyle rstyle_>
    \n+
    501 template<class I>
    \n+
    \n+\n+
    503 trunc(const ValueType &val) const
    \n+
    504 {
    \n+
    505 return Dune::FloatCmp::trunc<I, ValueType, cstyle, rstyle_>(val, epsilon_);
    \n+
    506 }
    \n+
    \n+
    507
    \n+
    508} //namespace Dune
    \n+
    Implements a vector constructed from a given type representing a field and a compile-time given size.
    \n+
    Various ways to compare floating-point numbers.
    \n+
    bool ne(const T &first, const T &second, typename EpsilonType< T >::Type epsilon)
    test for inequality using epsilon
    Definition float_cmp.cc:151
    \n+
    bool eq(const T &first, const T &second, typename EpsilonType< T >::Type epsilon)
    test for equality using epsilon
    Definition float_cmp.cc:144
    \n+
    I round(const T &val, typename EpsilonType< T >::Type epsilon)
    round using epsilon
    Definition float_cmp.cc:311
    \n+
    I trunc(const T &val, typename EpsilonType< T >::Type epsilon)
    truncate using epsilon
    Definition float_cmp.cc:407
    \n+
    bool lt(const T &first, const T &second, typename EpsilonType< T >::Type epsilon)
    test if first lesser than second
    Definition float_cmp.cc:165
    \n+
    bool gt(const T &first, const T &second, typename EpsilonType< T >::Type epsilon)
    test if first greater than second
    Definition float_cmp.cc:158
    \n+
    bool ge(const T &first, const T &second, typename EpsilonType< T >::Type epsilon)
    test if first greater or equal second
    Definition float_cmp.cc:172
    \n+
    bool le(const T &first, const T &second, typename EpsilonType< T >::Type epsilon)
    test if first lesser or equal second
    Definition float_cmp.cc:179
    \n+
    @ relativeStrong
    |a-b|/|a| <= epsilon && |a-b|/|b| <= epsilon
    Definition float_cmp.hh:108
    \n+
    @ relativeWeak
    |a-b|/|a| <= epsilon || |a-b|/|b| <= epsilon
    Definition float_cmp.hh:106
    \n+
    @ absolute
    |a-b| <= epsilon
    Definition float_cmp.hh:110
    \n+
    @ towardZero
    always round toward 0
    Definition float_cmp.hh:118
    \n+
    @ towardInf
    always round away from 0
    Definition float_cmp.hh:120
    \n+
    @ upward
    round toward
    Definition float_cmp.hh:124
    \n+
    @ downward
    round toward
    Definition float_cmp.hh:122
    \n+
    STL namespace.
    \n
    Dune namespace.
    Definition alignedallocator.hh:13
    \n-
    A function object type whose operator() returns its argument unchanged.
    Definition functional.hh:27
    \n-
    constexpr T && operator()(T &&t) const noexcept
    Definition functional.hh:29
    \n+
    constexpr std::integral_constant< std::size_t, sizeof...(II)> size(std::integer_sequence< T, II... >)
    Return the size of the sequence.
    Definition integersequence.hh:75
    \n+
    vector space out of a tensor product of fields.
    Definition fvector.hh:91
    \n+
    Mapping of value type to epsilon type.
    Definition float_cmp.cc:23
    \n+
    T Type
    The epsilon type corresponding to value type T.
    Definition float_cmp.cc:25
    \n+
    EpsilonType< T >::Type Type
    The epsilon type corresponding to value type std::vector<T, A>
    Definition float_cmp.cc:36
    \n+
    EpsilonType< T >::Type Type
    The epsilon type corresponding to value type Dune::FieldVector<T, n>
    Definition float_cmp.cc:47
    \n+
    static EpsilonType< T >::Type value()
    Definition float_cmp.cc:53
    \n+
    static EpsilonType< T >::Type value()
    Definition float_cmp.cc:58
    \n+
    static EpsilonType< T >::Type value()
    Definition float_cmp.cc:63
    \n+
    mapping from a value type and a compare style to a default epsilon
    Definition float_cmp.hh:138
    \n+
    static EpsilonType< T >::Type value()
    Returns the default epsilon for the given value type and compare style.
    \n+
    bool le(const ValueType &first, const ValueType &second) const
    test if first lesser or equal second
    Definition float_cmp.cc:486
    \n+
    FloatCmpOps(EpsilonType epsilon=DefaultEpsilon::value())
    construct an operations object
    Definition float_cmp.cc:431
    \n+
    bool eq(const ValueType &first, const ValueType &second) const
    test for equality using epsilon
    Definition float_cmp.cc:451
    \n+
    bool lt(const ValueType &first, const ValueType &second) const
    test if first lesser than second
    Definition float_cmp.cc:472
    \n+
    bool ge(const ValueType &first, const ValueType &second) const
    test if first greater or equal second
    Definition float_cmp.cc:479
    \n+
    FloatCmp::EpsilonType< T >::Type EpsilonType
    Type of the epsilon.
    Definition float_cmp.hh:304
    \n+
    bool ne(const ValueType &first, const ValueType &second) const
    test for inequality using epsilon
    Definition float_cmp.cc:458
    \n+
    T ValueType
    Type of the values to compare.
    Definition float_cmp.hh:299
    \n+
    EpsilonType epsilon() const
    return the current epsilon
    Definition float_cmp.cc:436
    \n+
    I round(const ValueType &val) const
    round using epsilon
    Definition float_cmp.cc:495
    \n+
    I trunc(const ValueType &val) const
    truncate using epsilon
    Definition float_cmp.cc:503
    \n+
    bool gt(const ValueType &first, const ValueType &second) const
    test if first greater than second
    Definition float_cmp.cc:465
    \n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,51 +1,712 @@\n dune-common\u00a02.10\n Loading...\n Searching...\n No Matches\n * _\bd_\bu_\bn_\be\n * _\bc_\bo_\bm_\bm_\bo_\bn\n- * _\bs_\bt_\bd\n-functional.hh\n+float_cmp.cc\n _\bG_\bo_\b _\bt_\bo_\b _\bt_\bh_\be_\b _\bd_\bo_\bc_\bu_\bm_\be_\bn_\bt_\ba_\bt_\bi_\bo_\bn_\b _\bo_\bf_\b _\bt_\bh_\bi_\bs_\b _\bf_\bi_\bl_\be_\b.\n-1// -*- tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*-\n-2// vi: set ts=8 sw=2 et sts=2:\n+1// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-\n+2// vi: set et ts=4 sw=2 sts=2:\n 3// SPDX-FileCopyrightInfo: Copyright \u00c2\u00a9 DUNE Project contributors, see file\n LICENSE.md in module root\n 4// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception\n-5#ifndef DUNE_COMMON_STD_FUNCTIONAL_HH\n-6#define DUNE_COMMON_STD_FUNCTIONAL_HH\n-7\n-8#include \n-9\n-10#include // DUNE_HAVE_CXX_STD_IDENTITY\n-11\n-12namespace _\bD_\bu_\bn_\be\n-13{\n+5#include \"_\bf_\bl_\bo_\ba_\bt_\b__\bc_\bm_\bp_\b._\bh_\bh\"\n+6\n+7#include \n+8#include \n+9#include \n+10#include \n+11#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bf_\bv_\be_\bc_\bt_\bo_\br_\b._\bh_\bh>\n+12\n+13namespace _\bD_\bu_\bn_\be {\n 14\n-15 namespace Std\n-16 {\n-17\n-24#if DUNE_HAVE_CXX_STD_IDENTITY\n-25 using std::identity;\n-26#else //DUNE_HAVE_CXX_STD_IDENTITY\n-_\b2_\b7 struct _\bi_\bd_\be_\bn_\bt_\bi_\bt_\by {\n-28 template\n-_\b2_\b9 constexpr T&& _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b(_\b)(T&& t ) const noexcept {return std::forward(t);}\n-30 };\n-31#endif\n-32 } // namespace Std\n-33\n-34} // namespace Dune\n-35\n-36#endif // #ifndef DUNE_COMMON_STD_FUNCTIONAL_HH\n+15\n+_\b1_\b6 namespace FloatCmp {\n+17 // traits\n+19\n+_\b2_\b3 template struct _\bE_\bp_\bs_\bi_\bl_\bo_\bn_\bT_\by_\bp_\be {\n+_\b2_\b5 typedef T _\bT_\by_\bp_\be;\n+26 };\n+28\n+33 template\n+_\b3_\b4 struct _\bE_\bp_\bs_\bi_\bl_\bo_\bn_\bT_\by_\bp_\be<_\bs_\bt_\bd::vector > {\n+_\b3_\b6 typedef typename _\bE_\bp_\bs_\bi_\bl_\bo_\bn_\bT_\by_\bp_\be_\b<_\bT_\b>_\b:_\b:_\bT_\by_\bp_\be _\bT_\by_\bp_\be;\n+37 };\n+39\n+44 template\n+_\b4_\b5 struct _\bE_\bp_\bs_\bi_\bl_\bo_\bn_\bT_\by_\bp_\be<_\bF_\bi_\be_\bl_\bd_\bV_\be_\bc_\bt_\bo_\br > {\n+_\b4_\b7 typedef typename _\bE_\bp_\bs_\bi_\bl_\bo_\bn_\bT_\by_\bp_\be_\b<_\bT_\b>_\b:_\b:_\bT_\by_\bp_\be _\bT_\by_\bp_\be;\n+48 };\n+49\n+50 // default epsilon\n+51 template\n+_\b5_\b2 struct _\bD_\be_\bf_\ba_\bu_\bl_\bt_\bE_\bp_\bs_\bi_\bl_\bo_\bn {\n+_\b5_\b3 static typename _\bE_\bp_\bs_\bi_\bl_\bo_\bn_\bT_\by_\bp_\be_\b<_\bT_\b>_\b:_\b:_\bT_\by_\bp_\be _\bv_\ba_\bl_\bu_\be()\n+54 { return std::numeric_limits::Type>::epsilon()*8.; }\n+55 };\n+56 template\n+_\b5_\b7 struct _\bD_\be_\bf_\ba_\bu_\bl_\bt_\bE_\bp_\bs_\bi_\bl_\bo_\bn {\n+_\b5_\b8 static typename _\bE_\bp_\bs_\bi_\bl_\bo_\bn_\bT_\by_\bp_\be_\b<_\bT_\b>_\b:_\b:_\bT_\by_\bp_\be _\bv_\ba_\bl_\bu_\be()\n+59 { return std::numeric_limits::Type>::epsilon()*8.; }\n+60 };\n+61 template\n+_\b6_\b2 struct _\bD_\be_\bf_\ba_\bu_\bl_\bt_\bE_\bp_\bs_\bi_\bl_\bo_\bn {\n+_\b6_\b3 static typename _\bE_\bp_\bs_\bi_\bl_\bo_\bn_\bT_\by_\bp_\be_\b<_\bT_\b>_\b:_\b:_\bT_\by_\bp_\be _\bv_\ba_\bl_\bu_\be()\n+64 { return std::max(std::numeric_limits_\b:_\b:_\bT_\by_\bp_\be>::\n+epsilon(), 1e-6); }\n+65 };\n+66\n+67 namespace Impl {\n+68 // basic comparison\n+69 template\n+70 struct eq_t;\n+71 template\n+72 struct eq_t {\n+73 static bool _\be_\bq(const T &first,\n+74 const T &second,\n+75 typename _\bE_\bp_\bs_\bi_\bl_\bo_\bn_\bT_\by_\bp_\be_\b<_\bT_\b>_\b:_\b:_\bT_\by_\bp_\be epsilon = _\bD_\be_\bf_\ba_\bu_\bl_\bt_\bE_\bp_\bs_\bi_\bl_\bo_\bn_\b<_\bT_\b>_\b:_\b:_\bv_\ba_\bl_\bu_\be())\n+76 {\n+77 using std::abs;\n+78 return abs(first - second) <= epsilon*std::max(abs(first), abs(second));\n+79 }\n+80 };\n+81 template\n+82 struct eq_t {\n+83 static bool _\be_\bq(const T &first,\n+84 const T &second,\n+85 typename _\bE_\bp_\bs_\bi_\bl_\bo_\bn_\bT_\by_\bp_\be_\b<_\bT_\b>_\b:_\b:_\bT_\by_\bp_\be epsilon = _\bD_\be_\bf_\ba_\bu_\bl_\bt_\bE_\bp_\bs_\bi_\bl_\bo_\bn_\b<_\bT_\b>_\b:_\b:_\bv_\ba_\bl_\bu_\be())\n+86 {\n+87 using std::abs;\n+88 return abs(first - second) <= epsilon*std::min(abs(first), abs(second));\n+89 }\n+90 };\n+91 template\n+92 struct eq_t {\n+93 static bool _\be_\bq(const T &first,\n+94 const T &second,\n+95 typename _\bE_\bp_\bs_\bi_\bl_\bo_\bn_\bT_\by_\bp_\be_\b<_\bT_\b>_\b:_\b:_\bT_\by_\bp_\be epsilon = _\bD_\be_\bf_\ba_\bu_\bl_\bt_\bE_\bp_\bs_\bi_\bl_\bo_\bn_\b<_\bT_\b>_\b:_\b:_\bv_\ba_\bl_\bu_\be())\n+96 {\n+97 using std::abs;\n+98 return abs(first-second) <= epsilon;\n+99 }\n+100 };\n+101 template\n+102 struct eq_t_std_vec {\n+103 typedef std::vector V;\n+104 static bool _\be_\bq(const V &first,\n+105 const V &second,\n+106 typename _\bE_\bp_\bs_\bi_\bl_\bo_\bn_\bT_\by_\bp_\be_\b<_\bV_\b>_\b:_\b:_\bT_\by_\bp_\be epsilon = _\bD_\be_\bf_\ba_\bu_\bl_\bt_\bE_\bp_\bs_\bi_\bl_\bo_\bn_\b<_\bV_\b>_\b:_\b:_\bv_\ba_\bl_\bu_\be()) {\n+107 auto _\bs_\bi_\bz_\be = first.size();\n+108 if(_\bs_\bi_\bz_\be != second.size()) return false;\n+109 for(unsigned int i = 0; i < _\bs_\bi_\bz_\be; ++i)\n+110 if(!eq_t::eq(first[i], second[i], epsilon))\n+111 return false;\n+112 return true;\n+113 }\n+114 };\n+115 template< class T>\n+116 struct eq_t<_\bs_\bt_\bd::vector, _\br_\be_\bl_\ba_\bt_\bi_\bv_\be_\bW_\be_\ba_\bk> : eq_t_std_vec\n+{};\n+117 template< class T>\n+118 struct eq_t<_\bs_\bt_\bd::vector, _\br_\be_\bl_\ba_\bt_\bi_\bv_\be_\bS_\bt_\br_\bo_\bn_\bg> : eq_t_std_vec {};\n+119 template< class T>\n+120 struct eq_t<_\bs_\bt_\bd::vector, _\ba_\bb_\bs_\bo_\bl_\bu_\bt_\be> : eq_t_std_vec {};\n+121\n+122 template\n+123 struct eq_t_fvec {\n+124 typedef _\bD_\bu_\bn_\be_\b:_\b:_\bF_\bi_\be_\bl_\bd_\bV_\be_\bc_\bt_\bo_\br_\b<_\bT_\b,_\b _\bn_\b> V;\n+125 static bool _\be_\bq(const V &first,\n+126 const V &second,\n+127 typename _\bE_\bp_\bs_\bi_\bl_\bo_\bn_\bT_\by_\bp_\be_\b<_\bV_\b>_\b:_\b:_\bT_\by_\bp_\be epsilon = _\bD_\be_\bf_\ba_\bu_\bl_\bt_\bE_\bp_\bs_\bi_\bl_\bo_\bn_\b<_\bV_\b>_\b:_\b:_\bv_\ba_\bl_\bu_\be()) {\n+128 for(int i = 0; i < n; ++i)\n+129 if(!eq_t::eq(first[i], second[i], epsilon))\n+130 return false;\n+131 return true;\n+132 }\n+133 };\n+134 template< class T, int n >\n+135 struct eq_t< _\bD_\bu_\bn_\be::FieldVector, _\br_\be_\bl_\ba_\bt_\bi_\bv_\be_\bW_\be_\ba_\bk> : eq_t_fvec {};\n+136 template< class T, int n >\n+137 struct eq_t< _\bD_\bu_\bn_\be::FieldVector, _\br_\be_\bl_\ba_\bt_\bi_\bv_\be_\bS_\bt_\br_\bo_\bn_\bg> : eq_t_fvec {};\n+138 template< class T, int n >\n+139 struct eq_t< _\bD_\bu_\bn_\be::FieldVector, _\ba_\bb_\bs_\bo_\bl_\bu_\bt_\be> : eq_t_fvec\n+{};\n+140 } // namespace Impl\n+141\n+142 // operations in functional style\n+143 template \n+_\b1_\b4_\b4 bool _\be_\bq(const T &first,\n+145 const T &second,\n+146 typename _\bE_\bp_\bs_\bi_\bl_\bo_\bn_\bT_\by_\bp_\be_\b<_\bT_\b>_\b:_\b:_\bT_\by_\bp_\be epsilon)\n+147 {\n+148 return Impl::eq_t::eq(first, second, epsilon);\n+149 }\n+150 template \n+_\b1_\b5_\b1 bool _\bn_\be(const T &first,\n+152 const T &second,\n+153 typename _\bE_\bp_\bs_\bi_\bl_\bo_\bn_\bT_\by_\bp_\be_\b<_\bT_\b>_\b:_\b:_\bT_\by_\bp_\be epsilon)\n+154 {\n+155 return !eq(first, second, epsilon);\n+156 }\n+157 template \n+_\b1_\b5_\b8 bool _\bg_\bt(const T &first,\n+159 const T &second,\n+160 typename _\bE_\bp_\bs_\bi_\bl_\bo_\bn_\bT_\by_\bp_\be_\b<_\bT_\b>_\b:_\b:_\bT_\by_\bp_\be epsilon)\n+161 {\n+162 return first > second && ne(first, second, epsilon);\n+163 }\n+164 template \n+_\b1_\b6_\b5 bool _\bl_\bt(const T &first,\n+166 const T &second,\n+167 typename _\bE_\bp_\bs_\bi_\bl_\bo_\bn_\bT_\by_\bp_\be_\b<_\bT_\b>_\b:_\b:_\bT_\by_\bp_\be epsilon)\n+168 {\n+169 return first < second && ne(first, second, epsilon);\n+170 }\n+171 template \n+_\b1_\b7_\b2 bool _\bg_\be(const T &first,\n+173 const T &second,\n+174 typename _\bE_\bp_\bs_\bi_\bl_\bo_\bn_\bT_\by_\bp_\be_\b<_\bT_\b>_\b:_\b:_\bT_\by_\bp_\be epsilon)\n+175 {\n+176 return first > second || eq(first, second, epsilon);\n+177 }\n+178 template \n+_\b1_\b7_\b9 bool _\bl_\be(const T &first,\n+180 const T &second,\n+181 typename _\bE_\bp_\bs_\bi_\bl_\bo_\bn_\bT_\by_\bp_\be_\b<_\bT_\b>_\b:_\b:_\bT_\by_\bp_\be epsilon)\n+182 {\n+183 return first < second || eq(first, second, epsilon);\n+184 }\n+185\n+186 // default template arguments\n+187 template \n+_\b1_\b8_\b8 bool _\be_\bq(const T &first,\n+189 const T &second,\n+190 typename _\bE_\bp_\bs_\bi_\bl_\bo_\bn_\bT_\by_\bp_\be_\b<_\bT_\b>_\b:_\b:_\bT_\by_\bp_\be epsilon = _\bD_\be_\bf_\ba_\bu_\bl_\bt_\bE_\bp_\bs_\bi_\bl_\bo_\bn_\b<_\bT_\b,\n+_\bd_\be_\bf_\ba_\bu_\bl_\bt_\bC_\bm_\bp_\bS_\bt_\by_\bl_\be_\b>_\b:_\b:_\bv_\ba_\bl_\bu_\be())\n+191 {\n+192 return eq(first, second, epsilon);\n+193 }\n+194 template \n+_\b1_\b9_\b5 bool _\bn_\be(const T &first,\n+196 const T &second,\n+197 typename _\bE_\bp_\bs_\bi_\bl_\bo_\bn_\bT_\by_\bp_\be_\b<_\bT_\b>_\b:_\b:_\bT_\by_\bp_\be epsilon = _\bD_\be_\bf_\ba_\bu_\bl_\bt_\bE_\bp_\bs_\bi_\bl_\bo_\bn_\b<_\bT_\b,\n+_\bd_\be_\bf_\ba_\bu_\bl_\bt_\bC_\bm_\bp_\bS_\bt_\by_\bl_\be_\b>_\b:_\b:_\bv_\ba_\bl_\bu_\be())\n+198 {\n+199 return ne(first, second, epsilon);\n+200 }\n+201 template \n+_\b2_\b0_\b2 bool _\bg_\bt(const T &first,\n+203 const T &second,\n+204 typename _\bE_\bp_\bs_\bi_\bl_\bo_\bn_\bT_\by_\bp_\be_\b<_\bT_\b>_\b:_\b:_\bT_\by_\bp_\be epsilon = _\bD_\be_\bf_\ba_\bu_\bl_\bt_\bE_\bp_\bs_\bi_\bl_\bo_\bn_\b<_\bT_\b,\n+_\bd_\be_\bf_\ba_\bu_\bl_\bt_\bC_\bm_\bp_\bS_\bt_\by_\bl_\be_\b>_\b:_\b:_\bv_\ba_\bl_\bu_\be())\n+205 {\n+206 return gt(first, second, epsilon);\n+207 }\n+208 template \n+_\b2_\b0_\b9 bool _\bl_\bt(const T &first,\n+210 const T &second,\n+211 typename _\bE_\bp_\bs_\bi_\bl_\bo_\bn_\bT_\by_\bp_\be_\b<_\bT_\b>_\b:_\b:_\bT_\by_\bp_\be epsilon = _\bD_\be_\bf_\ba_\bu_\bl_\bt_\bE_\bp_\bs_\bi_\bl_\bo_\bn_\b<_\bT_\b,\n+_\bd_\be_\bf_\ba_\bu_\bl_\bt_\bC_\bm_\bp_\bS_\bt_\by_\bl_\be_\b>_\b:_\b:_\bv_\ba_\bl_\bu_\be())\n+212 {\n+213 return lt(first, second, epsilon);\n+214 }\n+215 template \n+_\b2_\b1_\b6 bool _\bg_\be(const T &first,\n+217 const T &second,\n+218 typename _\bE_\bp_\bs_\bi_\bl_\bo_\bn_\bT_\by_\bp_\be_\b<_\bT_\b>_\b:_\b:_\bT_\by_\bp_\be epsilon = _\bD_\be_\bf_\ba_\bu_\bl_\bt_\bE_\bp_\bs_\bi_\bl_\bo_\bn_\b<_\bT_\b,\n+_\bd_\be_\bf_\ba_\bu_\bl_\bt_\bC_\bm_\bp_\bS_\bt_\by_\bl_\be_\b>_\b:_\b:_\bv_\ba_\bl_\bu_\be())\n+219 {\n+220 return ge(first, second, epsilon);\n+221 }\n+222 template \n+_\b2_\b2_\b3 bool _\bl_\be(const T &first,\n+224 const T &second,\n+225 typename _\bE_\bp_\bs_\bi_\bl_\bo_\bn_\bT_\by_\bp_\be_\b<_\bT_\b>_\b:_\b:_\bT_\by_\bp_\be epsilon = _\bD_\be_\bf_\ba_\bu_\bl_\bt_\bE_\bp_\bs_\bi_\bl_\bo_\bn_\b<_\bT_\b,\n+_\bd_\be_\bf_\ba_\bu_\bl_\bt_\bC_\bm_\bp_\bS_\bt_\by_\bl_\be_\b>_\b:_\b:_\bv_\ba_\bl_\bu_\be())\n+226 {\n+227 return le(first, second, epsilon);\n+228 }\n+229\n+230 // rounding operations\n+231 namespace Impl {\n+232 template\n+233 struct round_t;\n+234 template\n+235 struct round_t {\n+236 static I\n+237 _\br_\bo_\bu_\bn_\bd(const T &val,\n+238 typename _\bE_\bp_\bs_\bi_\bl_\bo_\bn_\bT_\by_\bp_\be_\b<_\bT_\b>_\b:_\b:_\bT_\by_\bp_\be epsilon = (_\bD_\be_\bf_\ba_\bu_\bl_\bt_\bE_\bp_\bs_\bi_\bl_\bo_\bn_\b<_\bT_\b,_\b _\bc_\bs_\bt_\by_\bl_\be_\b>_\b:_\b:_\bv_\ba_\bl_\bu_\be\n+())) {\n+239 // first get an approximation\n+240 I lower = I(val);\n+241 I upper;\n+242 if(eq(T(lower), val, epsilon)) return lower;\n+243 if(T(lower) > val) { upper = lower; lower--; }\n+244 else upper = lower+1;\n+245 if(le(val - T(lower), T(upper) - val, epsilon))\n+246 return lower;\n+247 else return upper;\n+248 }\n+249 };\n+250 template\n+251 struct round_t {\n+252 static I\n+253 _\br_\bo_\bu_\bn_\bd(const T &val,\n+254 typename _\bE_\bp_\bs_\bi_\bl_\bo_\bn_\bT_\by_\bp_\be_\b<_\bT_\b>_\b:_\b:_\bT_\by_\bp_\be epsilon = (_\bD_\be_\bf_\ba_\bu_\bl_\bt_\bE_\bp_\bs_\bi_\bl_\bo_\bn_\b<_\bT_\b,_\b _\bc_\bs_\bt_\by_\bl_\be_\b>_\b:_\b:_\bv_\ba_\bl_\bu_\be\n+())) {\n+255 // first get an approximation\n+256 I lower = I(val);\n+257 I upper;\n+258 if(eq(T(lower), val, epsilon)) return lower;\n+259 if(T(lower) > val) { upper = lower; lower--; }\n+260 else upper = lower+1;\n+261 if(lt(val - T(lower), T(upper) - val, epsilon))\n+262 return lower;\n+263 else return upper;\n+264 }\n+265 };\n+266 template\n+267 struct round_t {\n+268 static I\n+269 _\br_\bo_\bu_\bn_\bd(const T &val,\n+270 typename _\bE_\bp_\bs_\bi_\bl_\bo_\bn_\bT_\by_\bp_\be_\b<_\bT_\b>_\b:_\b:_\bT_\by_\bp_\be epsilon = (_\bD_\be_\bf_\ba_\bu_\bl_\bt_\bE_\bp_\bs_\bi_\bl_\bo_\bn_\b<_\bT_\b,_\b _\bc_\bs_\bt_\by_\bl_\be_\b>_\b:_\b:_\bv_\ba_\bl_\bu_\be\n+())) {\n+271 if(val > T(0))\n+272 return round_t::round(val, epsilon);\n+273 else return round_t::round(val, epsilon);\n+274 }\n+275 };\n+276 template\n+277 struct round_t {\n+278 static I\n+279 _\br_\bo_\bu_\bn_\bd(const T &val,\n+280 typename _\bE_\bp_\bs_\bi_\bl_\bo_\bn_\bT_\by_\bp_\be_\b<_\bT_\b>_\b:_\b:_\bT_\by_\bp_\be epsilon = (_\bD_\be_\bf_\ba_\bu_\bl_\bt_\bE_\bp_\bs_\bi_\bl_\bo_\bn_\b<_\bT_\b,_\b _\bc_\bs_\bt_\by_\bl_\be_\b>_\b:_\b:_\bv_\ba_\bl_\bu_\be\n+())) {\n+281 if(val > T(0))\n+282 return round_t::round(val, epsilon);\n+283 else return round_t::round(val, epsilon);\n+284 }\n+285 };\n+286 template\n+287 struct round_t<_\bs_\bt_\bd::vector, std::vector, cstyle, rstyle> {\n+288 static std::vector\n+289 _\br_\bo_\bu_\bn_\bd(const T &val,\n+290 typename _\bE_\bp_\bs_\bi_\bl_\bo_\bn_\bT_\by_\bp_\be_\b<_\bT_\b>_\b:_\b:_\bT_\by_\bp_\be epsilon = (_\bD_\be_\bf_\ba_\bu_\bl_\bt_\bE_\bp_\bs_\bi_\bl_\bo_\bn_\b<_\bT_\b,_\b _\bc_\bs_\bt_\by_\bl_\be_\b>_\b:_\b:_\bv_\ba_\bl_\bu_\be\n+())) {\n+291 unsigned int _\bs_\bi_\bz_\be = val.size();\n+292 std::vector res(_\bs_\bi_\bz_\be);\n+293 for(unsigned int i = 0; i < _\bs_\bi_\bz_\be; ++i)\n+294 res[i] = round_t::round(val[i], epsilon);\n+295 return res;\n+296 }\n+297 };\n+298 template\n+299 struct round_t<_\bD_\bu_\bn_\be::FieldVector, _\bD_\bu_\bn_\be_\b:_\b:_\bF_\bi_\be_\bl_\bd_\bV_\be_\bc_\bt_\bo_\br, cstyle,\n+rstyle> {\n+300 static _\bD_\bu_\bn_\be_\b:_\b:_\bF_\bi_\be_\bl_\bd_\bV_\be_\bc_\bt_\bo_\br_\b<_\bI_\b,_\b _\bn_\b>\n+301 _\br_\bo_\bu_\bn_\bd(const T &val,\n+302 typename _\bE_\bp_\bs_\bi_\bl_\bo_\bn_\bT_\by_\bp_\be_\b<_\bT_\b>_\b:_\b:_\bT_\by_\bp_\be epsilon = (_\bD_\be_\bf_\ba_\bu_\bl_\bt_\bE_\bp_\bs_\bi_\bl_\bo_\bn_\b<_\bT_\b,_\b _\bc_\bs_\bt_\by_\bl_\be_\b>_\b:_\b:_\bv_\ba_\bl_\bu_\be\n+())) {\n+303 _\bD_\bu_\bn_\be_\b:_\b:_\bF_\bi_\be_\bl_\bd_\bV_\be_\bc_\bt_\bo_\br_\b<_\bI_\b,_\b _\bn_\b> res;\n+304 for(int i = 0; i < n; ++i)\n+305 res[i] = round_t::round(val[i], epsilon);\n+306 return res;\n+307 }\n+308 };\n+309 } // end namespace Impl\n+310 template\n+_\b3_\b1_\b1 I _\br_\bo_\bu_\bn_\bd(const T &val, typename _\bE_\bp_\bs_\bi_\bl_\bo_\bn_\bT_\by_\bp_\be_\b<_\bT_\b>_\b:_\b:_\bT_\by_\bp_\be epsilon /*=\n+DefaultEpsilon::value()*/)\n+312 {\n+313 return Impl::round_t::round(val, epsilon);\n+314 }\n+315 template\n+_\b3_\b1_\b6 I _\br_\bo_\bu_\bn_\bd(const T &val, typename _\bE_\bp_\bs_\bi_\bl_\bo_\bn_\bT_\by_\bp_\be_\b<_\bT_\b>_\b:_\b:_\bT_\by_\bp_\be epsilon =\n+_\bD_\be_\bf_\ba_\bu_\bl_\bt_\bE_\bp_\bs_\bi_\bl_\bo_\bn_\b<_\bT_\b,_\b _\bc_\bs_\bt_\by_\bl_\be_\b>_\b:_\b:_\bv_\ba_\bl_\bu_\be())\n+317 {\n+318 return round(val, epsilon);\n+319 }\n+320 template\n+321 I _\br_\bo_\bu_\bn_\bd(const T &val, typename _\bE_\bp_\bs_\bi_\bl_\bo_\bn_\bT_\by_\bp_\be_\b<_\bT_\b>_\b:_\b:_\bT_\by_\bp_\be epsilon =\n+_\bD_\be_\bf_\ba_\bu_\bl_\bt_\bE_\bp_\bs_\bi_\bl_\bo_\bn_\b<_\bT_\b,_\b _\bd_\be_\bf_\ba_\bu_\bl_\bt_\bC_\bm_\bp_\bS_\bt_\by_\bl_\be_\b>_\b:_\b:_\bv_\ba_\bl_\bu_\be())\n+322 {\n+323 return round(val, epsilon);\n+324 }\n+325 template\n+_\b3_\b2_\b6 I _\br_\bo_\bu_\bn_\bd(const T &val, typename _\bE_\bp_\bs_\bi_\bl_\bo_\bn_\bT_\by_\bp_\be_\b<_\bT_\b>_\b:_\b:_\bT_\by_\bp_\be epsilon =\n+_\bD_\be_\bf_\ba_\bu_\bl_\bt_\bE_\bp_\bs_\bi_\bl_\bo_\bn_\b<_\bT_\b,_\b _\bd_\be_\bf_\ba_\bu_\bl_\bt_\bC_\bm_\bp_\bS_\bt_\by_\bl_\be_\b>_\b:_\b:_\bv_\ba_\bl_\bu_\be())\n+327 {\n+328 return round(val, epsilon);\n+329 }\n+330\n+331 // truncation\n+332 namespace Impl {\n+333 template\n+334 struct trunc_t;\n+335 template\n+336 struct trunc_t {\n+337 static I\n+338 _\bt_\br_\bu_\bn_\bc(const T &val,\n+339 typename _\bE_\bp_\bs_\bi_\bl_\bo_\bn_\bT_\by_\bp_\be_\b<_\bT_\b>_\b:_\b:_\bT_\by_\bp_\be epsilon = (_\bD_\be_\bf_\ba_\bu_\bl_\bt_\bE_\bp_\bs_\bi_\bl_\bo_\bn_\b<_\bT_\b,_\b _\bc_\bs_\bt_\by_\bl_\be_\b>_\b:_\b:_\bv_\ba_\bl_\bu_\be\n+())) {\n+340 // this should be optimized away unless needed\n+341 if(!std::numeric_limits::is_signed)\n+342 // make sure this works for all useful cases even if I is an unsigned type\n+343 if(eq(val, T(0), epsilon)) return I(0);\n+344 // first get an approximation\n+345 I lower = I(val); // now |val-lower| < 1\n+346 // make sure we're really lower in case the cast truncated to an unexpected\n+direction\n+347 if(T(lower) > val) lower--; // now val-lower < 1\n+348 // check whether lower + 1 is approximately val\n+349 if(eq(T(lower+1), val, epsilon))\n+350 return lower+1;\n+351 else return lower;\n+352 }\n+353 };\n+354 template\n+355 struct trunc_t {\n+356 static I\n+357 _\bt_\br_\bu_\bn_\bc(const T &val,\n+358 typename _\bE_\bp_\bs_\bi_\bl_\bo_\bn_\bT_\by_\bp_\be_\b<_\bT_\b>_\b:_\b:_\bT_\by_\bp_\be epsilon = (_\bD_\be_\bf_\ba_\bu_\bl_\bt_\bE_\bp_\bs_\bi_\bl_\bo_\bn_\b<_\bT_\b,_\b _\bc_\bs_\bt_\by_\bl_\be_\b>_\b:_\b:_\bv_\ba_\bl_\bu_\be\n+())) {\n+359 I upper = trunc_t::trunc(val, epsilon);\n+360 if(ne(T(upper), val, epsilon)) ++upper;\n+361 return upper;\n+362 }\n+363 };\n+364 template\n+365 struct trunc_t {\n+366 static I\n+367 _\bt_\br_\bu_\bn_\bc(const T &val,\n+368 typename _\bE_\bp_\bs_\bi_\bl_\bo_\bn_\bT_\by_\bp_\be_\b<_\bT_\b>_\b:_\b:_\bT_\by_\bp_\be epsilon = (_\bD_\be_\bf_\ba_\bu_\bl_\bt_\bE_\bp_\bs_\bi_\bl_\bo_\bn_\b<_\bT_\b,_\b _\bc_\bs_\bt_\by_\bl_\be_\b>_\b:_\b:_\bv_\ba_\bl_\bu_\be\n+())) {\n+369 if(val > T(0)) return trunc_t::trunc(val, epsilon);\n+370 else return trunc_t::trunc(val, epsilon);\n+371 }\n+372 };\n+373 template\n+374 struct trunc_t {\n+375 static I\n+376 _\bt_\br_\bu_\bn_\bc(const T &val,\n+377 typename _\bE_\bp_\bs_\bi_\bl_\bo_\bn_\bT_\by_\bp_\be_\b<_\bT_\b>_\b:_\b:_\bT_\by_\bp_\be epsilon = (_\bD_\be_\bf_\ba_\bu_\bl_\bt_\bE_\bp_\bs_\bi_\bl_\bo_\bn_\b<_\bT_\b,_\b _\bc_\bs_\bt_\by_\bl_\be_\b>_\b:_\b:_\bv_\ba_\bl_\bu_\be\n+())) {\n+378 if(val > T(0)) return trunc_t::trunc(val, epsilon);\n+379 else return trunc_t::trunc(val, epsilon);\n+380 }\n+381 };\n+382 template\n+383 struct trunc_t<_\bs_\bt_\bd::vector, std::vector, cstyle, rstyle> {\n+384 static std::vector\n+385 _\bt_\br_\bu_\bn_\bc(const std::vector &val,\n+386 typename _\bE_\bp_\bs_\bi_\bl_\bo_\bn_\bT_\by_\bp_\be_\b<_\bT_\b>_\b:_\b:_\bT_\by_\bp_\be epsilon = (_\bD_\be_\bf_\ba_\bu_\bl_\bt_\bE_\bp_\bs_\bi_\bl_\bo_\bn_\b<_\bT_\b,_\b _\bc_\bs_\bt_\by_\bl_\be_\b>_\b:_\b:_\bv_\ba_\bl_\bu_\be\n+())) {\n+387 unsigned int _\bs_\bi_\bz_\be = val.size();\n+388 std::vector res(_\bs_\bi_\bz_\be);\n+389 for(unsigned int i = 0; i < _\bs_\bi_\bz_\be; ++i)\n+390 res[i] = trunc_t::trunc(val[i], epsilon);\n+391 return res;\n+392 }\n+393 };\n+394 template\n+395 struct trunc_t<_\bD_\bu_\bn_\be::FieldVector, _\bD_\bu_\bn_\be_\b:_\b:_\bF_\bi_\be_\bl_\bd_\bV_\be_\bc_\bt_\bo_\br, cstyle,\n+rstyle> {\n+396 static _\bD_\bu_\bn_\be_\b:_\b:_\bF_\bi_\be_\bl_\bd_\bV_\be_\bc_\bt_\bo_\br_\b<_\bI_\b,_\b _\bn_\b>\n+397 _\bt_\br_\bu_\bn_\bc(const _\bD_\bu_\bn_\be_\b:_\b:_\bF_\bi_\be_\bl_\bd_\bV_\be_\bc_\bt_\bo_\br_\b<_\bT_\b,_\b _\bn_\b> &val,\n+398 typename _\bE_\bp_\bs_\bi_\bl_\bo_\bn_\bT_\by_\bp_\be_\b<_\bT_\b>_\b:_\b:_\bT_\by_\bp_\be epsilon = (_\bD_\be_\bf_\ba_\bu_\bl_\bt_\bE_\bp_\bs_\bi_\bl_\bo_\bn_\b<_\bT_\b,_\b _\bc_\bs_\bt_\by_\bl_\be_\b>_\b:_\b:_\bv_\ba_\bl_\bu_\be\n+())) {\n+399 _\bD_\bu_\bn_\be_\b:_\b:_\bF_\bi_\be_\bl_\bd_\bV_\be_\bc_\bt_\bo_\br_\b<_\bI_\b,_\b _\bn_\b> res;\n+400 for(int i = 0; i < n; ++i)\n+401 res[i] = trunc_t::trunc(val[i], epsilon);\n+402 return res;\n+403 }\n+404 };\n+405 } // namespace Impl\n+406 template\n+_\b4_\b0_\b7 I _\bt_\br_\bu_\bn_\bc(const T &val, typename _\bE_\bp_\bs_\bi_\bl_\bo_\bn_\bT_\by_\bp_\be_\b<_\bT_\b>_\b:_\b:_\bT_\by_\bp_\be epsilon /*=\n+DefaultEpsilon::value()*/)\n+408 {\n+409 return Impl::trunc_t::trunc(val, epsilon);\n+410 }\n+411 template\n+_\b4_\b1_\b2 I _\bt_\br_\bu_\bn_\bc(const T &val, typename _\bE_\bp_\bs_\bi_\bl_\bo_\bn_\bT_\by_\bp_\be_\b<_\bT_\b>_\b:_\b:_\bT_\by_\bp_\be epsilon =\n+_\bD_\be_\bf_\ba_\bu_\bl_\bt_\bE_\bp_\bs_\bi_\bl_\bo_\bn_\b<_\bT_\b,_\b _\bc_\bs_\bt_\by_\bl_\be_\b>_\b:_\b:_\bv_\ba_\bl_\bu_\be())\n+413 {\n+414 return trunc(val, epsilon);\n+415 }\n+416 template\n+417 I _\bt_\br_\bu_\bn_\bc(const T &val, typename _\bE_\bp_\bs_\bi_\bl_\bo_\bn_\bT_\by_\bp_\be_\b<_\bT_\b>_\b:_\b:_\bT_\by_\bp_\be epsilon =\n+_\bD_\be_\bf_\ba_\bu_\bl_\bt_\bE_\bp_\bs_\bi_\bl_\bo_\bn_\b<_\bT_\b,_\b _\bd_\be_\bf_\ba_\bu_\bl_\bt_\bC_\bm_\bp_\bS_\bt_\by_\bl_\be_\b>_\b:_\b:_\bv_\ba_\bl_\bu_\be())\n+418 {\n+419 return trunc(val, epsilon);\n+420 }\n+421 template\n+_\b4_\b2_\b2 I _\bt_\br_\bu_\bn_\bc(const T &val, typename _\bE_\bp_\bs_\bi_\bl_\bo_\bn_\bT_\by_\bp_\be_\b<_\bT_\b>_\b:_\b:_\bT_\by_\bp_\be epsilon =\n+_\bD_\be_\bf_\ba_\bu_\bl_\bt_\bE_\bp_\bs_\bi_\bl_\bo_\bn_\b<_\bT_\b,_\b _\bd_\be_\bf_\ba_\bu_\bl_\bt_\bC_\bm_\bp_\bS_\bt_\by_\bl_\be_\b>_\b:_\b:_\bv_\ba_\bl_\bu_\be())\n+423 {\n+424 return trunc(val, epsilon);\n+425 }\n+426 } //namespace Dune\n+427\n+428 // oo interface\n+429 template\n+_\b4_\b3_\b0 _\bF_\bl_\bo_\ba_\bt_\bC_\bm_\bp_\bO_\bp_\bs_\b<_\bT_\b,_\b _\bc_\bs_\bt_\by_\bl_\be_\b__\b,_\b _\br_\bs_\bt_\by_\bl_\be_\b__\b>_\b:_\b:\n+431_\b _\bF_\bl_\bo_\ba_\bt_\bC_\bm_\bp_\bO_\bp_\bs(_\bE_\bp_\bs_\bi_\bl_\bo_\bn_\bT_\by_\bp_\be epsilon) : epsilon_(epsilon) {}\n+432\n+433\n+434 template\n+435 typename _\bF_\bl_\bo_\ba_\bt_\bC_\bm_\bp_\bO_\bp_\bs_\b<_\bT_\b,_\b _\bc_\bs_\bt_\by_\bl_\be_\b__\b,_\b _\br_\bs_\bt_\by_\bl_\be_\b__\b>_\b:_\b:_\bE_\bp_\bs_\bi_\bl_\bo_\bn_\bT_\by_\bp_\be\n+_\b4_\b3_\b6 _\bF_\bl_\bo_\ba_\bt_\bC_\bm_\bp_\bO_\bp_\bs_\b<_\bT_\b,_\b _\bc_\bs_\bt_\by_\bl_\be_\b__\b,_\b _\br_\bs_\bt_\by_\bl_\be_\b__\b>_\b:_\b:_\be_\bp_\bs_\bi_\bl_\bo_\bn() const\n+437 {\n+438 return epsilon_;\n+439 }\n+440\n+441 template\n+442 void\n+_\b4_\b4_\b3 _\bF_\bl_\bo_\ba_\bt_\bC_\bm_\bp_\bO_\bp_\bs_\b<_\bT_\b,_\b _\bc_\bs_\bt_\by_\bl_\be_\b__\b,_\b _\br_\bs_\bt_\by_\bl_\be_\b__\b>_\b:_\b:_\be_\bp_\bs_\bi_\bl_\bo_\bn(_\bE_\bp_\bs_\bi_\bl_\bo_\bn_\bT_\by_\bp_\be epsilon__)\n+444 {\n+445 epsilon_ = epsilon__;\n+446 }\n+447\n+448\n+449 template\n+_\b4_\b5_\b0 bool _\bF_\bl_\bo_\ba_\bt_\bC_\bm_\bp_\bO_\bp_\bs_\b<_\bT_\b,_\b _\bc_\bs_\bt_\by_\bl_\be_\b__\b,_\b _\br_\bs_\bt_\by_\bl_\be_\b__\b>_\b:_\b:\n+451_\b _\be_\bq(const _\bV_\ba_\bl_\bu_\be_\bT_\by_\bp_\be &first, const _\bV_\ba_\bl_\bu_\be_\bT_\by_\bp_\be &second) const\n+452 {\n+453 return Dune::FloatCmp::eq(first, second, epsilon_);\n+454 }\n+455\n+456 template\n+_\b4_\b5_\b7 bool _\bF_\bl_\bo_\ba_\bt_\bC_\bm_\bp_\bO_\bp_\bs_\b<_\bT_\b,_\b _\bc_\bs_\bt_\by_\bl_\be_\b__\b,_\b _\br_\bs_\bt_\by_\bl_\be_\b__\b>_\b:_\b:\n+458_\b _\bn_\be(const _\bV_\ba_\bl_\bu_\be_\bT_\by_\bp_\be &first, const _\bV_\ba_\bl_\bu_\be_\bT_\by_\bp_\be &second) const\n+459 {\n+460 return Dune::FloatCmp::ne(first, second, epsilon_);\n+461 }\n+462\n+463 template\n+_\b4_\b6_\b4 bool _\bF_\bl_\bo_\ba_\bt_\bC_\bm_\bp_\bO_\bp_\bs_\b<_\bT_\b,_\b _\bc_\bs_\bt_\by_\bl_\be_\b__\b,_\b _\br_\bs_\bt_\by_\bl_\be_\b__\b>_\b:_\b:\n+465_\b _\bg_\bt(const _\bV_\ba_\bl_\bu_\be_\bT_\by_\bp_\be &first, const _\bV_\ba_\bl_\bu_\be_\bT_\by_\bp_\be &second) const\n+466 {\n+467 return Dune::FloatCmp::gt(first, second, epsilon_);\n+468 }\n+469\n+470 template\n+_\b4_\b7_\b1 bool _\bF_\bl_\bo_\ba_\bt_\bC_\bm_\bp_\bO_\bp_\bs_\b<_\bT_\b,_\b _\bc_\bs_\bt_\by_\bl_\be_\b__\b,_\b _\br_\bs_\bt_\by_\bl_\be_\b__\b>_\b:_\b:\n+472_\b _\bl_\bt(const _\bV_\ba_\bl_\bu_\be_\bT_\by_\bp_\be &first, const _\bV_\ba_\bl_\bu_\be_\bT_\by_\bp_\be &second) const\n+473 {\n+474 return Dune::FloatCmp::lt(first, second, epsilon_);\n+475 }\n+476\n+477 template\n+_\b4_\b7_\b8 bool _\bF_\bl_\bo_\ba_\bt_\bC_\bm_\bp_\bO_\bp_\bs_\b<_\bT_\b,_\b _\bc_\bs_\bt_\by_\bl_\be_\b__\b,_\b _\br_\bs_\bt_\by_\bl_\be_\b__\b>_\b:_\b:\n+479_\b _\bg_\be(const _\bV_\ba_\bl_\bu_\be_\bT_\by_\bp_\be &first, const _\bV_\ba_\bl_\bu_\be_\bT_\by_\bp_\be &second) const\n+480 {\n+481 return Dune::FloatCmp::ge(first, second, epsilon_);\n+482 }\n+483\n+484 template\n+_\b4_\b8_\b5 bool _\bF_\bl_\bo_\ba_\bt_\bC_\bm_\bp_\bO_\bp_\bs_\b<_\bT_\b,_\b _\bc_\bs_\bt_\by_\bl_\be_\b__\b,_\b _\br_\bs_\bt_\by_\bl_\be_\b__\b>_\b:_\b:\n+486_\b _\bl_\be(const _\bV_\ba_\bl_\bu_\be_\bT_\by_\bp_\be &first, const _\bV_\ba_\bl_\bu_\be_\bT_\by_\bp_\be &second) const\n+487 {\n+488 return Dune::FloatCmp::le(first, second, epsilon_);\n+489 }\n+490\n+491\n+492 template\n+493 template\n+_\b4_\b9_\b4 I _\bF_\bl_\bo_\ba_\bt_\bC_\bm_\bp_\bO_\bp_\bs_\b<_\bT_\b,_\b _\bc_\bs_\bt_\by_\bl_\be_\b__\b,_\b _\br_\bs_\bt_\by_\bl_\be_\b__\b>_\b:_\b:\n+495_\b _\br_\bo_\bu_\bn_\bd(const _\bV_\ba_\bl_\bu_\be_\bT_\by_\bp_\be &val) const\n+496 {\n+497 return Dune::FloatCmp::round(val, epsilon_);\n+498 }\n+499\n+500 template\n+501 template\n+_\b5_\b0_\b2 I _\bF_\bl_\bo_\ba_\bt_\bC_\bm_\bp_\bO_\bp_\bs_\b<_\bT_\b,_\b _\bc_\bs_\bt_\by_\bl_\be_\b__\b,_\b _\br_\bs_\bt_\by_\bl_\be_\b__\b>_\b:_\b:\n+503_\b _\bt_\br_\bu_\bn_\bc(const _\bV_\ba_\bl_\bu_\be_\bT_\by_\bp_\be &val) const\n+504 {\n+505 return Dune::FloatCmp::trunc(val, epsilon_);\n+506 }\n+507\n+508} //namespace Dune\n+_\bf_\bv_\be_\bc_\bt_\bo_\br_\b._\bh_\bh\n+Implements a vector constructed from a given type representing a field and a\n+compile-time given size.\n+_\bf_\bl_\bo_\ba_\bt_\b__\bc_\bm_\bp_\b._\bh_\bh\n+Various ways to compare floating-point numbers.\n+_\bD_\bu_\bn_\be_\b:_\b:_\bF_\bl_\bo_\ba_\bt_\bC_\bm_\bp_\b:_\b:_\bn_\be\n+bool ne(const T &first, const T &second, typename EpsilonType< T >::Type\n+epsilon)\n+test for inequality using epsilon\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn float_cmp.cc:151\n+_\bD_\bu_\bn_\be_\b:_\b:_\bF_\bl_\bo_\ba_\bt_\bC_\bm_\bp_\b:_\b:_\be_\bq\n+bool eq(const T &first, const T &second, typename EpsilonType< T >::Type\n+epsilon)\n+test for equality using epsilon\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn float_cmp.cc:144\n+_\bD_\bu_\bn_\be_\b:_\b:_\bF_\bl_\bo_\ba_\bt_\bC_\bm_\bp_\b:_\b:_\br_\bo_\bu_\bn_\bd\n+I round(const T &val, typename EpsilonType< T >::Type epsilon)\n+round using epsilon\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn float_cmp.cc:311\n+_\bD_\bu_\bn_\be_\b:_\b:_\bF_\bl_\bo_\ba_\bt_\bC_\bm_\bp_\b:_\b:_\bt_\br_\bu_\bn_\bc\n+I trunc(const T &val, typename EpsilonType< T >::Type epsilon)\n+truncate using epsilon\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn float_cmp.cc:407\n+_\bD_\bu_\bn_\be_\b:_\b:_\bF_\bl_\bo_\ba_\bt_\bC_\bm_\bp_\b:_\b:_\bl_\bt\n+bool lt(const T &first, const T &second, typename EpsilonType< T >::Type\n+epsilon)\n+test if first lesser than second\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn float_cmp.cc:165\n+_\bD_\bu_\bn_\be_\b:_\b:_\bF_\bl_\bo_\ba_\bt_\bC_\bm_\bp_\b:_\b:_\bg_\bt\n+bool gt(const T &first, const T &second, typename EpsilonType< T >::Type\n+epsilon)\n+test if first greater than second\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn float_cmp.cc:158\n+_\bD_\bu_\bn_\be_\b:_\b:_\bF_\bl_\bo_\ba_\bt_\bC_\bm_\bp_\b:_\b:_\bg_\be\n+bool ge(const T &first, const T &second, typename EpsilonType< T >::Type\n+epsilon)\n+test if first greater or equal second\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn float_cmp.cc:172\n+_\bD_\bu_\bn_\be_\b:_\b:_\bF_\bl_\bo_\ba_\bt_\bC_\bm_\bp_\b:_\b:_\bl_\be\n+bool le(const T &first, const T &second, typename EpsilonType< T >::Type\n+epsilon)\n+test if first lesser or equal second\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn float_cmp.cc:179\n+_\bD_\bu_\bn_\be_\b:_\b:_\bF_\bl_\bo_\ba_\bt_\bC_\bm_\bp_\b:_\b:_\br_\be_\bl_\ba_\bt_\bi_\bv_\be_\bS_\bt_\br_\bo_\bn_\bg\n+@ relativeStrong\n+|a-b|/|a| <= epsilon && |a-b|/|b| <= epsilon\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn float_cmp.hh:108\n+_\bD_\bu_\bn_\be_\b:_\b:_\bF_\bl_\bo_\ba_\bt_\bC_\bm_\bp_\b:_\b:_\br_\be_\bl_\ba_\bt_\bi_\bv_\be_\bW_\be_\ba_\bk\n+@ relativeWeak\n+|a-b|/|a| <= epsilon || |a-b|/|b| <= epsilon\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn float_cmp.hh:106\n+_\bD_\bu_\bn_\be_\b:_\b:_\bF_\bl_\bo_\ba_\bt_\bC_\bm_\bp_\b:_\b:_\ba_\bb_\bs_\bo_\bl_\bu_\bt_\be\n+@ absolute\n+|a-b| <= epsilon\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn float_cmp.hh:110\n+_\bD_\bu_\bn_\be_\b:_\b:_\bF_\bl_\bo_\ba_\bt_\bC_\bm_\bp_\b:_\b:_\bt_\bo_\bw_\ba_\br_\bd_\bZ_\be_\br_\bo\n+@ towardZero\n+always round toward 0\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn float_cmp.hh:118\n+_\bD_\bu_\bn_\be_\b:_\b:_\bF_\bl_\bo_\ba_\bt_\bC_\bm_\bp_\b:_\b:_\bt_\bo_\bw_\ba_\br_\bd_\bI_\bn_\bf\n+@ towardInf\n+always round away from 0\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn float_cmp.hh:120\n+_\bD_\bu_\bn_\be_\b:_\b:_\bF_\bl_\bo_\ba_\bt_\bC_\bm_\bp_\b:_\b:_\bu_\bp_\bw_\ba_\br_\bd\n+@ upward\n+round toward\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn float_cmp.hh:124\n+_\bD_\bu_\bn_\be_\b:_\b:_\bF_\bl_\bo_\ba_\bt_\bC_\bm_\bp_\b:_\b:_\bd_\bo_\bw_\bn_\bw_\ba_\br_\bd\n+@ downward\n+round toward\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn float_cmp.hh:122\n+_\bs_\bt_\bd\n+STL namespace.\n _\bD_\bu_\bn_\be\n Dune namespace.\n D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn alignedallocator.hh:13\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bt_\bd_\b:_\b:_\bi_\bd_\be_\bn_\bt_\bi_\bt_\by\n-A function object type whose operator() returns its argument unchanged.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn functional.hh:27\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bt_\bd_\b:_\b:_\bi_\bd_\be_\bn_\bt_\bi_\bt_\by_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b(_\b)\n-constexpr T && operator()(T &&t) const noexcept\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn functional.hh:29\n+_\bD_\bu_\bn_\be_\b:_\b:_\bs_\bi_\bz_\be\n+constexpr std::integral_constant< std::size_t, sizeof...(II)> size(std::\n+integer_sequence< T, II... >)\n+Return the size of the sequence.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn integersequence.hh:75\n+_\bD_\bu_\bn_\be_\b:_\b:_\bF_\bi_\be_\bl_\bd_\bV_\be_\bc_\bt_\bo_\br\n+vector space out of a tensor product of fields.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn fvector.hh:91\n+_\bD_\bu_\bn_\be_\b:_\b:_\bF_\bl_\bo_\ba_\bt_\bC_\bm_\bp_\b:_\b:_\bE_\bp_\bs_\bi_\bl_\bo_\bn_\bT_\by_\bp_\be\n+Mapping of value type to epsilon type.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn float_cmp.cc:23\n+_\bD_\bu_\bn_\be_\b:_\b:_\bF_\bl_\bo_\ba_\bt_\bC_\bm_\bp_\b:_\b:_\bE_\bp_\bs_\bi_\bl_\bo_\bn_\bT_\by_\bp_\be_\b:_\b:_\bT_\by_\bp_\be\n+T Type\n+The epsilon type corresponding to value type T.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn float_cmp.cc:25\n+_\bD_\bu_\bn_\be_\b:_\b:_\bF_\bl_\bo_\ba_\bt_\bC_\bm_\bp_\b:_\b:_\bE_\bp_\bs_\bi_\bl_\bo_\bn_\bT_\by_\bp_\be_\b<_\b _\bs_\bt_\bd_\b:_\b:_\bv_\be_\bc_\bt_\bo_\br_\b<_\b _\bT_\b,_\b _\bA_\b _\b>_\b _\b>_\b:_\b:_\bT_\by_\bp_\be\n+EpsilonType< T >::Type Type\n+The epsilon type corresponding to value type std::vector\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn float_cmp.cc:36\n+_\bD_\bu_\bn_\be_\b:_\b:_\bF_\bl_\bo_\ba_\bt_\bC_\bm_\bp_\b:_\b:_\bE_\bp_\bs_\bi_\bl_\bo_\bn_\bT_\by_\bp_\be_\b<_\b _\bF_\bi_\be_\bl_\bd_\bV_\be_\bc_\bt_\bo_\br_\b<_\b _\bT_\b,_\b _\bn_\b _\b>_\b _\b>_\b:_\b:_\bT_\by_\bp_\be\n+EpsilonType< T >::Type Type\n+The epsilon type corresponding to value type Dune::FieldVector\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn float_cmp.cc:47\n+_\bD_\bu_\bn_\be_\b:_\b:_\bF_\bl_\bo_\ba_\bt_\bC_\bm_\bp_\b:_\b:_\bD_\be_\bf_\ba_\bu_\bl_\bt_\bE_\bp_\bs_\bi_\bl_\bo_\bn_\b<_\b _\bT_\b,_\b _\br_\be_\bl_\ba_\bt_\bi_\bv_\be_\bW_\be_\ba_\bk_\b _\b>_\b:_\b:_\bv_\ba_\bl_\bu_\be\n+static EpsilonType< T >::Type value()\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn float_cmp.cc:53\n+_\bD_\bu_\bn_\be_\b:_\b:_\bF_\bl_\bo_\ba_\bt_\bC_\bm_\bp_\b:_\b:_\bD_\be_\bf_\ba_\bu_\bl_\bt_\bE_\bp_\bs_\bi_\bl_\bo_\bn_\b<_\b _\bT_\b,_\b _\br_\be_\bl_\ba_\bt_\bi_\bv_\be_\bS_\bt_\br_\bo_\bn_\bg_\b _\b>_\b:_\b:_\bv_\ba_\bl_\bu_\be\n+static EpsilonType< T >::Type value()\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn float_cmp.cc:58\n+_\bD_\bu_\bn_\be_\b:_\b:_\bF_\bl_\bo_\ba_\bt_\bC_\bm_\bp_\b:_\b:_\bD_\be_\bf_\ba_\bu_\bl_\bt_\bE_\bp_\bs_\bi_\bl_\bo_\bn_\b<_\b _\bT_\b,_\b _\ba_\bb_\bs_\bo_\bl_\bu_\bt_\be_\b _\b>_\b:_\b:_\bv_\ba_\bl_\bu_\be\n+static EpsilonType< T >::Type value()\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn float_cmp.cc:63\n+_\bD_\bu_\bn_\be_\b:_\b:_\bF_\bl_\bo_\ba_\bt_\bC_\bm_\bp_\b:_\b:_\bD_\be_\bf_\ba_\bu_\bl_\bt_\bE_\bp_\bs_\bi_\bl_\bo_\bn\n+mapping from a value type and a compare style to a default epsilon\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn float_cmp.hh:138\n+_\bD_\bu_\bn_\be_\b:_\b:_\bF_\bl_\bo_\ba_\bt_\bC_\bm_\bp_\b:_\b:_\bD_\be_\bf_\ba_\bu_\bl_\bt_\bE_\bp_\bs_\bi_\bl_\bo_\bn_\b:_\b:_\bv_\ba_\bl_\bu_\be\n+static EpsilonType< T >::Type value()\n+Returns the default epsilon for the given value type and compare style.\n+_\bD_\bu_\bn_\be_\b:_\b:_\bF_\bl_\bo_\ba_\bt_\bC_\bm_\bp_\bO_\bp_\bs_\b:_\b:_\bl_\be\n+bool le(const ValueType &first, const ValueType &second) const\n+test if first lesser or equal second\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn float_cmp.cc:486\n+_\bD_\bu_\bn_\be_\b:_\b:_\bF_\bl_\bo_\ba_\bt_\bC_\bm_\bp_\bO_\bp_\bs_\b:_\b:_\bF_\bl_\bo_\ba_\bt_\bC_\bm_\bp_\bO_\bp_\bs\n+FloatCmpOps(EpsilonType epsilon=DefaultEpsilon::value())\n+construct an operations object\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn float_cmp.cc:431\n+_\bD_\bu_\bn_\be_\b:_\b:_\bF_\bl_\bo_\ba_\bt_\bC_\bm_\bp_\bO_\bp_\bs_\b:_\b:_\be_\bq\n+bool eq(const ValueType &first, const ValueType &second) const\n+test for equality using epsilon\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn float_cmp.cc:451\n+_\bD_\bu_\bn_\be_\b:_\b:_\bF_\bl_\bo_\ba_\bt_\bC_\bm_\bp_\bO_\bp_\bs_\b:_\b:_\bl_\bt\n+bool lt(const ValueType &first, const ValueType &second) const\n+test if first lesser than second\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn float_cmp.cc:472\n+_\bD_\bu_\bn_\be_\b:_\b:_\bF_\bl_\bo_\ba_\bt_\bC_\bm_\bp_\bO_\bp_\bs_\b:_\b:_\bg_\be\n+bool ge(const ValueType &first, const ValueType &second) const\n+test if first greater or equal second\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn float_cmp.cc:479\n+_\bD_\bu_\bn_\be_\b:_\b:_\bF_\bl_\bo_\ba_\bt_\bC_\bm_\bp_\bO_\bp_\bs_\b:_\b:_\bE_\bp_\bs_\bi_\bl_\bo_\bn_\bT_\by_\bp_\be\n+FloatCmp::EpsilonType< T >::Type EpsilonType\n+Type of the epsilon.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn float_cmp.hh:304\n+_\bD_\bu_\bn_\be_\b:_\b:_\bF_\bl_\bo_\ba_\bt_\bC_\bm_\bp_\bO_\bp_\bs_\b:_\b:_\bn_\be\n+bool ne(const ValueType &first, const ValueType &second) const\n+test for inequality using epsilon\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn float_cmp.cc:458\n+_\bD_\bu_\bn_\be_\b:_\b:_\bF_\bl_\bo_\ba_\bt_\bC_\bm_\bp_\bO_\bp_\bs_\b:_\b:_\bV_\ba_\bl_\bu_\be_\bT_\by_\bp_\be\n+T ValueType\n+Type of the values to compare.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn float_cmp.hh:299\n+_\bD_\bu_\bn_\be_\b:_\b:_\bF_\bl_\bo_\ba_\bt_\bC_\bm_\bp_\bO_\bp_\bs_\b:_\b:_\be_\bp_\bs_\bi_\bl_\bo_\bn\n+EpsilonType epsilon() const\n+return the current epsilon\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn float_cmp.cc:436\n+_\bD_\bu_\bn_\be_\b:_\b:_\bF_\bl_\bo_\ba_\bt_\bC_\bm_\bp_\bO_\bp_\bs_\b:_\b:_\br_\bo_\bu_\bn_\bd\n+I round(const ValueType &val) const\n+round using epsilon\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn float_cmp.cc:495\n+_\bD_\bu_\bn_\be_\b:_\b:_\bF_\bl_\bo_\ba_\bt_\bC_\bm_\bp_\bO_\bp_\bs_\b:_\b:_\bt_\br_\bu_\bn_\bc\n+I trunc(const ValueType &val) const\n+truncate using epsilon\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn float_cmp.cc:503\n+_\bD_\bu_\bn_\be_\b:_\b:_\bF_\bl_\bo_\ba_\bt_\bC_\bm_\bp_\bO_\bp_\bs_\b:_\b:_\bg_\bt\n+bool gt(const ValueType &first, const ValueType &second) const\n+test if first greater than second\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn float_cmp.cc:465\n ===============================================================================\n Generated by\u00a0_\b[_\bd_\bo_\bx_\by_\bg_\be_\bn_\b] 1.9.8\n"}]}, {"source1": "./usr/share/doc/libdune-common-doc/doxygen/a00161.html", "source2": "./usr/share/doc/libdune-common-doc/doxygen/a00161.html", "unified_diff": "@@ -1,15 +1,15 @@\n \n \n \n \n \n \n \n-dune-common: indent.hh File Reference\n+dune-common: fmatrixev.hh File Reference\n \n \n \n \n \n \n \n@@ -70,49 +70,67 @@\n
    \n \n
    \n
    \n
    \n \n-
    indent.hh File Reference
    \n+
    fmatrixev.hh File Reference
    \n
    \n
    \n \n-

    Utility class for handling nested indentation in output. \n+

    Eigenvalue computations for the FieldMatrix class. \n More...

    \n-
    #include <ostream>
    \n-#include <string>
    \n+
    #include <algorithm>
    \n+#include <iostream>
    \n+#include <cmath>
    \n+#include <cassert>
    \n+#include <dune-common-config.hh>
    \n+#include <dune/common/exceptions.hh>
    \n+#include <dune/common/fvector.hh>
    \n+#include <dune/common/fmatrix.hh>
    \n+#include <dune/common/math.hh>
    \n
    \n

    Go to the source code of this file.

    \n \n-\n-\n-\n-\n-

    \n-Classes

    class  Dune::Indent
     Utility class for handling nested indentation in output. More...
     
    \n \n \n \n \n+\n+\n

    \n Namespaces

    namespace  Dune
     Dune namespace.
     
    namespace  Dune::FMatrixHelp
     
    \n \n-\n-\n-\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n

    \n Functions

    std::ostream & Dune::operator<< (std::ostream &s, const Indent &indent)
     write indentation to a stream
     
    template<int dim, typename K >
    static void Dune::FMatrixHelp::eigenValues (const FieldMatrix< K, dim, dim > &matrix, FieldVector< K, dim > &eigenValues)
     calculates the eigenvalues of a symmetric field matrix
     
    template<int dim, typename K >
    static void Dune::FMatrixHelp::eigenValuesVectors (const FieldMatrix< K, dim, dim > &matrix, FieldVector< K, dim > &eigenValues, FieldMatrix< K, dim, dim > &eigenVectors)
     calculates the eigenvalues and eigenvectors of a symmetric field matrix
     
    template<int dim, typename K >
    static void Dune::FMatrixHelp::eigenValuesLapack (const FieldMatrix< K, dim, dim > &matrix, FieldVector< K, dim > &eigenValues)
     calculates the eigenvalues of a symmetric field matrix
     
    template<int dim, typename K >
    static void Dune::FMatrixHelp::eigenValuesVectorsLapack (const FieldMatrix< K, dim, dim > &matrix, FieldVector< K, dim > &eigenValues, FieldMatrix< K, dim, dim > &eigenVectors)
     calculates the eigenvalues and -vectors of a symmetric field matrix
     
    template<int dim, typename K , class C >
    static void Dune::FMatrixHelp::eigenValuesNonSym (const FieldMatrix< K, dim, dim > &matrix, FieldVector< C, dim > &eigenValues)
     calculates the eigenvalues of a non-symmetric field matrix
     
    \n

    Detailed Description

    \n-

    Utility class for handling nested indentation in output.

    \n-
    Author
    J\u00f6 Fahlke
    \n+

    Eigenvalue computations for the FieldMatrix class.

    \n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n \n", "details": [{"source1": "encoding", "source2": "encoding", "unified_diff": "@@ -1 +1 @@\n-utf-8\n+us-ascii\n"}, {"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,31 +1,59 @@\n dune-common\u00a02.10\n Loading...\n Searching...\n No Matches\n * _\bd_\bu_\bn_\be\n * _\bc_\bo_\bm_\bm_\bo_\bn\n-_\bC_\bl_\ba_\bs_\bs_\be_\bs | _\bN_\ba_\bm_\be_\bs_\bp_\ba_\bc_\be_\bs | _\bF_\bu_\bn_\bc_\bt_\bi_\bo_\bn_\bs\n-indent.hh File Reference\n-_\bC_\bo_\bm_\bm_\bo_\bn\n-Utility class for handling nested indentation in output. _\bM_\bo_\br_\be_\b._\b._\b.\n-#include \n-#include \n+_\bN_\ba_\bm_\be_\bs_\bp_\ba_\bc_\be_\bs | _\bF_\bu_\bn_\bc_\bt_\bi_\bo_\bn_\bs\n+fmatrixev.hh File Reference\n+Eigenvalue computations for the FieldMatrix class. _\bM_\bo_\br_\be_\b._\b._\b.\n+#include \n+#include \n+#include \n+#include \n+#include \n+#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\be_\bx_\bc_\be_\bp_\bt_\bi_\bo_\bn_\bs_\b._\bh_\bh>\n+#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bf_\bv_\be_\bc_\bt_\bo_\br_\b._\bh_\bh>\n+#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bf_\bm_\ba_\bt_\br_\bi_\bx_\b._\bh_\bh>\n+#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bm_\ba_\bt_\bh_\b._\bh_\bh>\n _\bG_\bo_\b _\bt_\bo_\b _\bt_\bh_\be_\b _\bs_\bo_\bu_\br_\bc_\be_\b _\bc_\bo_\bd_\be_\b _\bo_\bf_\b _\bt_\bh_\bi_\bs_\b _\bf_\bi_\bl_\be_\b.\n-C\bCl\bla\bas\bss\bse\bes\bs\n-class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bd_\be_\bn_\bt\n-\u00a0 Utility class for handling nested indentation in output. _\bM_\bo_\br_\be_\b._\b._\b.\n-\u00a0\n N\bNa\bam\bme\bes\bsp\bpa\bac\bce\bes\bs\n namespace \u00a0 _\bD_\bu_\bn_\be\n \u00a0 _\bD_\bu_\bn_\be namespace.\n \u00a0\n+namespace \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bF_\bM_\ba_\bt_\br_\bi_\bx_\bH_\be_\bl_\bp\n+\u00a0\n F\bFu\bun\bnc\bct\bti\bio\bon\bns\bs\n-std::ostream &\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b<_\b< (std::ostream &s, const _\bI_\bn_\bd_\be_\bn_\bt &indent)\n-\u00a0 write indentation to a stream\n+template\n+static void\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bF_\bM_\ba_\bt_\br_\bi_\bx_\bH_\be_\bl_\bp_\b:_\b:_\be_\bi_\bg_\be_\bn_\bV_\ba_\bl_\bu_\be_\bs (const _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx< K, dim, dim >\n+ &matrix, _\bF_\bi_\be_\bl_\bd_\bV_\be_\bc_\bt_\bo_\br< K, dim > &eigenValues)\n+\u00a0 calculates the eigenvalues of a symmetric field matrix\n+\u00a0\n+template\n+static void\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bF_\bM_\ba_\bt_\br_\bi_\bx_\bH_\be_\bl_\bp_\b:_\b:_\be_\bi_\bg_\be_\bn_\bV_\ba_\bl_\bu_\be_\bs_\bV_\be_\bc_\bt_\bo_\br_\bs (const _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx< K, dim,\n+ dim > &matrix, _\bF_\bi_\be_\bl_\bd_\bV_\be_\bc_\bt_\bo_\br< K, dim > &_\be_\bi_\bg_\be_\bn_\bV_\ba_\bl_\bu_\be_\bs, _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx< K,\n+ dim, dim > &eigenVectors)\n+\u00a0 calculates the eigenvalues and eigenvectors of a symmetric field\n+ matrix\n+\u00a0\n+template\n+static void\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bF_\bM_\ba_\bt_\br_\bi_\bx_\bH_\be_\bl_\bp_\b:_\b:_\be_\bi_\bg_\be_\bn_\bV_\ba_\bl_\bu_\be_\bs_\bL_\ba_\bp_\ba_\bc_\bk (const _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx< K, dim,\n+ dim > &matrix, _\bF_\bi_\be_\bl_\bd_\bV_\be_\bc_\bt_\bo_\br< K, dim > &_\be_\bi_\bg_\be_\bn_\bV_\ba_\bl_\bu_\be_\bs)\n+\u00a0 calculates the eigenvalues of a symmetric field matrix\n+\u00a0\n+template\n+static void\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bF_\bM_\ba_\bt_\br_\bi_\bx_\bH_\be_\bl_\bp_\b:_\b:_\be_\bi_\bg_\be_\bn_\bV_\ba_\bl_\bu_\be_\bs_\bV_\be_\bc_\bt_\bo_\br_\bs_\bL_\ba_\bp_\ba_\bc_\bk (const _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx< K,\n+ dim, dim > &matrix, _\bF_\bi_\be_\bl_\bd_\bV_\be_\bc_\bt_\bo_\br< K, dim > &_\be_\bi_\bg_\be_\bn_\bV_\ba_\bl_\bu_\be_\bs,\n+ _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx< K, dim, dim > &eigenVectors)\n+\u00a0 calculates the eigenvalues and -vectors of a symmetric field\n+ matrix\n+\u00a0\n+template\n+static void\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bF_\bM_\ba_\bt_\br_\bi_\bx_\bH_\be_\bl_\bp_\b:_\b:_\be_\bi_\bg_\be_\bn_\bV_\ba_\bl_\bu_\be_\bs_\bN_\bo_\bn_\bS_\by_\bm (const _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx< K, dim,\n+ dim > &matrix, _\bF_\bi_\be_\bl_\bd_\bV_\be_\bc_\bt_\bo_\br< C, dim > &_\be_\bi_\bg_\be_\bn_\bV_\ba_\bl_\bu_\be_\bs)\n+\u00a0 calculates the eigenvalues of a non-symmetric field matrix\n \u00a0\n *\b**\b**\b**\b**\b* D\bDe\bet\bta\bai\bil\ble\bed\bd D\bDe\bes\bsc\bcr\bri\bip\bpt\bti\bio\bon\bn *\b**\b**\b**\b**\b*\n-Utility class for handling nested indentation in output.\n- Author\n- J\u00c3\u00b6 Fahlke\n+Eigenvalue computations for the FieldMatrix class.\n ===============================================================================\n Generated by\u00a0_\b[_\bd_\bo_\bx_\by_\bg_\be_\bn_\b] 1.9.8\n"}]}, {"source1": "./usr/share/doc/libdune-common-doc/doxygen/a00161_source.html", "source2": "./usr/share/doc/libdune-common-doc/doxygen/a00161_source.html", "unified_diff": "@@ -1,15 +1,15 @@\n \n \n \n \n \n \n \n-dune-common: indent.hh Source File\n+dune-common: fmatrixev.hh Source File\n \n \n \n \n \n \n \n@@ -74,107 +74,641 @@\n \n
    \n \n
    \n
    \n
    \n-
    indent.hh
    \n+
    fmatrixev.hh
    \n
    \n
    \n Go to the documentation of this file.
    1// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
    \n
    2// vi: set et ts=4 sw=2 sts=2:
    \n
    3// SPDX-FileCopyrightInfo: Copyright \u00a9 DUNE Project contributors, see file LICENSE.md in module root
    \n
    4// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception
    \n-
    5#ifndef DUNE_COMMON_INDENT_HH
    \n-
    6#define DUNE_COMMON_INDENT_HH
    \n+
    5#ifndef DUNE_FMATRIXEIGENVALUES_HH
    \n+
    6#define DUNE_FMATRIXEIGENVALUES_HH
    \n
    7
    \n-
    8#include <ostream>
    \n-
    9#include <string>
    \n-
    10
    \n-
    11namespace Dune {
    \n+
    12#include <algorithm>
    \n+
    13#include <iostream>
    \n+
    14#include <cmath>
    \n+
    15#include <cassert>
    \n+
    16
    \n+
    17#include <dune-common-config.hh> // HAVE_LAPACK
    \n+\n+\n+\n+
    21#include <dune/common/math.hh>
    \n
    22
    \n-
    \n-
    52 class Indent
    \n-
    53 {
    \n-
    54 const Indent* parent;
    \n-
    55 std::string basic_indent;
    \n-
    56 unsigned level;
    \n+
    23namespace Dune {
    \n+
    24
    \n+
    30 namespace FMatrixHelp {
    \n+
    31
    \n+
    32#if HAVE_LAPACK
    \n+
    33 // defined in fmatrixev.cc
    \n+
    34 extern void eigenValuesLapackCall(
    \n+
    35 const char* jobz, const char* uplo, const long
    \n+
    36 int* n, double* a, const long int* lda, double* w,
    \n+
    37 double* work, const long int* lwork, long int* info);
    \n+
    38
    \n+
    39 extern void eigenValuesNonsymLapackCall(
    \n+
    40 const char* jobvl, const char* jobvr, const long
    \n+
    41 int* n, double* a, const long int* lda, double* wr, double* wi, double* vl,
    \n+
    42 const long int* ldvl, double* vr, const long int* ldvr, double* work,
    \n+
    43 const long int* lwork, long int* info);
    \n+
    44
    \n+
    45 extern void eigenValuesLapackCall(
    \n+
    46 const char* jobz, const char* uplo, const long
    \n+
    47 int* n, float* a, const long int* lda, float* w,
    \n+
    48 float* work, const long int* lwork, long int* info);
    \n+
    49
    \n+
    50 extern void eigenValuesNonsymLapackCall(
    \n+
    51 const char* jobvl, const char* jobvr, const long
    \n+
    52 int* n, float* a, const long int* lda, float* wr, float* wi, float* vl,
    \n+
    53 const long int* ldvl, float* vr, const long int* ldvr, float* work,
    \n+
    54 const long int* lwork, long int* info);
    \n+
    55
    \n+
    56#endif
    \n
    57
    \n-
    58 public:
    \n-
    60
    \n-
    \n-
    63 inline Indent(const std::string& basic_indent_ = " ", unsigned level_ = 0)
    \n-
    64 : parent(0), basic_indent(basic_indent_), level(level_)
    \n-
    65 { }
    \n-
    \n-
    66
    \n-
    \n-
    68 inline Indent(unsigned level_)
    \n-
    69 : parent(0), basic_indent(" "), level(level_)
    \n-
    70 { }
    \n-
    \n+
    58 namespace Impl {
    \n+
    59 //internal tag to activate/disable code for eigenvector calculation at compile time
    \n+
    60 enum Jobs { OnlyEigenvalues=0, EigenvaluesEigenvectors=1 };
    \n+
    61
    \n+
    62 //internal dummy used if only eigenvalues are to be calculated
    \n+
    63 template<typename K, int dim>
    \n+
    64 using EVDummy = FieldMatrix<K, dim, dim>;
    \n+
    65
    \n+
    66 //compute the cross-product of two vectors
    \n+
    67 template<typename K>
    \n+
    68 inline FieldVector<K,3> crossProduct(const FieldVector<K,3>& vec0, const FieldVector<K,3>& vec1) {
    \n+
    69 return {vec0[1]*vec1[2] - vec0[2]*vec1[1], vec0[2]*vec1[0] - vec0[0]*vec1[2], vec0[0]*vec1[1] - vec0[1]*vec1[0]};
    \n+
    70 }
    \n
    71
    \n-
    73
    \n-
    \n-
    76 inline Indent(const Indent* parent_,
    \n-
    77 const std::string& basic_indent_ = " ", unsigned level_ = 1)
    \n-
    78 : parent(parent_), basic_indent(basic_indent_), level(level_)
    \n-
    79 { }
    \n-
    \n-
    80
    \n-
    \n-
    82 inline Indent(const Indent* parent_, unsigned level_)
    \n-
    83 : parent(parent_), basic_indent(" "), level(level_)
    \n-
    84 { }
    \n-
    \n-
    85
    \n-
    \n-
    87 inline Indent operator+(const std::string& newindent) const {
    \n-
    88 return Indent(this, newindent);
    \n-
    89 }
    \n-
    \n-
    \n-
    91 inline Indent operator+(unsigned morelevel) const {
    \n-
    92 return Indent(parent, basic_indent, level+morelevel);
    \n-
    93 }
    \n-
    \n-
    95 inline Indent& operator++() { ++level; return *this; }
    \n-
    97 inline Indent& operator--() { if ( level > 0 ) --level; return *this; }
    \n-
    98
    \n-
    100 friend inline std::ostream& operator<<(std::ostream& s,
    \n-
    101 const Indent& indent);
    \n-
    102 };
    \n-
    \n-
    103
    \n-
    \n-
    105 inline std::ostream& operator<<(std::ostream& s, const Indent& indent) {
    \n-
    106 if(indent.parent)
    \n-
    107 s << *indent.parent;
    \n-
    108 for(unsigned i = 0; i < indent.level; ++i)
    \n-
    109 s << indent.basic_indent;
    \n-
    110 return s;
    \n-
    111 }
    \n-
    \n+
    72 template <typename K>
    \n+
    73 static void eigenValues2dImpl(const FieldMatrix<K, 2, 2>& matrix,
    \n+
    74 FieldVector<K, 2>& eigenvalues)
    \n+
    75 {
    \n+
    76 using std::sqrt;
    \n+
    77 const K p = 0.5 * (matrix[0][0] + matrix [1][1]);
    \n+
    78 const K p2 = p - matrix[1][1];
    \n+
    79 K q = p2 * p2 + matrix[1][0] * matrix[0][1];
    \n+
    80 if( q < 0 && q > -1e-14 ) q = 0;
    \n+
    81 if (q < 0)
    \n+
    82 {
    \n+
    83 std::cout << matrix << std::endl;
    \n+
    84 // Complex eigenvalues are either caused by non-symmetric matrices or by round-off errors
    \n+
    85 DUNE_THROW(MathError, "Complex eigenvalue detected (which this implementation cannot handle).");
    \n+
    86 }
    \n+
    87
    \n+
    88 // get square root
    \n+
    89 q = sqrt(q);
    \n+
    90
    \n+
    91 // store eigenvalues in ascending order
    \n+
    92 eigenvalues[0] = p - q;
    \n+
    93 eigenvalues[1] = p + q;
    \n+
    94 }
    \n+
    95
    \n+
    96 /*
    \n+
    97 This implementation was adapted from the pseudo-code (Python?) implementation found on
    \n+
    98 http://en.wikipedia.org/wiki/Eigenvalue_algorithm (retrieved late August 2014).
    \n+
    99 Wikipedia claims to have taken it from
    \n+
    100 Smith, Oliver K. (April 1961), Eigenvalues of a symmetric 3 \u00d7 3 matrix.,
    \n+
    101 Communications of the ACM 4 (4): 168, doi:10.1145/355578.366316
    \n+
    102 */
    \n+
    103 template <typename K>
    \n+
    104 static K eigenValues3dImpl(const FieldMatrix<K, 3, 3>& matrix,
    \n+
    105 FieldVector<K, 3>& eigenvalues)
    \n+
    106 {
    \n+
    107 using std::sqrt;
    \n+
    108 using std::acos;
    \n+
    109 using real_type = typename FieldTraits<K>::real_type;
    \n+
    110 const K pi = MathematicalConstants<K>::pi();
    \n+
    111 K p1 = matrix[0][1]*matrix[0][1] + matrix[0][2]*matrix[0][2] + matrix[1][2]*matrix[1][2];
    \n
    112
    \n-
    115} // namespace Dune
    \n-
    116
    \n-
    117#endif // DUNE_COMMON_INDENT_HH
    \n-
    Indent operator+(const std::string &newindent) const
    create new indentation object with this one as parent
    Definition indent.hh:87
    \n-
    Indent(unsigned level_)
    setup without parent and basic_indentation of two spaces
    Definition indent.hh:68
    \n-
    Indent operator+(unsigned morelevel) const
    create a copy of this indentation object with raised level
    Definition indent.hh:91
    \n-
    Indent(const Indent *parent_, unsigned level_)
    setup with parent
    Definition indent.hh:82
    \n-
    Indent & operator++()
    raise indentation level
    Definition indent.hh:95
    \n-
    Indent(const std::string &basic_indent_=" ", unsigned level_=0)
    setup without parent
    Definition indent.hh:63
    \n-
    Indent & operator--()
    lower indentation level
    Definition indent.hh:97
    \n-
    friend std::ostream & operator<<(std::ostream &s, const Indent &indent)
    write indentation to a stream
    Definition indent.hh:105
    \n-
    Indent(const Indent *parent_, const std::string &basic_indent_=" ", unsigned level_=1)
    setup with parent
    Definition indent.hh:76
    \n-
    std::ostream & operator<<(std::ostream &s, const bigunsignedint< k > &x)
    Definition bigunsignedint.hh:278
    \n+
    113 if (p1 <= std::numeric_limits<K>::epsilon()) {
    \n+
    114 // A is diagonal.
    \n+
    115 eigenvalues[0] = matrix[0][0];
    \n+
    116 eigenvalues[1] = matrix[1][1];
    \n+
    117 eigenvalues[2] = matrix[2][2];
    \n+
    118 std::sort(eigenvalues.begin(), eigenvalues.end());
    \n+
    119
    \n+
    120 return 0.0;
    \n+
    121 }
    \n+
    122 else
    \n+
    123 {
    \n+
    124 // q = trace(A)/3
    \n+
    125 K q = 0;
    \n+
    126 for (int i=0; i<3; i++)
    \n+
    127 q += matrix[i][i] / 3.0;
    \n+
    128
    \n+
    129 K p2 = (matrix[0][0] - q)*(matrix[0][0] - q) + (matrix[1][1] - q)*(matrix[1][1] - q) + (matrix[2][2] - q)*(matrix[2][2] - q) + 2.0 * p1;
    \n+
    130 K p = sqrt(p2 / 6);
    \n+
    131 // B = (1 / p) * (A - q * I); // I is the identity matrix
    \n+
    132 FieldMatrix<K,3,3> B;
    \n+
    133 for (int i=0; i<3; i++)
    \n+
    134 for (int j=0; j<3; j++)
    \n+
    135 B[i][j] = (real_type(1.0)/p) * (matrix[i][j] - q*(i==j));
    \n+
    136
    \n+
    137 K r = B.determinant() / 2.0;
    \n+
    138
    \n+
    139 /*In exact arithmetic for a symmetric matrix -1 <= r <= 1
    \n+
    140 but computation error can leave it slightly outside this range.
    \n+
    141 acos(z) function requires |z| <= 1, but will fail silently
    \n+
    142 and return NaN if the input is larger than 1 in magnitude.
    \n+
    143 Thus r is clamped to [-1,1].*/
    \n+
    144 using std::clamp;
    \n+
    145 r = clamp<K>(r, -1.0, 1.0);
    \n+
    146 K phi = acos(r) / 3.0;
    \n+
    147
    \n+
    148 // the eigenvalues satisfy eig[2] <= eig[1] <= eig[0]
    \n+
    149 eigenvalues[2] = q + 2 * p * cos(phi);
    \n+
    150 eigenvalues[0] = q + 2 * p * cos(phi + (2*pi/3));
    \n+
    151 eigenvalues[1] = 3 * q - eigenvalues[0] - eigenvalues[2]; // since trace(matrix) = eig1 + eig2 + eig3
    \n+
    152
    \n+
    153 return r;
    \n+
    154 }
    \n+
    155 }
    \n+
    156
    \n+
    157 //see https://www.geometrictools.com/Documentation/RobustEigenSymmetric3x3.pdf
    \n+
    158 //Robustly compute a right-handed orthonormal set {u, v, evec0}.
    \n+
    159 template<typename K>
    \n+
    160 void orthoComp(const FieldVector<K,3>& evec0, FieldVector<K,3>& u, FieldVector<K,3>& v) {
    \n+
    161 using std::abs;
    \n+
    162 if(abs(evec0[0]) > abs(evec0[1])) {
    \n+
    163 //The component of maximum absolute value is either evec0[0] or evec0[2].
    \n+
    164 FieldVector<K,2> temp = {evec0[0], evec0[2]};
    \n+
    165 auto L = 1.0 / temp.two_norm();
    \n+
    166 u = L * FieldVector<K,3>({-evec0[2], 0.0, evec0[0]});
    \n+
    167 }
    \n+
    168 else {
    \n+
    169 //The component of maximum absolute value is either evec0[1] or evec0[2].
    \n+
    170 FieldVector<K,2> temp = {evec0[1], evec0[2]};
    \n+
    171 auto L = 1.0 / temp.two_norm();
    \n+
    172 u = L * FieldVector<K,3>({0.0, evec0[2], -evec0[1]});
    \n+
    173 }
    \n+
    174 v = crossProduct(evec0, u);
    \n+
    175 }
    \n+
    176
    \n+
    177 //see https://www.geometrictools.com/Documentation/RobustEigenSymmetric3x3.pdf
    \n+
    178 template<typename K>
    \n+
    179 void eig0(const FieldMatrix<K,3,3>& matrix, K eval0, FieldVector<K,3>& evec0) {
    \n+
    180 /* Compute a unit-length eigenvector for eigenvalue[i0]. The
    \n+
    181 matrix is rank 2, so two of the rows are linearly independent.
    \n+
    182 For a robust computation of the eigenvector, select the two
    \n+
    183 rows whose cross product has largest length of all pairs of
    \n+
    184 rows. */
    \n+
    185 using Vector = FieldVector<K,3>;
    \n+
    186 Vector row0 = {matrix[0][0]-eval0, matrix[0][1], matrix[0][2]};
    \n+
    187 Vector row1 = {matrix[1][0], matrix[1][1]-eval0, matrix[1][2]};
    \n+
    188 Vector row2 = {matrix[2][0], matrix[2][1], matrix[2][2]-eval0};
    \n+
    189
    \n+
    190 Vector r0xr1 = crossProduct(row0, row1);
    \n+
    191 Vector r0xr2 = crossProduct(row0, row2);
    \n+
    192 Vector r1xr2 = crossProduct(row1, row2);
    \n+
    193 auto d0 = r0xr1.two_norm();
    \n+
    194 auto d1 = r0xr2.two_norm();
    \n+
    195 auto d2 = r1xr2.two_norm();
    \n+
    196
    \n+
    197 auto dmax = d0 ;
    \n+
    198 int imax = 0;
    \n+
    199 if(d1>dmax) {
    \n+
    200 dmax = d1;
    \n+
    201 imax = 1;
    \n+
    202 }
    \n+
    203 if(d2>dmax)
    \n+
    204 imax = 2;
    \n+
    205
    \n+
    206 if(imax == 0)
    \n+
    207 evec0 = r0xr1 / d0;
    \n+
    208 else if(imax == 1)
    \n+
    209 evec0 = r0xr2 / d1;
    \n+
    210 else
    \n+
    211 evec0 = r1xr2 / d2;
    \n+
    212 }
    \n+
    213
    \n+
    214 //see https://www.geometrictools.com/Documentation/RobustEigenSymmetric3x3.pdf
    \n+
    215 template<typename K>
    \n+
    216 void eig1(const FieldMatrix<K,3,3>& matrix, const FieldVector<K,3>& evec0, FieldVector<K,3>& evec1, K eval1) {
    \n+
    217 using Vector = FieldVector<K,3>;
    \n+
    218
    \n+
    219 //Robustly compute a right-handed orthonormal set {u, v, evec0}.
    \n+
    220 Vector u,v;
    \n+
    221 orthoComp(evec0, u, v);
    \n+
    222
    \n+
    223 /* Let e be eval1 and let E be a corresponding eigenvector which
    \n+
    224 is a solution to the linear system (A - e*I)*E = 0. The matrix
    \n+
    225 (A - e*I) is 3x3, not invertible (so infinitely many
    \n+
    226 solutions), and has rank 2 when eval1 and eval are different.
    \n+
    227 It has rank 1 when eval1 and eval2 are equal. Numerically, it
    \n+
    228 is difficult to compute robustly the rank of a matrix. Instead,
    \n+
    229 the 3x3 linear system is reduced to a 2x2 system as follows.
    \n+
    230 Define the 3x2 matrix J = [u,v] whose columns are the u and v
    \n+
    231 computed previously. Define the 2x1 vector X = J*E. The 2x2
    \n+
    232 system is 0 = M * X = (J^T * (A - e*I) * J) * X where J^T is
    \n+
    233 the transpose of J and M = J^T * (A - e*I) * J is a 2x2 matrix.
    \n+
    234 The system may be written as
    \n+
    235 +- -++- -+ +- -+
    \n+
    236 | U^T*A*U - e U^T*A*V || x0 | = e * | x0 |
    \n+
    237 | V^T*A*U V^T*A*V - e || x1 | | x1 |
    \n+
    238 +- -++ -+ +- -+
    \n+
    239 where X has row entries x0 and x1. */
    \n+
    240
    \n+
    241 Vector Au, Av;
    \n+
    242 matrix.mv(u, Au);
    \n+
    243 matrix.mv(v, Av);
    \n+
    244
    \n+
    245 auto m00 = u.dot(Au) - eval1;
    \n+
    246 auto m01 = u.dot(Av);
    \n+
    247 auto m11 = v.dot(Av) - eval1;
    \n+
    248
    \n+
    249 /* For robustness, choose the largest-length row of M to compute
    \n+
    250 the eigenvector. The 2-tuple of coefficients of U and V in the
    \n+
    251 assignments to eigenvector[1] lies on a circle, and U and V are
    \n+
    252 unit length and perpendicular, so eigenvector[1] is unit length
    \n+
    253 (within numerical tolerance). */
    \n+
    254 using std::abs, std::sqrt, std::max;
    \n+
    255 auto absM00 = abs(m00);
    \n+
    256 auto absM01 = abs(m01);
    \n+
    257 auto absM11 = abs(m11);
    \n+
    258 if(absM00 >= absM11) {
    \n+
    259 auto maxAbsComp = max(absM00, absM01);
    \n+
    260 if(maxAbsComp > 0.0) {
    \n+
    261 if(absM00 >= absM01) {
    \n+
    262 m01 /= m00;
    \n+
    263 m00 = 1.0 / sqrt(1.0 + m01*m01);
    \n+
    264 m01 *= m00;
    \n+
    265 }
    \n+
    266 else {
    \n+
    267 m00 /= m01;
    \n+
    268 m01 = 1.0 / sqrt(1.0 + m00*m00);
    \n+
    269 m00 *= m01;
    \n+
    270 }
    \n+
    271 evec1 = m01*u - m00*v;
    \n+
    272 }
    \n+
    273 else
    \n+
    274 evec1 = u;
    \n+
    275 }
    \n+
    276 else {
    \n+
    277 auto maxAbsComp = max(absM11, absM01);
    \n+
    278 if(maxAbsComp > 0.0) {
    \n+
    279 if(absM11 >= absM01) {
    \n+
    280 m01 /= m11;
    \n+
    281 m11 = 1.0 / sqrt(1.0 + m01*m01);
    \n+
    282 m01 *= m11;
    \n+
    283 }
    \n+
    284 else {
    \n+
    285 m11 /= m01;
    \n+
    286 m01 = 1.0 / sqrt(1.0 + m11*m11);
    \n+
    287 m11 *= m01;
    \n+
    288 }
    \n+
    289 evec1 = m11*u - m01*v;
    \n+
    290 }
    \n+
    291 else
    \n+
    292 evec1 = u;
    \n+
    293 }
    \n+
    294 }
    \n+
    295
    \n+
    296 // 1d specialization
    \n+
    297 template<Jobs Tag, typename K>
    \n+
    298 static void eigenValuesVectorsImpl(const FieldMatrix<K, 1, 1>& matrix,
    \n+
    299 FieldVector<K, 1>& eigenValues,
    \n+
    300 FieldMatrix<K, 1, 1>& eigenVectors)
    \n+
    301 {
    \n+
    302 eigenValues[0] = matrix[0][0];
    \n+
    303 if constexpr(Tag==EigenvaluesEigenvectors)
    \n+
    304 eigenVectors[0] = {1.0};
    \n+
    305 }
    \n+
    306
    \n+
    307
    \n+
    308 // 2d specialization
    \n+
    309 template <Jobs Tag, typename K>
    \n+
    310 static void eigenValuesVectorsImpl(const FieldMatrix<K, 2, 2>& matrix,
    \n+
    311 FieldVector<K, 2>& eigenValues,
    \n+
    312 FieldMatrix<K, 2, 2>& eigenVectors)
    \n+
    313 {
    \n+
    314 // Compute eigen values
    \n+
    315 Impl::eigenValues2dImpl(matrix, eigenValues);
    \n+
    316
    \n+
    317 // Compute eigenvectors by exploiting the Cayley\u2013Hamilton theorem.
    \n+
    318 // If \u03bb_1, \u03bb_2 are the eigenvalues, then (A - \u03bb_1I )(A - \u03bb_2I ) = (A - \u03bb_2I )(A - \u03bb_1I ) = 0,
    \n+
    319 // so the columns of (A - \u03bb_2I ) are annihilated by (A - \u03bb_1I ) and vice versa.
    \n+
    320 // Assuming neither matrix is zero, the columns of each must include eigenvectors
    \n+
    321 // for the other eigenvalue. (If either matrix is zero, then A is a multiple of the
    \n+
    322 // identity and any non-zero vector is an eigenvector.)
    \n+
    323 // From: https://en.wikipedia.org/wiki/Eigenvalue_algorithm#2x2_matrices
    \n+
    324 if constexpr(Tag==EigenvaluesEigenvectors) {
    \n+
    325
    \n+
    326 // Special casing for multiples of the identity
    \n+
    327 FieldMatrix<K,2,2> temp = matrix;
    \n+
    328 temp[0][0] -= eigenValues[0];
    \n+
    329 temp[1][1] -= eigenValues[0];
    \n+
    330 if(temp.infinity_norm() <= 1e-14) {
    \n+
    331 eigenVectors[0] = {1.0, 0.0};
    \n+
    332 eigenVectors[1] = {0.0, 1.0};
    \n+
    333 }
    \n+
    334 else {
    \n+
    335 // The columns of A - \u03bb_2I are eigenvectors for \u03bb_1, or zero.
    \n+
    336 // Take the column with the larger norm to avoid zero columns.
    \n+
    337 FieldVector<K,2> ev0 = {matrix[0][0]-eigenValues[1], matrix[1][0]};
    \n+
    338 FieldVector<K,2> ev1 = {matrix[0][1], matrix[1][1]-eigenValues[1]};
    \n+
    339 eigenVectors[0] = (ev0.two_norm2() >= ev1.two_norm2()) ? ev0/ev0.two_norm() : ev1/ev1.two_norm();
    \n+
    340
    \n+
    341 // The columns of A - \u03bb_1I are eigenvectors for \u03bb_2, or zero.
    \n+
    342 // Take the column with the larger norm to avoid zero columns.
    \n+
    343 ev0 = {matrix[0][0]-eigenValues[0], matrix[1][0]};
    \n+
    344 ev1 = {matrix[0][1], matrix[1][1]-eigenValues[0]};
    \n+
    345 eigenVectors[1] = (ev0.two_norm2() >= ev1.two_norm2()) ? ev0/ev0.two_norm() : ev1/ev1.two_norm();
    \n+
    346 }
    \n+
    347 }
    \n+
    348 }
    \n+
    349
    \n+
    350 // 3d specialization
    \n+
    351 template <Jobs Tag, typename K>
    \n+
    352 static void eigenValuesVectorsImpl(const FieldMatrix<K, 3, 3>& matrix,
    \n+
    353 FieldVector<K, 3>& eigenValues,
    \n+
    354 FieldMatrix<K, 3, 3>& eigenVectors)
    \n+
    355 {
    \n+
    356 using Vector = FieldVector<K,3>;
    \n+
    357 using Matrix = FieldMatrix<K,3,3>;
    \n+
    358
    \n+
    359 //compute eigenvalues
    \n+
    360 /* Precondition the matrix by factoring out the maximum absolute
    \n+
    361 value of the components. This guards against floating-point
    \n+
    362 overflow when computing the eigenvalues.*/
    \n+
    363 using std::isnormal;
    \n+
    364 K maxAbsElement = (isnormal(matrix.infinity_norm())) ? matrix.infinity_norm() : K(1.0);
    \n+
    365 Matrix scaledMatrix = matrix / maxAbsElement;
    \n+
    366 K r = Impl::eigenValues3dImpl(scaledMatrix, eigenValues);
    \n+
    367
    \n+
    368 if constexpr(Tag==EigenvaluesEigenvectors) {
    \n+
    369 K offDiagNorm = Vector{scaledMatrix[0][1],scaledMatrix[0][2],scaledMatrix[1][2]}.two_norm2();
    \n+
    370 if (offDiagNorm <= std::numeric_limits<K>::epsilon())
    \n+
    371 {
    \n+
    372 eigenValues = {scaledMatrix[0][0], scaledMatrix[1][1], scaledMatrix[2][2]};
    \n+
    373 eigenVectors = {{1.0, 0.0, 0.0}, {0.0, 1.0, 0.0}, {0.0, 0.0, 1.0}};
    \n+
    374
    \n+
    375 // Use bubble sort to jointly sort eigenvalues and eigenvectors
    \n+
    376 // such that eigenvalues are ascending
    \n+
    377 if (eigenValues[0] > eigenValues[1])
    \n+
    378 {
    \n+
    379 std::swap(eigenValues[0], eigenValues[1]);
    \n+
    380 std::swap(eigenVectors[0], eigenVectors[1]);
    \n+
    381 }
    \n+
    382 if (eigenValues[1] > eigenValues[2])
    \n+
    383 {
    \n+
    384 std::swap(eigenValues[1], eigenValues[2]);
    \n+
    385 std::swap(eigenVectors[1], eigenVectors[2]);
    \n+
    386 }
    \n+
    387 if (eigenValues[0] > eigenValues[1])
    \n+
    388 {
    \n+
    389 std::swap(eigenValues[0], eigenValues[1]);
    \n+
    390 std::swap(eigenVectors[0], eigenVectors[1]);
    \n+
    391 }
    \n+
    392 }
    \n+
    393 else {
    \n+
    394 /*Compute the eigenvectors so that the set
    \n+
    395 [evec[0], evec[1], evec[2]] is right handed and
    \n+
    396 orthonormal. */
    \n+
    397
    \n+
    398 Matrix evec(0.0);
    \n+
    399 Vector eval(eigenValues);
    \n+
    400 if(r >= 0) {
    \n+
    401 Impl::eig0(scaledMatrix, eval[2], evec[2]);
    \n+
    402 Impl::eig1(scaledMatrix, evec[2], evec[1], eval[1]);
    \n+
    403 evec[0] = Impl::crossProduct(evec[1], evec[2]);
    \n+
    404 }
    \n+
    405 else {
    \n+
    406 Impl::eig0(scaledMatrix, eval[0], evec[0]);
    \n+
    407 Impl::eig1(scaledMatrix, evec[0], evec[1], eval[1]);
    \n+
    408 evec[2] = Impl::crossProduct(evec[0], evec[1]);
    \n+
    409 }
    \n+
    410 //sort eval/evec-pairs in ascending order
    \n+
    411 using EVPair = std::pair<K, Vector>;
    \n+
    412 std::vector<EVPair> pairs;
    \n+
    413 for(std::size_t i=0; i<=2; ++i)
    \n+
    414 pairs.push_back(EVPair(eval[i], evec[i]));
    \n+
    415 auto comp = [](EVPair x, EVPair y){ return x.first < y.first; };
    \n+
    416 std::sort(pairs.begin(), pairs.end(), comp);
    \n+
    417 for(std::size_t i=0; i<=2; ++i){
    \n+
    418 eigenValues[i] = pairs[i].first;
    \n+
    419 eigenVectors[i] = pairs[i].second;
    \n+
    420 }
    \n+
    421 }
    \n+
    422 }
    \n+
    423 //The preconditioning scaled the matrix, which scales the eigenvalues. Revert the scaling.
    \n+
    424 eigenValues *= maxAbsElement;
    \n+
    425 }
    \n+
    426
    \n+
    427 // forwarding to LAPACK with corresponding tag
    \n+
    428 template <Jobs Tag, int dim, typename K>
    \n+
    429 static void eigenValuesVectorsLapackImpl(const FieldMatrix<K, dim, dim>& matrix,
    \n+
    430 FieldVector<K, dim>& eigenValues,
    \n+
    431 FieldMatrix<K, dim, dim>& eigenVectors)
    \n+
    432 {
    \n+
    433 {
    \n+
    434#if HAVE_LAPACK
    \n+
    435 /*Lapack uses a proprietary tag to determine whether both eigenvalues and
    \n+
    436 -vectors ('v') or only eigenvalues ('n') should be calculated */
    \n+
    437 const char jobz = "nv"[Tag];
    \n+
    438
    \n+
    439 const long int N = dim ;
    \n+
    440 const char uplo = 'u'; // use upper triangular matrix
    \n+
    441
    \n+
    442 // length of matrix vector, LWORK >= max(1,3*N-1)
    \n+
    443 const long int lwork = 3*N -1 ;
    \n+
    444
    \n+
    445 constexpr bool isKLapackType = std::is_same_v<K,double> || std::is_same_v<K,float>;
    \n+
    446 using LapackNumType = std::conditional_t<isKLapackType, K, double>;
    \n+
    447
    \n+
    448 // matrix to put into dsyev
    \n+
    449 LapackNumType matrixVector[dim * dim];
    \n+
    450
    \n+
    451 // copy matrix
    \n+
    452 int row = 0;
    \n+
    453 for(int i=0; i<dim; ++i)
    \n+
    454 {
    \n+
    455 for(int j=0; j<dim; ++j, ++row)
    \n+
    456 {
    \n+
    457 matrixVector[ row ] = matrix[ i ][ j ];
    \n+
    458 }
    \n+
    459 }
    \n+
    460
    \n+
    461 // working memory
    \n+
    462 LapackNumType workSpace[lwork];
    \n+
    463
    \n+
    464 // return value information
    \n+
    465 long int info = 0;
    \n+
    466 LapackNumType* ev;
    \n+
    467 if constexpr (isKLapackType){
    \n+
    468 ev = &eigenValues[0];
    \n+
    469 }else{
    \n+
    470 ev = new LapackNumType[dim];
    \n+
    471 }
    \n+
    472
    \n+
    473 // call LAPACK routine (see fmatrixev.cc)
    \n+
    474 eigenValuesLapackCall(&jobz, &uplo, &N, &matrixVector[0], &N,
    \n+
    475 ev, &workSpace[0], &lwork, &info);
    \n+
    476
    \n+
    477 if constexpr (!isKLapackType){
    \n+
    478 for(size_t i=0;i<dim;++i)
    \n+
    479 eigenValues[i] = ev[i];
    \n+
    480 delete[] ev;
    \n+
    481 }
    \n+
    482
    \n+
    483 // restore eigenvectors matrix
    \n+
    484 if (Tag==Jobs::EigenvaluesEigenvectors){
    \n+
    485 row = 0;
    \n+
    486 for(int i=0; i<dim; ++i)
    \n+
    487 {
    \n+
    488 for(int j=0; j<dim; ++j, ++row)
    \n+
    489 {
    \n+
    490 eigenVectors[ i ][ j ] = matrixVector[ row ];
    \n+
    491 }
    \n+
    492 }
    \n+
    493 }
    \n+
    494
    \n+
    495 if( info != 0 )
    \n+
    496 {
    \n+
    497 std::cerr << "For matrix " << matrix << " eigenvalue calculation failed! " << std::endl;
    \n+
    498 DUNE_THROW(InvalidStateException,"eigenValues: Eigenvalue calculation failed!");
    \n+
    499 }
    \n+
    500#else
    \n+
    501 DUNE_THROW(NotImplemented,"LAPACK not found!");
    \n+
    502#endif
    \n+
    503 }
    \n+
    504 }
    \n+
    505
    \n+
    506 // generic specialization
    \n+
    507 template <Jobs Tag, int dim, typename K>
    \n+
    508 static void eigenValuesVectorsImpl(const FieldMatrix<K, dim, dim>& matrix,
    \n+
    509 FieldVector<K, dim>& eigenValues,
    \n+
    510 FieldMatrix<K, dim, dim>& eigenVectors)
    \n+
    511 {
    \n+
    512 eigenValuesVectorsLapackImpl<Tag>(matrix,eigenValues,eigenVectors);
    \n+
    513 }
    \n+
    514 } //namespace Impl
    \n+
    515
    \n+
    523 template <int dim, typename K>
    \n+
    \n+
    524 static void eigenValues(const FieldMatrix<K, dim, dim>& matrix,
    \n+\n+
    526 {
    \n+\n+
    528 Impl::eigenValuesVectorsImpl<Impl::Jobs::OnlyEigenvalues>(matrix, eigenValues, dummy);
    \n+
    529 }
    \n+
    \n+
    530
    \n+
    539 template <int dim, typename K>
    \n+
    \n+\n+\n+
    542 FieldMatrix<K, dim, dim>& eigenVectors)
    \n+
    543 {
    \n+
    544 Impl::eigenValuesVectorsImpl<Impl::Jobs::EigenvaluesEigenvectors>(matrix, eigenValues, eigenVectors);
    \n+
    545 }
    \n+
    \n+
    546
    \n+
    554 template <int dim, typename K>
    \n+
    \n+\n+\n+
    557 {
    \n+\n+
    559 Impl::eigenValuesVectorsLapackImpl<Impl::Jobs::EigenvaluesEigenvectors>(matrix, eigenValues, dummy);
    \n+
    560 }
    \n+
    \n+
    561
    \n+
    570 template <int dim, typename K>
    \n+
    \n+\n+\n+
    573 FieldMatrix<K, dim, dim>& eigenVectors)
    \n+
    574 {
    \n+
    575 Impl::eigenValuesVectorsLapackImpl<Impl::Jobs::EigenvaluesEigenvectors>(matrix, eigenValues, eigenVectors);
    \n+
    576 }
    \n+
    \n+
    577
    \n+
    585 template <int dim, typename K, class C>
    \n+
    \n+\n+\n+
    588 {
    \n+
    589#if HAVE_LAPACK
    \n+
    590 {
    \n+
    591 const long int N = dim ;
    \n+
    592 const char jobvl = 'n';
    \n+
    593 const char jobvr = 'n';
    \n+
    594
    \n+
    595 constexpr bool isKLapackType = std::is_same_v<K,double> || std::is_same_v<K,float>;
    \n+
    596 using LapackNumType = std::conditional_t<isKLapackType, K, double>;
    \n+
    597
    \n+
    598 // matrix to put into dgeev
    \n+
    599 LapackNumType matrixVector[dim * dim];
    \n+
    600
    \n+
    601 // copy matrix
    \n+
    602 int row = 0;
    \n+
    603 for(int i=0; i<dim; ++i)
    \n+
    604 {
    \n+
    605 for(int j=0; j<dim; ++j, ++row)
    \n+
    606 {
    \n+
    607 matrixVector[ row ] = matrix[ i ][ j ];
    \n+
    608 }
    \n+
    609 }
    \n+
    610
    \n+
    611 // working memory
    \n+
    612 LapackNumType eigenR[dim];
    \n+
    613 LapackNumType eigenI[dim];
    \n+
    614 LapackNumType work[3*dim];
    \n+
    615
    \n+
    616 // return value information
    \n+
    617 long int info = 0;
    \n+
    618 const long int lwork = 3*dim;
    \n+
    619
    \n+
    620 // call LAPACK routine (see fmatrixev_ext.cc)
    \n+
    621 eigenValuesNonsymLapackCall(&jobvl, &jobvr, &N, &matrixVector[0], &N,
    \n+
    622 &eigenR[0], &eigenI[0], nullptr, &N, nullptr, &N, &work[0],
    \n+
    623 &lwork, &info);
    \n+
    624
    \n+
    625 if( info != 0 )
    \n+
    626 {
    \n+
    627 std::cerr << "For matrix " << matrix << " eigenvalue calculation failed! " << std::endl;
    \n+
    628 DUNE_THROW(InvalidStateException,"eigenValues: Eigenvalue calculation failed!");
    \n+
    629 }
    \n+
    630 for (int i=0; i<N; ++i) {
    \n+
    631 eigenValues[i].real = eigenR[i];
    \n+
    632 eigenValues[i].imag = eigenI[i];
    \n+
    633 }
    \n+
    634 }
    \n+
    635#else
    \n+
    636 DUNE_THROW(NotImplemented,"LAPACK not found!");
    \n+
    637#endif
    \n+
    638 }
    \n+
    \n+
    639 } // end namespace FMatrixHelp
    \n+
    640
    \n+
    643} // end namespace Dune
    \n+
    644#endif
    \n+
    Some useful basic math stuff.
    \n+
    Implements a matrix constructed from a given type representing a field and compile-time given number ...
    \n+
    A few common exception classes.
    \n+
    Implements a vector constructed from a given type representing a field and a compile-time given size.
    \n+
    constexpr auto max
    Function object that returns the greater of the given values.
    Definition hybridutilities.hh:484
    \n+
    #define DUNE_THROW(E, m)
    Definition exceptions.hh:218
    \n
    Dune namespace.
    Definition alignedallocator.hh:13
    \n-
    Utility class for handling nested indentation in output.
    Definition indent.hh:53
    \n+
    static void eigenValuesNonSym(const FieldMatrix< K, dim, dim > &matrix, FieldVector< C, dim > &eigenValues)
    calculates the eigenvalues of a non-symmetric field matrix
    Definition fmatrixev.hh:586
    \n+
    static void eigenValues(const FieldMatrix< K, dim, dim > &matrix, FieldVector< K, dim > &eigenValues)
    calculates the eigenvalues of a symmetric field matrix
    Definition fmatrixev.hh:524
    \n+
    static void eigenValuesLapack(const FieldMatrix< K, dim, dim > &matrix, FieldVector< K, dim > &eigenValues)
    calculates the eigenvalues of a symmetric field matrix
    Definition fmatrixev.hh:555
    \n+
    static void eigenValuesVectors(const FieldMatrix< K, dim, dim > &matrix, FieldVector< K, dim > &eigenValues, FieldMatrix< K, dim, dim > &eigenVectors)
    calculates the eigenvalues and eigenvectors of a symmetric field matrix
    Definition fmatrixev.hh:540
    \n+
    static void eigenValuesVectorsLapack(const FieldMatrix< K, dim, dim > &matrix, FieldVector< K, dim > &eigenValues, FieldMatrix< K, dim, dim > &eigenVectors)
    calculates the eigenvalues and -vectors of a symmetric field matrix
    Definition fmatrixev.hh:571
    \n+
    A dense n x m matrix.
    Definition fmatrix.hh:117
    \n+
    vector space out of a tensor product of fields.
    Definition fvector.hh:91
    \n+
    Default exception for dummy implementations.
    Definition exceptions.hh:263
    \n+
    Default exception if a function was called while the object is not in a valid state for that function...
    Definition exceptions.hh:281
    \n+
    T real_type
    export the type representing the real type of the field
    Definition ftraits.hh:30
    \n+
    static const Field pi()
    Archimedes' constant.
    Definition math.hh:48
    \n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,119 +1,710 @@\n dune-common\u00a02.10\n Loading...\n Searching...\n No Matches\n * _\bd_\bu_\bn_\be\n * _\bc_\bo_\bm_\bm_\bo_\bn\n-indent.hh\n+fmatrixev.hh\n _\bG_\bo_\b _\bt_\bo_\b _\bt_\bh_\be_\b _\bd_\bo_\bc_\bu_\bm_\be_\bn_\bt_\ba_\bt_\bi_\bo_\bn_\b _\bo_\bf_\b _\bt_\bh_\bi_\bs_\b _\bf_\bi_\bl_\be_\b.\n 1// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-\n 2// vi: set et ts=4 sw=2 sts=2:\n 3// SPDX-FileCopyrightInfo: Copyright \u00c2\u00a9 DUNE Project contributors, see file\n LICENSE.md in module root\n 4// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception\n-5#ifndef DUNE_COMMON_INDENT_HH\n-6#define DUNE_COMMON_INDENT_HH\n+5#ifndef DUNE_FMATRIXEIGENVALUES_HH\n+6#define DUNE_FMATRIXEIGENVALUES_HH\n 7\n-8#include \n-9#include \n-10\n-11namespace _\bD_\bu_\bn_\be {\n+12#include \n+13#include \n+14#include \n+15#include \n+16\n+17#include // HAVE_LAPACK\n+18#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\be_\bx_\bc_\be_\bp_\bt_\bi_\bo_\bn_\bs_\b._\bh_\bh>\n+19#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bf_\bv_\be_\bc_\bt_\bo_\br_\b._\bh_\bh>\n+20#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bf_\bm_\ba_\bt_\br_\bi_\bx_\b._\bh_\bh>\n+21#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bm_\ba_\bt_\bh_\b._\bh_\bh>\n 22\n-_\b5_\b2 class _\bI_\bn_\bd_\be_\bn_\bt\n-53 {\n-54 const _\bI_\bn_\bd_\be_\bn_\bt* parent;\n-55 std::string basic_indent;\n-56 unsigned level;\n+23namespace _\bD_\bu_\bn_\be {\n+24\n+30 namespace FMatrixHelp {\n+31\n+32#if HAVE_LAPACK\n+33 // defined in fmatrixev.cc\n+34 extern void eigenValuesLapackCall(\n+35 const char* jobz, const char* uplo, const long\n+36 int* n, double* a, const long int* lda, double* w,\n+37 double* work, const long int* lwork, long int* info);\n+38\n+39 extern void eigenValuesNonsymLapackCall(\n+40 const char* jobvl, const char* jobvr, const long\n+41 int* n, double* a, const long int* lda, double* wr, double* wi, double* vl,\n+42 const long int* ldvl, double* vr, const long int* ldvr, double* work,\n+43 const long int* lwork, long int* info);\n+44\n+45 extern void eigenValuesLapackCall(\n+46 const char* jobz, const char* uplo, const long\n+47 int* n, float* a, const long int* lda, float* w,\n+48 float* work, const long int* lwork, long int* info);\n+49\n+50 extern void eigenValuesNonsymLapackCall(\n+51 const char* jobvl, const char* jobvr, const long\n+52 int* n, float* a, const long int* lda, float* wr, float* wi, float* vl,\n+53 const long int* ldvl, float* vr, const long int* ldvr, float* work,\n+54 const long int* lwork, long int* info);\n+55\n+56#endif\n 57\n-58 public:\n-60\n-_\b6_\b3 inline _\bI_\bn_\bd_\be_\bn_\bt(const std::string& basic_indent_ = \" \", unsigned level_ = 0)\n-64 : parent(0), basic_indent(basic_indent_), level(level_)\n-65 { }\n-66\n-_\b6_\b8 inline _\bI_\bn_\bd_\be_\bn_\bt(unsigned level_)\n-69 : parent(0), basic_indent(\" \"), level(level_)\n-70 { }\n+58 namespace Impl {\n+59 //internal tag to activate/disable code for eigenvector calculation at\n+compile time\n+60 enum Jobs { OnlyEigenvalues=0, EigenvaluesEigenvectors=1 };\n+61\n+62 //internal dummy used if only eigenvalues are to be calculated\n+63 template\n+64 using EVDummy = FieldMatrix;\n+65\n+66 //compute the cross-product of two vectors\n+67 template\n+68 inline FieldVector crossProduct(const FieldVector& vec0, const\n+FieldVector& vec1) {\n+69 return {vec0[1]*vec1[2] - vec0[2]*vec1[1], vec0[2]*vec1[0] - vec0[0]*vec1\n+[2], vec0[0]*vec1[1] - vec0[1]*vec1[0]};\n+70 }\n 71\n-73\n-_\b7_\b6 inline _\bI_\bn_\bd_\be_\bn_\bt(const _\bI_\bn_\bd_\be_\bn_\bt* parent_,\n-77 const std::string& basic_indent_ = \" \", unsigned level_ = 1)\n-78 : parent(parent_), basic_indent(basic_indent_), level(level_)\n-79 { }\n-80\n-_\b8_\b2 inline _\bI_\bn_\bd_\be_\bn_\bt(const _\bI_\bn_\bd_\be_\bn_\bt* parent_, unsigned level_)\n-83 : parent(parent_), basic_indent(\" \"), level(level_)\n-84 { }\n-85\n-_\b8_\b7 inline _\bI_\bn_\bd_\be_\bn_\bt _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b+(const std::string& newindent) const {\n-88 return _\bI_\bn_\bd_\be_\bn_\bt(this, newindent);\n-89 }\n-_\b9_\b1 inline _\bI_\bn_\bd_\be_\bn_\bt _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b+(unsigned morelevel) const {\n-92 return _\bI_\bn_\bd_\be_\bn_\bt(parent, basic_indent, level+morelevel);\n-93 }\n-_\b9_\b5 inline _\bI_\bn_\bd_\be_\bn_\bt& _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b+_\b+() { ++level; return *this; }\n-_\b9_\b7 inline _\bI_\bn_\bd_\be_\bn_\bt& _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b-_\b-() { if ( level > 0 ) --level; return *this; }\n-98\n-100 friend inline std::ostream& _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b<_\b<(std::ostream& s,\n-101 const _\bI_\bn_\bd_\be_\bn_\bt& indent);\n-102 };\n-103\n-_\b1_\b0_\b5 inline std::ostream& _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b<_\b<(std::ostream& s, const _\bI_\bn_\bd_\be_\bn_\bt& indent) {\n-106 if(indent.parent)\n-107 s << *indent.parent;\n-108 for(unsigned i = 0; i < indent.level; ++i)\n-109 s << indent.basic_indent;\n-110 return s;\n-111 }\n+72 template \n+73 static void eigenValues2dImpl(const FieldMatrix& matrix,\n+74 FieldVector& eigenvalues)\n+75 {\n+76 using std::sqrt;\n+77 const K p = 0.5 * (matrix[0][0] + matrix [1][1]);\n+78 const K p2 = p - matrix[1][1];\n+79 K q = p2 * p2 + matrix[1][0] * matrix[0][1];\n+80 if( q < 0 && q > -1e-14 ) q = 0;\n+81 if (q < 0)\n+82 {\n+83 std::cout << matrix << std::endl;\n+84 // Complex eigenvalues are either caused by non-symmetric matrices or by\n+round-off errors\n+85 _\bD_\bU_\bN_\bE_\b__\bT_\bH_\bR_\bO_\bW(MathError, \"Complex eigenvalue detected (which this\n+implementation cannot handle).\");\n+86 }\n+87\n+88 // get square root\n+89 q = sqrt(q);\n+90\n+91 // store eigenvalues in ascending order\n+92 eigenvalues[0] = p - q;\n+93 eigenvalues[1] = p + q;\n+94 }\n+95\n+96 /*\n+97 This implementation was adapted from the pseudo-code (Python?)\n+implementation found on\n+98 http://en.wikipedia.org/wiki/Eigenvalue_algorithm (retrieved late August\n+2014).\n+99 Wikipedia claims to have taken it from\n+100 Smith, Oliver K. (April 1961), Eigenvalues of a symmetric 3 \u00c3\u0097 3 matrix.,\n+101 Communications of the ACM 4 (4): 168, doi:10.1145/355578.366316\n+102 */\n+103 template \n+104 static K eigenValues3dImpl(const FieldMatrix& matrix,\n+105 FieldVector& eigenvalues)\n+106 {\n+107 using std::sqrt;\n+108 using std::acos;\n+109 using real_type = typename _\bF_\bi_\be_\bl_\bd_\bT_\br_\ba_\bi_\bt_\bs_\b<_\bK_\b>_\b:_\b:_\br_\be_\ba_\bl_\b__\bt_\by_\bp_\be;\n+110 const K pi = _\bM_\ba_\bt_\bh_\be_\bm_\ba_\bt_\bi_\bc_\ba_\bl_\bC_\bo_\bn_\bs_\bt_\ba_\bn_\bt_\bs_\b<_\bK_\b>_\b:_\b:_\bp_\bi();\n+111 K p1 = matrix[0][1]*matrix[0][1] + matrix[0][2]*matrix[0][2] + matrix[1]\n+[2]*matrix[1][2];\n 112\n-115} // namespace Dune\n-116\n-117#endif // DUNE_COMMON_INDENT_HH\n-_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bd_\be_\bn_\bt_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b+\n-Indent operator+(const std::string &newindent) const\n-create new indentation object with this one as parent\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn indent.hh:87\n-_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bd_\be_\bn_\bt_\b:_\b:_\bI_\bn_\bd_\be_\bn_\bt\n-Indent(unsigned level_)\n-setup without parent and basic_indentation of two spaces\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn indent.hh:68\n-_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bd_\be_\bn_\bt_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b+\n-Indent operator+(unsigned morelevel) const\n-create a copy of this indentation object with raised level\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn indent.hh:91\n-_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bd_\be_\bn_\bt_\b:_\b:_\bI_\bn_\bd_\be_\bn_\bt\n-Indent(const Indent *parent_, unsigned level_)\n-setup with parent\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn indent.hh:82\n-_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bd_\be_\bn_\bt_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b+_\b+\n-Indent & operator++()\n-raise indentation level\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn indent.hh:95\n-_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bd_\be_\bn_\bt_\b:_\b:_\bI_\bn_\bd_\be_\bn_\bt\n-Indent(const std::string &basic_indent_=\" \", unsigned level_=0)\n-setup without parent\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn indent.hh:63\n-_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bd_\be_\bn_\bt_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b-_\b-\n-Indent & operator--()\n-lower indentation level\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn indent.hh:97\n-_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bd_\be_\bn_\bt_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b<_\b<\n-friend std::ostream & operator<<(std::ostream &s, const Indent &indent)\n-write indentation to a stream\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn indent.hh:105\n-_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bd_\be_\bn_\bt_\b:_\b:_\bI_\bn_\bd_\be_\bn_\bt\n-Indent(const Indent *parent_, const std::string &basic_indent_=\" \", unsigned\n-level_=1)\n-setup with parent\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn indent.hh:76\n-_\bD_\bu_\bn_\be_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b<_\b<\n-std::ostream & operator<<(std::ostream &s, const bigunsignedint< k > &x)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bigunsignedint.hh:278\n+113 if (p1 <= std::numeric_limits::epsilon()) {\n+114 // A is diagonal.\n+115 eigenvalues[0] = matrix[0][0];\n+116 eigenvalues[1] = matrix[1][1];\n+117 eigenvalues[2] = matrix[2][2];\n+118 std::sort(eigenvalues.begin(), eigenvalues.end());\n+119\n+120 return 0.0;\n+121 }\n+122 else\n+123 {\n+124 // q = trace(A)/3\n+125 K q = 0;\n+126 for (int i=0; i<3; i++)\n+127 q += matrix[i][i] / 3.0;\n+128\n+129 K p2 = (matrix[0][0] - q)*(matrix[0][0] - q) + (matrix[1][1] - q)*(matrix\n+[1][1] - q) + (matrix[2][2] - q)*(matrix[2][2] - q) + 2.0 * p1;\n+130 K p = sqrt(p2 / 6);\n+131 // B = (1 / p) * (A - q * I); // I is the identity matrix\n+132 FieldMatrix B;\n+133 for (int i=0; i<3; i++)\n+134 for (int j=0; j<3; j++)\n+135 B[i][j] = (real_type(1.0)/p) * (matrix[i][j] - q*(i==j));\n+136\n+137 K r = B.determinant() / 2.0;\n+138\n+139 /*In exact arithmetic for a symmetric matrix -1 <= r <= 1\n+140 but computation error can leave it slightly outside this range.\n+141 acos(z) function requires |z| <= 1, but will fail silently\n+142 and return NaN if the input is larger than 1 in magnitude.\n+143 Thus r is clamped to [-1,1].*/\n+144 using std::clamp;\n+145 r = clamp(r, -1.0, 1.0);\n+146 K phi = acos(r) / 3.0;\n+147\n+148 // the eigenvalues satisfy eig[2] <= eig[1] <= eig[0]\n+149 eigenvalues[2] = q + 2 * p * cos(phi);\n+150 eigenvalues[0] = q + 2 * p * cos(phi + (2*pi/3));\n+151 eigenvalues[1] = 3 * q - eigenvalues[0] - eigenvalues[2]; // since trace\n+(matrix) = eig1 + eig2 + eig3\n+152\n+153 return r;\n+154 }\n+155 }\n+156\n+157 //see https://www.geometrictools.com/Documentation/\n+RobustEigenSymmetric3x3.pdf\n+158 //Robustly compute a right-handed orthonormal set {u, v, evec0}.\n+159 template\n+160 void orthoComp(const FieldVector& evec0, FieldVector& u,\n+FieldVector& v) {\n+161 using std::abs;\n+162 if(abs(evec0[0]) > abs(evec0[1])) {\n+163 //The component of maximum absolute value is either evec0[0] or evec0[2].\n+164 FieldVector temp = {evec0[0], evec0[2]};\n+165 auto L = 1.0 / temp.two_norm();\n+166 u = L * FieldVector({-evec0[2], 0.0, evec0[0]});\n+167 }\n+168 else {\n+169 //The component of maximum absolute value is either evec0[1] or evec0[2].\n+170 FieldVector temp = {evec0[1], evec0[2]};\n+171 auto L = 1.0 / temp.two_norm();\n+172 u = L * FieldVector({0.0, evec0[2], -evec0[1]});\n+173 }\n+174 v = crossProduct(evec0, u);\n+175 }\n+176\n+177 //see https://www.geometrictools.com/Documentation/\n+RobustEigenSymmetric3x3.pdf\n+178 template\n+179 void eig0(const FieldMatrix& matrix, K eval0, FieldVector&\n+evec0) {\n+180 /* Compute a unit-length eigenvector for eigenvalue[i0]. The\n+181 matrix is rank 2, so two of the rows are linearly independent.\n+182 For a robust computation of the eigenvector, select the two\n+183 rows whose cross product has largest length of all pairs of\n+184 rows. */\n+185 using Vector = FieldVector;\n+186 Vector row0 = {matrix[0][0]-eval0, matrix[0][1], matrix[0][2]};\n+187 Vector row1 = {matrix[1][0], matrix[1][1]-eval0, matrix[1][2]};\n+188 Vector row2 = {matrix[2][0], matrix[2][1], matrix[2][2]-eval0};\n+189\n+190 Vector r0xr1 = crossProduct(row0, row1);\n+191 Vector r0xr2 = crossProduct(row0, row2);\n+192 Vector r1xr2 = crossProduct(row1, row2);\n+193 auto d0 = r0xr1.two_norm();\n+194 auto d1 = r0xr2.two_norm();\n+195 auto d2 = r1xr2.two_norm();\n+196\n+197 auto dmax = d0 ;\n+198 int imax = 0;\n+199 if(d1>dmax) {\n+200 dmax = d1;\n+201 imax = 1;\n+202 }\n+203 if(d2>dmax)\n+204 imax = 2;\n+205\n+206 if(imax == 0)\n+207 evec0 = r0xr1 / d0;\n+208 else if(imax == 1)\n+209 evec0 = r0xr2 / d1;\n+210 else\n+211 evec0 = r1xr2 / d2;\n+212 }\n+213\n+214 //see https://www.geometrictools.com/Documentation/\n+RobustEigenSymmetric3x3.pdf\n+215 template\n+216 void eig1(const FieldMatrix& matrix, const FieldVector& evec0,\n+FieldVector& evec1, K eval1) {\n+217 using Vector = FieldVector;\n+218\n+219 //Robustly compute a right-handed orthonormal set {u, v, evec0}.\n+220 Vector u,v;\n+221 orthoComp(evec0, u, v);\n+222\n+223 /* Let e be eval1 and let E be a corresponding eigenvector which\n+224 is a solution to the linear system (A - e*I)*E = 0. The matrix\n+225 (A - e*I) is 3x3, not invertible (so infinitely many\n+226 solutions), and has rank 2 when eval1 and eval are different.\n+227 It has rank 1 when eval1 and eval2 are equal. Numerically, it\n+228 is difficult to compute robustly the rank of a matrix. Instead,\n+229 the 3x3 linear system is reduced to a 2x2 system as follows.\n+230 Define the 3x2 matrix J = [u,v] whose columns are the u and v\n+231 computed previously. Define the 2x1 vector X = J*E. The 2x2\n+232 system is 0 = M * X = (J^T * (A - e*I) * J) * X where J^T is\n+233 the transpose of J and M = J^T * (A - e*I) * J is a 2x2 matrix.\n+234 The system may be written as\n+235 +- -++- -+ +- -+\n+236 | U^T*A*U - e U^T*A*V || x0 | = e * | x0 |\n+237 | V^T*A*U V^T*A*V - e || x1 | | x1 |\n+238 +- -++ -+ +- -+\n+239 where X has row entries x0 and x1. */\n+240\n+241 Vector Au, Av;\n+242 matrix.mv(u, Au);\n+243 matrix.mv(v, Av);\n+244\n+245 auto m00 = u.dot(Au) - eval1;\n+246 auto m01 = u.dot(Av);\n+247 auto m11 = v.dot(Av) - eval1;\n+248\n+249 /* For robustness, choose the largest-length row of M to compute\n+250 the eigenvector. The 2-tuple of coefficients of U and V in the\n+251 assignments to eigenvector[1] lies on a circle, and U and V are\n+252 unit length and perpendicular, so eigenvector[1] is unit length\n+253 (within numerical tolerance). */\n+254 using std::abs, std::sqrt, std::max;\n+255 auto absM00 = abs(m00);\n+256 auto absM01 = abs(m01);\n+257 auto absM11 = abs(m11);\n+258 if(absM00 >= absM11) {\n+259 auto maxAbsComp = _\bm_\ba_\bx(absM00, absM01);\n+260 if(maxAbsComp > 0.0) {\n+261 if(absM00 >= absM01) {\n+262 m01 /= m00;\n+263 m00 = 1.0 / sqrt(1.0 + m01*m01);\n+264 m01 *= m00;\n+265 }\n+266 else {\n+267 m00 /= m01;\n+268 m01 = 1.0 / sqrt(1.0 + m00*m00);\n+269 m00 *= m01;\n+270 }\n+271 evec1 = m01*u - m00*v;\n+272 }\n+273 else\n+274 evec1 = u;\n+275 }\n+276 else {\n+277 auto maxAbsComp = _\bm_\ba_\bx(absM11, absM01);\n+278 if(maxAbsComp > 0.0) {\n+279 if(absM11 >= absM01) {\n+280 m01 /= m11;\n+281 m11 = 1.0 / sqrt(1.0 + m01*m01);\n+282 m01 *= m11;\n+283 }\n+284 else {\n+285 m11 /= m01;\n+286 m01 = 1.0 / sqrt(1.0 + m11*m11);\n+287 m11 *= m01;\n+288 }\n+289 evec1 = m11*u - m01*v;\n+290 }\n+291 else\n+292 evec1 = u;\n+293 }\n+294 }\n+295\n+296 // 1d specialization\n+297 template\n+298 static void eigenValuesVectorsImpl(const FieldMatrix& matrix,\n+299 FieldVector& _\be_\bi_\bg_\be_\bn_\bV_\ba_\bl_\bu_\be_\bs,\n+300 FieldMatrix& eigenVectors)\n+301 {\n+302 _\be_\bi_\bg_\be_\bn_\bV_\ba_\bl_\bu_\be_\bs[0] = matrix[0][0];\n+303 if constexpr(Tag==EigenvaluesEigenvectors)\n+304 eigenVectors[0] = {1.0};\n+305 }\n+306\n+307\n+308 // 2d specialization\n+309 template \n+310 static void eigenValuesVectorsImpl(const FieldMatrix& matrix,\n+311 FieldVector& _\be_\bi_\bg_\be_\bn_\bV_\ba_\bl_\bu_\be_\bs,\n+312 FieldMatrix& eigenVectors)\n+313 {\n+314 // Compute eigen values\n+315 Impl::eigenValues2dImpl(matrix, _\be_\bi_\bg_\be_\bn_\bV_\ba_\bl_\bu_\be_\bs);\n+316\n+317 // Compute eigenvectors by exploiting the Cayley\u00e2\u0080\u0093Hamilton theorem.\n+318 // If \u00ce\u00bb_1, \u00ce\u00bb_2 are the eigenvalues, then (A - \u00ce\u00bb_1I )(A - \u00ce\u00bb_2I ) = (A -\n+\u00ce\u00bb_2I )(A - \u00ce\u00bb_1I ) = 0,\n+319 // so the columns of (A - \u00ce\u00bb_2I ) are annihilated by (A - \u00ce\u00bb_1I ) and vice\n+versa.\n+320 // Assuming neither matrix is zero, the columns of each must include\n+eigenvectors\n+321 // for the other eigenvalue. (If either matrix is zero, then A is a\n+multiple of the\n+322 // identity and any non-zero vector is an eigenvector.)\n+323 // From: https://en.wikipedia.org/wiki/Eigenvalue_algorithm#2x2_matrices\n+324 if constexpr(Tag==EigenvaluesEigenvectors) {\n+325\n+326 // Special casing for multiples of the identity\n+327 FieldMatrix temp = matrix;\n+328 temp[0][0] -= _\be_\bi_\bg_\be_\bn_\bV_\ba_\bl_\bu_\be_\bs[0];\n+329 temp[1][1] -= _\be_\bi_\bg_\be_\bn_\bV_\ba_\bl_\bu_\be_\bs[0];\n+330 if(temp.infinity_norm() <= 1e-14) {\n+331 eigenVectors[0] = {1.0, 0.0};\n+332 eigenVectors[1] = {0.0, 1.0};\n+333 }\n+334 else {\n+335 // The columns of A - \u00ce\u00bb_2I are eigenvectors for \u00ce\u00bb_1, or zero.\n+336 // Take the column with the larger norm to avoid zero columns.\n+337 FieldVector ev0 = {matrix[0][0]-_\be_\bi_\bg_\be_\bn_\bV_\ba_\bl_\bu_\be_\bs[1], matrix[1][0]};\n+338 FieldVector ev1 = {matrix[0][1], matrix[1][1]-_\be_\bi_\bg_\be_\bn_\bV_\ba_\bl_\bu_\be_\bs[1]};\n+339 eigenVectors[0] = (ev0.two_norm2() >= ev1.two_norm2()) ? ev0/ev0.two_norm()\n+: ev1/ev1.two_norm();\n+340\n+341 // The columns of A - \u00ce\u00bb_1I are eigenvectors for \u00ce\u00bb_2, or zero.\n+342 // Take the column with the larger norm to avoid zero columns.\n+343 ev0 = {matrix[0][0]-_\be_\bi_\bg_\be_\bn_\bV_\ba_\bl_\bu_\be_\bs[0], matrix[1][0]};\n+344 ev1 = {matrix[0][1], matrix[1][1]-_\be_\bi_\bg_\be_\bn_\bV_\ba_\bl_\bu_\be_\bs[0]};\n+345 eigenVectors[1] = (ev0.two_norm2() >= ev1.two_norm2()) ? ev0/ev0.two_norm()\n+: ev1/ev1.two_norm();\n+346 }\n+347 }\n+348 }\n+349\n+350 // 3d specialization\n+351 template \n+352 static void eigenValuesVectorsImpl(const FieldMatrix& matrix,\n+353 FieldVector& _\be_\bi_\bg_\be_\bn_\bV_\ba_\bl_\bu_\be_\bs,\n+354 FieldMatrix& eigenVectors)\n+355 {\n+356 using Vector = FieldVector;\n+357 using Matrix = FieldMatrix;\n+358\n+359 //compute eigenvalues\n+360 /* Precondition the matrix by factoring out the maximum absolute\n+361 value of the components. This guards against floating-point\n+362 overflow when computing the eigenvalues.*/\n+363 using std::isnormal;\n+364 K maxAbsElement = (isnormal(matrix.infinity_norm())) ? matrix.infinity_norm\n+() : K(1.0);\n+365 Matrix scaledMatrix = matrix / maxAbsElement;\n+366 K r = Impl::eigenValues3dImpl(scaledMatrix, _\be_\bi_\bg_\be_\bn_\bV_\ba_\bl_\bu_\be_\bs);\n+367\n+368 if constexpr(Tag==EigenvaluesEigenvectors) {\n+369 K offDiagNorm = Vector{scaledMatrix[0][1],scaledMatrix[0][2],scaledMatrix\n+[1][2]}.two_norm2();\n+370 if (offDiagNorm <= std::numeric_limits::epsilon())\n+371 {\n+372 _\be_\bi_\bg_\be_\bn_\bV_\ba_\bl_\bu_\be_\bs = {scaledMatrix[0][0], scaledMatrix[1][1], scaledMatrix[2][2]};\n+373 eigenVectors = {{1.0, 0.0, 0.0}, {0.0, 1.0, 0.0}, {0.0, 0.0, 1.0}};\n+374\n+375 // Use bubble sort to jointly sort eigenvalues and eigenvectors\n+376 // such that eigenvalues are ascending\n+377 if (_\be_\bi_\bg_\be_\bn_\bV_\ba_\bl_\bu_\be_\bs[0] > _\be_\bi_\bg_\be_\bn_\bV_\ba_\bl_\bu_\be_\bs[1])\n+378 {\n+379 std::swap(_\be_\bi_\bg_\be_\bn_\bV_\ba_\bl_\bu_\be_\bs[0], _\be_\bi_\bg_\be_\bn_\bV_\ba_\bl_\bu_\be_\bs[1]);\n+380 std::swap(eigenVectors[0], eigenVectors[1]);\n+381 }\n+382 if (_\be_\bi_\bg_\be_\bn_\bV_\ba_\bl_\bu_\be_\bs[1] > _\be_\bi_\bg_\be_\bn_\bV_\ba_\bl_\bu_\be_\bs[2])\n+383 {\n+384 std::swap(_\be_\bi_\bg_\be_\bn_\bV_\ba_\bl_\bu_\be_\bs[1], _\be_\bi_\bg_\be_\bn_\bV_\ba_\bl_\bu_\be_\bs[2]);\n+385 std::swap(eigenVectors[1], eigenVectors[2]);\n+386 }\n+387 if (_\be_\bi_\bg_\be_\bn_\bV_\ba_\bl_\bu_\be_\bs[0] > _\be_\bi_\bg_\be_\bn_\bV_\ba_\bl_\bu_\be_\bs[1])\n+388 {\n+389 std::swap(_\be_\bi_\bg_\be_\bn_\bV_\ba_\bl_\bu_\be_\bs[0], _\be_\bi_\bg_\be_\bn_\bV_\ba_\bl_\bu_\be_\bs[1]);\n+390 std::swap(eigenVectors[0], eigenVectors[1]);\n+391 }\n+392 }\n+393 else {\n+394 /*Compute the eigenvectors so that the set\n+395 [evec[0], evec[1], evec[2]] is right handed and\n+396 orthonormal. */\n+397\n+398 Matrix evec(0.0);\n+399 Vector eval(_\be_\bi_\bg_\be_\bn_\bV_\ba_\bl_\bu_\be_\bs);\n+400 if(r >= 0) {\n+401 Impl::eig0(scaledMatrix, eval[2], evec[2]);\n+402 Impl::eig1(scaledMatrix, evec[2], evec[1], eval[1]);\n+403 evec[0] = Impl::crossProduct(evec[1], evec[2]);\n+404 }\n+405 else {\n+406 Impl::eig0(scaledMatrix, eval[0], evec[0]);\n+407 Impl::eig1(scaledMatrix, evec[0], evec[1], eval[1]);\n+408 evec[2] = Impl::crossProduct(evec[0], evec[1]);\n+409 }\n+410 //sort eval/evec-pairs in ascending order\n+411 using EVPair = std::pair;\n+412 std::vector pairs;\n+413 for(std::size_t i=0; i<=2; ++i)\n+414 pairs.push_back(EVPair(eval[i], evec[i]));\n+415 auto comp = [](EVPair x, EVPair y){ return x.first < y.first; };\n+416 std::sort(pairs.begin(), pairs.end(), comp);\n+417 for(std::size_t i=0; i<=2; ++i){\n+418 _\be_\bi_\bg_\be_\bn_\bV_\ba_\bl_\bu_\be_\bs[i] = pairs[i].first;\n+419 eigenVectors[i] = pairs[i].second;\n+420 }\n+421 }\n+422 }\n+423 //The preconditioning scaled the matrix, which scales the eigenvalues.\n+Revert the scaling.\n+424 _\be_\bi_\bg_\be_\bn_\bV_\ba_\bl_\bu_\be_\bs *= maxAbsElement;\n+425 }\n+426\n+427 // forwarding to LAPACK with corresponding tag\n+428 template \n+429 static void eigenValuesVectorsLapackImpl(const FieldMatrix&\n+matrix,\n+430 FieldVector& _\be_\bi_\bg_\be_\bn_\bV_\ba_\bl_\bu_\be_\bs,\n+431 FieldMatrix& eigenVectors)\n+432 {\n+433 {\n+434#if HAVE_LAPACK\n+435 /*Lapack uses a proprietary tag to determine whether both eigenvalues and\n+436 -vectors ('v') or only eigenvalues ('n') should be calculated */\n+437 const char jobz = \"nv\"[Tag];\n+438\n+439 const long int N = dim ;\n+440 const char uplo = 'u'; // use upper triangular matrix\n+441\n+442 // length of matrix vector, LWORK >= max(1,3*N-1)\n+443 const long int lwork = 3*N -1 ;\n+444\n+445 constexpr bool isKLapackType = std::is_same_v || std::\n+is_same_v;\n+446 using LapackNumType = std::conditional_t;\n+447\n+448 // matrix to put into dsyev\n+449 LapackNumType matrixVector[dim * dim];\n+450\n+451 // copy matrix\n+452 int row = 0;\n+453 for(int i=0; i\n+508 static void eigenValuesVectorsImpl(const FieldMatrix& matrix,\n+509 FieldVector& _\be_\bi_\bg_\be_\bn_\bV_\ba_\bl_\bu_\be_\bs,\n+510 FieldMatrix& eigenVectors)\n+511 {\n+512 eigenValuesVectorsLapackImpl(matrix,_\be_\bi_\bg_\be_\bn_\bV_\ba_\bl_\bu_\be_\bs,eigenVectors);\n+513 }\n+514 } //namespace Impl\n+515\n+523 template \n+_\b5_\b2_\b4 static void _\be_\bi_\bg_\be_\bn_\bV_\ba_\bl_\bu_\be_\bs(const _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bK_\b,_\b _\bd_\bi_\bm_\b,_\b _\bd_\bi_\bm_\b>& matrix,\n+525 _\bF_\bi_\be_\bl_\bd_\bV_\be_\bc_\bt_\bo_\br_\b<_\bK_\b _\b,_\bd_\bi_\bm_\b>& _\be_\bi_\bg_\be_\bn_\bV_\ba_\bl_\bu_\be_\bs)\n+526 {\n+527 _\bI_\bm_\bp_\bl_\b:_\b:_\bE_\bV_\bD_\bu_\bm_\bm_\by_\b<_\bK_\b,_\bd_\bi_\bm_\b> dummy;\n+528 Impl::eigenValuesVectorsImpl(matrix,\n+_\be_\bi_\bg_\be_\bn_\bV_\ba_\bl_\bu_\be_\bs, dummy);\n+529 }\n+530\n+539 template \n+_\b5_\b4_\b0 static void _\be_\bi_\bg_\be_\bn_\bV_\ba_\bl_\bu_\be_\bs_\bV_\be_\bc_\bt_\bo_\br_\bs(const _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bK_\b,_\b _\bd_\bi_\bm_\b,_\b _\bd_\bi_\bm_\b>& matrix,\n+541 _\bF_\bi_\be_\bl_\bd_\bV_\be_\bc_\bt_\bo_\br_\b<_\bK_\b _\b,_\bd_\bi_\bm_\b>& _\be_\bi_\bg_\be_\bn_\bV_\ba_\bl_\bu_\be_\bs,\n+542 _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bK_\b,_\b _\bd_\bi_\bm_\b,_\b _\bd_\bi_\bm_\b>& eigenVectors)\n+543 {\n+544 Impl::eigenValuesVectorsImpl(matrix,\n+_\be_\bi_\bg_\be_\bn_\bV_\ba_\bl_\bu_\be_\bs, eigenVectors);\n+545 }\n+546\n+554 template \n+_\b5_\b5_\b5 static void _\be_\bi_\bg_\be_\bn_\bV_\ba_\bl_\bu_\be_\bs_\bL_\ba_\bp_\ba_\bc_\bk(const _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bK_\b,_\b _\bd_\bi_\bm_\b,_\b _\bd_\bi_\bm_\b>& matrix,\n+556 _\bF_\bi_\be_\bl_\bd_\bV_\be_\bc_\bt_\bo_\br_\b<_\bK_\b,_\b _\bd_\bi_\bm_\b>& _\be_\bi_\bg_\be_\bn_\bV_\ba_\bl_\bu_\be_\bs)\n+557 {\n+558 _\bI_\bm_\bp_\bl_\b:_\b:_\bE_\bV_\bD_\bu_\bm_\bm_\by_\b<_\bK_\b,_\bd_\bi_\bm_\b> dummy;\n+559 Impl::eigenValuesVectorsLapackImpl\n+(matrix, _\be_\bi_\bg_\be_\bn_\bV_\ba_\bl_\bu_\be_\bs, dummy);\n+560 }\n+561\n+570 template \n+_\b5_\b7_\b1 static void _\be_\bi_\bg_\be_\bn_\bV_\ba_\bl_\bu_\be_\bs_\bV_\be_\bc_\bt_\bo_\br_\bs_\bL_\ba_\bp_\ba_\bc_\bk(const _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bK_\b,_\b _\bd_\bi_\bm_\b,_\b _\bd_\bi_\bm_\b>&\n+matrix,\n+572 _\bF_\bi_\be_\bl_\bd_\bV_\be_\bc_\bt_\bo_\br_\b<_\bK_\b,_\b _\bd_\bi_\bm_\b>& _\be_\bi_\bg_\be_\bn_\bV_\ba_\bl_\bu_\be_\bs,\n+573 _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bK_\b,_\b _\bd_\bi_\bm_\b,_\b _\bd_\bi_\bm_\b>& eigenVectors)\n+574 {\n+575 Impl::eigenValuesVectorsLapackImpl\n+(matrix, _\be_\bi_\bg_\be_\bn_\bV_\ba_\bl_\bu_\be_\bs, eigenVectors);\n+576 }\n+577\n+585 template \n+_\b5_\b8_\b6 static void _\be_\bi_\bg_\be_\bn_\bV_\ba_\bl_\bu_\be_\bs_\bN_\bo_\bn_\bS_\by_\bm(const _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bK_\b,_\b _\bd_\bi_\bm_\b,_\b _\bd_\bi_\bm_\b>& matrix,\n+587 _\bF_\bi_\be_\bl_\bd_\bV_\be_\bc_\bt_\bo_\br_\b<_\bC_\b,_\b _\bd_\bi_\bm_\b>& _\be_\bi_\bg_\be_\bn_\bV_\ba_\bl_\bu_\be_\bs)\n+588 {\n+589#if HAVE_LAPACK\n+590 {\n+591 const long int N = dim ;\n+592 const char jobvl = 'n';\n+593 const char jobvr = 'n';\n+594\n+595 constexpr bool isKLapackType = std::is_same_v || std::\n+is_same_v;\n+596 using LapackNumType = std::conditional_t;\n+597\n+598 // matrix to put into dgeev\n+599 LapackNumType matrixVector[dim * dim];\n+600\n+601 // copy matrix\n+602 int row = 0;\n+603 for(int i=0; i &matrix,\n+FieldVector< C, dim > &eigenValues)\n+calculates the eigenvalues of a non-symmetric field matrix\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn fmatrixev.hh:586\n+_\bD_\bu_\bn_\be_\b:_\b:_\bF_\bM_\ba_\bt_\br_\bi_\bx_\bH_\be_\bl_\bp_\b:_\b:_\be_\bi_\bg_\be_\bn_\bV_\ba_\bl_\bu_\be_\bs\n+static void eigenValues(const FieldMatrix< K, dim, dim > &matrix, FieldVector<\n+K, dim > &eigenValues)\n+calculates the eigenvalues of a symmetric field matrix\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn fmatrixev.hh:524\n+_\bD_\bu_\bn_\be_\b:_\b:_\bF_\bM_\ba_\bt_\br_\bi_\bx_\bH_\be_\bl_\bp_\b:_\b:_\be_\bi_\bg_\be_\bn_\bV_\ba_\bl_\bu_\be_\bs_\bL_\ba_\bp_\ba_\bc_\bk\n+static void eigenValuesLapack(const FieldMatrix< K, dim, dim > &matrix,\n+FieldVector< K, dim > &eigenValues)\n+calculates the eigenvalues of a symmetric field matrix\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn fmatrixev.hh:555\n+_\bD_\bu_\bn_\be_\b:_\b:_\bF_\bM_\ba_\bt_\br_\bi_\bx_\bH_\be_\bl_\bp_\b:_\b:_\be_\bi_\bg_\be_\bn_\bV_\ba_\bl_\bu_\be_\bs_\bV_\be_\bc_\bt_\bo_\br_\bs\n+static void eigenValuesVectors(const FieldMatrix< K, dim, dim > &matrix,\n+FieldVector< K, dim > &eigenValues, FieldMatrix< K, dim, dim > &eigenVectors)\n+calculates the eigenvalues and eigenvectors of a symmetric field matrix\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn fmatrixev.hh:540\n+_\bD_\bu_\bn_\be_\b:_\b:_\bF_\bM_\ba_\bt_\br_\bi_\bx_\bH_\be_\bl_\bp_\b:_\b:_\be_\bi_\bg_\be_\bn_\bV_\ba_\bl_\bu_\be_\bs_\bV_\be_\bc_\bt_\bo_\br_\bs_\bL_\ba_\bp_\ba_\bc_\bk\n+static void eigenValuesVectorsLapack(const FieldMatrix< K, dim, dim > &matrix,\n+FieldVector< K, dim > &eigenValues, FieldMatrix< K, dim, dim > &eigenVectors)\n+calculates the eigenvalues and -vectors of a symmetric field matrix\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn fmatrixev.hh:571\n+_\bD_\bu_\bn_\be_\b:_\b:_\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx\n+A dense n x m matrix.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn fmatrix.hh:117\n+_\bD_\bu_\bn_\be_\b:_\b:_\bF_\bi_\be_\bl_\bd_\bV_\be_\bc_\bt_\bo_\br\n+vector space out of a tensor product of fields.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn fvector.hh:91\n+_\bD_\bu_\bn_\be_\b:_\b:_\bN_\bo_\bt_\bI_\bm_\bp_\bl_\be_\bm_\be_\bn_\bt_\be_\bd\n+Default exception for dummy implementations.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn exceptions.hh:263\n+_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bv_\ba_\bl_\bi_\bd_\bS_\bt_\ba_\bt_\be_\bE_\bx_\bc_\be_\bp_\bt_\bi_\bo_\bn\n+Default exception if a function was called while the object is not in a valid\n+state for that function...\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn exceptions.hh:281\n+_\bD_\bu_\bn_\be_\b:_\b:_\bF_\bi_\be_\bl_\bd_\bT_\br_\ba_\bi_\bt_\bs_\b:_\b:_\br_\be_\ba_\bl_\b__\bt_\by_\bp_\be\n+T real_type\n+export the type representing the real type of the field\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn ftraits.hh:30\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bt_\ba_\bn_\bd_\ba_\br_\bd_\bM_\ba_\bt_\bh_\be_\bm_\ba_\bt_\bi_\bc_\ba_\bl_\bC_\bo_\bn_\bs_\bt_\ba_\bn_\bt_\bs_\b<_\b _\bF_\bi_\be_\bl_\bd_\b _\b>_\b:_\b:_\bp_\bi\n+static const Field pi()\n+Archimedes' constant.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn math.hh:48\n ===============================================================================\n Generated by\u00a0_\b[_\bd_\bo_\bx_\by_\bg_\be_\bn_\b] 1.9.8\n"}]}, {"source1": "./usr/share/doc/libdune-common-doc/doxygen/a00164.html", "source2": "./usr/share/doc/libdune-common-doc/doxygen/a00164.html", "unified_diff": "@@ -1,15 +1,15 @@\n \n \n \n \n \n \n \n-dune-common: parameterizedobject.hh File Reference\n+dune-common: parametertree.hh File Reference\n \n \n \n \n \n \n \n@@ -72,36 +72,68 @@\n
  • dune
  • common
  • \n
    \n \n
    \n \n-
    parameterizedobject.hh File Reference
    \n+
    parametertree.hh File Reference
    \n
    \n
    \n-
    #include <functional>
    \n+\n+

    A hierarchical structure of string parameters. \n+More...

    \n+
    #include <array>
    \n+#include <cstddef>
    \n+#include <iostream>
    \n+#include <istream>
    \n+#include <iterator>
    \n+#include <locale>
    \n #include <map>
    \n-#include <memory>
    \n-#include <dune/common/exceptions.hh>
    \n-#include <dune/common/typeutilities.hh>
    \n+#include <ostream>
    \n+#include <sstream>
    \n+#include <string>
    \n+#include <typeinfo>
    \n+#include <vector>
    \n+#include <algorithm>
    \n+#include <bitset>
    \n+#include <dune/common/exceptions.hh>
    \n+#include <dune/common/fvector.hh>
    \n+#include <dune/common/classname.hh>
    \n
    \n

    Go to the source code of this file.

    \n \n \n-\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n \n

    \n Classes

    class  Dune::ParameterizedObjectFactory< TypeT(Args...), KeyT >
    class  Dune::ParameterTree
     Hierarchical structure of string parameters. More...
     
    struct  Dune::ParameterTree::Parser< std::basic_string< char, traits, Allocator > >
     
    struct  Dune::ParameterTree::Parser< bool >
     
    struct  Dune::ParameterTree::Parser< bool >::ToLower
     
    struct  Dune::ParameterTree::Parser< FieldVector< T, n > >
     
    struct  Dune::ParameterTree::Parser< std::array< T, n > >
     
    struct  Dune::ParameterTree::Parser< std::bitset< n > >
     
    struct  Dune::ParameterTree::Parser< std::vector< T, A > >
     
    \n \n \n \n \n

    \n Namespaces

    namespace  Dune
     Dune namespace.
     
    \n-
    \n+

    Detailed Description

    \n+

    A hierarchical structure of string parameters.

    \n+
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,23 +1,54 @@\n dune-common\u00a02.10\n Loading...\n Searching...\n No Matches\n * _\bd_\bu_\bn_\be\n * _\bc_\bo_\bm_\bm_\bo_\bn\n _\bC_\bl_\ba_\bs_\bs_\be_\bs | _\bN_\ba_\bm_\be_\bs_\bp_\ba_\bc_\be_\bs\n-parameterizedobject.hh File Reference\n-#include \n+parametertree.hh File Reference\n+A hierarchical structure of string parameters. _\bM_\bo_\br_\be_\b._\b._\b.\n+#include \n+#include \n+#include \n+#include \n+#include \n+#include \n #include \n-#include \n+#include \n+#include \n+#include \n+#include \n+#include \n+#include \n+#include \n #include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\be_\bx_\bc_\be_\bp_\bt_\bi_\bo_\bn_\bs_\b._\bh_\bh>\n-#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bt_\by_\bp_\be_\bu_\bt_\bi_\bl_\bi_\bt_\bi_\be_\bs_\b._\bh_\bh>\n+#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bf_\bv_\be_\bc_\bt_\bo_\br_\b._\bh_\bh>\n+#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bc_\bl_\ba_\bs_\bs_\bn_\ba_\bm_\be_\b._\bh_\bh>\n _\bG_\bo_\b _\bt_\bo_\b _\bt_\bh_\be_\b _\bs_\bo_\bu_\br_\bc_\be_\b _\bc_\bo_\bd_\be_\b _\bo_\bf_\b _\bt_\bh_\bi_\bs_\b _\bf_\bi_\bl_\be_\b.\n C\bCl\bla\bas\bss\bse\bes\bs\n-class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bP_\ba_\br_\ba_\bm_\be_\bt_\be_\br_\bi_\bz_\be_\bd_\bO_\bb_\bj_\be_\bc_\bt_\bF_\ba_\bc_\bt_\bo_\br_\by_\b<_\b _\bT_\by_\bp_\be_\bT_\b(_\bA_\br_\bg_\bs_\b._\b._\b._\b)_\b,_\b _\bK_\be_\by_\bT_\b _\b>\n+ class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bP_\ba_\br_\ba_\bm_\be_\bt_\be_\br_\bT_\br_\be_\be\n+\u00a0 Hierarchical structure of string parameters. _\bM_\bo_\br_\be_\b._\b._\b.\n+\u00a0\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bP_\ba_\br_\ba_\bm_\be_\bt_\be_\br_\bT_\br_\be_\be_\b:_\b:_\bP_\ba_\br_\bs_\be_\br_\b<_\b _\bs_\bt_\bd_\b:_\b:_\bb_\ba_\bs_\bi_\bc_\b__\bs_\bt_\br_\bi_\bn_\bg_\b<_\b _\bc_\bh_\ba_\br_\b,_\b _\bt_\br_\ba_\bi_\bt_\bs_\b,\n+ _\bA_\bl_\bl_\bo_\bc_\ba_\bt_\bo_\br_\b _\b>_\b _\b>\n+\u00a0\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bP_\ba_\br_\ba_\bm_\be_\bt_\be_\br_\bT_\br_\be_\be_\b:_\b:_\bP_\ba_\br_\bs_\be_\br_\b<_\b _\bb_\bo_\bo_\bl_\b _\b>\n+\u00a0\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bP_\ba_\br_\ba_\bm_\be_\bt_\be_\br_\bT_\br_\be_\be_\b:_\b:_\bP_\ba_\br_\bs_\be_\br_\b<_\b _\bb_\bo_\bo_\bl_\b _\b>_\b:_\b:_\bT_\bo_\bL_\bo_\bw_\be_\br\n+\u00a0\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bP_\ba_\br_\ba_\bm_\be_\bt_\be_\br_\bT_\br_\be_\be_\b:_\b:_\bP_\ba_\br_\bs_\be_\br_\b<_\b _\bF_\bi_\be_\bl_\bd_\bV_\be_\bc_\bt_\bo_\br_\b<_\b _\bT_\b,_\b _\bn_\b _\b>_\b _\b>\n+\u00a0\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bP_\ba_\br_\ba_\bm_\be_\bt_\be_\br_\bT_\br_\be_\be_\b:_\b:_\bP_\ba_\br_\bs_\be_\br_\b<_\b _\bs_\bt_\bd_\b:_\b:_\ba_\br_\br_\ba_\by_\b<_\b _\bT_\b,_\b _\bn_\b _\b>_\b _\b>\n+\u00a0\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bP_\ba_\br_\ba_\bm_\be_\bt_\be_\br_\bT_\br_\be_\be_\b:_\b:_\bP_\ba_\br_\bs_\be_\br_\b<_\b _\bs_\bt_\bd_\b:_\b:_\bb_\bi_\bt_\bs_\be_\bt_\b<_\b _\bn_\b _\b>_\b _\b>\n+\u00a0\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bP_\ba_\br_\ba_\bm_\be_\bt_\be_\br_\bT_\br_\be_\be_\b:_\b:_\bP_\ba_\br_\bs_\be_\br_\b<_\b _\bs_\bt_\bd_\b:_\b:_\bv_\be_\bc_\bt_\bo_\br_\b<_\b _\bT_\b,_\b _\bA_\b _\b>_\b _\b>\n \u00a0\n N\bNa\bam\bme\bes\bsp\bpa\bac\bce\bes\bs\n namespace \u00a0 _\bD_\bu_\bn_\be\n \u00a0 _\bD_\bu_\bn_\be namespace.\n \u00a0\n+*\b**\b**\b**\b**\b* D\bDe\bet\bta\bai\bil\ble\bed\bd D\bDe\bes\bsc\bcr\bri\bip\bpt\bti\bio\bon\bn *\b**\b**\b**\b**\b*\n+A hierarchical structure of string parameters.\n ===============================================================================\n Generated by\u00a0_\b[_\bd_\bo_\bx_\by_\bg_\be_\bn_\b] 1.9.8\n"}]}, {"source1": "./usr/share/doc/libdune-common-doc/doxygen/a00164_source.html", "source2": "./usr/share/doc/libdune-common-doc/doxygen/a00164_source.html", "unified_diff": "@@ -1,15 +1,15 @@\n \n \n \n \n \n \n \n-dune-common: parameterizedobject.hh Source File\n+dune-common: parametertree.hh Source File\n \n \n \n \n \n \n \n@@ -74,178 +74,348 @@\n \n
    \n \n
    \n \n
    \n-
    parameterizedobject.hh
    \n+
    parametertree.hh
    \n
    \n
    \n-Go to the documentation of this file.
    1// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-
    \n-
    2// vi: set et ts=4 sw=4 sts=4:
    \n+Go to the documentation of this file.
    1// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
    \n+
    2// vi: set et ts=4 sw=2 sts=2:
    \n
    3// SPDX-FileCopyrightInfo: Copyright \u00a9 DUNE Project contributors, see file LICENSE.md in module root
    \n
    4// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception
    \n-
    5#ifndef DUNE_COMMON_PARAMETERIZEDOBJECT_HH
    \n-
    6#define DUNE_COMMON_PARAMETERIZEDOBJECT_HH
    \n+
    5#ifndef DUNE_PARAMETERTREE_HH
    \n+
    6#define DUNE_PARAMETERTREE_HH
    \n
    7
    \n-
    8#include <functional>
    \n-
    9#include <map>
    \n-
    10#include <memory>
    \n-
    11
    \n-\n-\n-
    14
    \n-
    15namespace Dune {
    \n-
    16
    \n-
    34template<typename Signature,
    \n-
    35 typename KeyT = std::string>
    \n-\n-
    37
    \n-
    38template<typename TypeT,
    \n-
    39 typename KeyT,
    \n-
    40 typename... Args>
    \n-
    \n-
    41class ParameterizedObjectFactory<TypeT(Args...), KeyT>
    \n-
    42{
    \n-
    43 public:
    \n-
    44
    \n-
    46 typedef KeyT Key;
    \n+
    12#include <array>
    \n+
    13#include <cstddef>
    \n+
    14#include <iostream>
    \n+
    15#include <istream>
    \n+
    16#include <iterator>
    \n+
    17#include <locale>
    \n+
    18#include <map>
    \n+
    19#include <ostream>
    \n+
    20#include <sstream>
    \n+
    21#include <string>
    \n+
    22#include <typeinfo>
    \n+
    23#include <vector>
    \n+
    24#include <algorithm>
    \n+
    25#include <bitset>
    \n+
    26
    \n+\n+\n+\n+
    30
    \n+
    31namespace Dune {
    \n+
    32
    \n+
    \n+\n+
    37 {
    \n+
    38 // class providing a single static parse() function, used by the
    \n+
    39 // generic get() method
    \n+
    40 template<typename T>
    \n+
    41 struct Parser;
    \n+
    42
    \n+
    43 struct EmptyTag {};
    \n+
    44 ParameterTree(EmptyTag);
    \n+
    45
    \n+
    46 public:
    \n
    47
    \n-
    49 using Type = TypeT;
    \n-
    50
    \n-
    51 protected:
    \n-
    52
    \n-
    53 using Creator = std::function<Type(Args...)>;
    \n-
    54
    \n-
    55 template<class F>
    \n-
    \n-\n-
    57 -> decltype( std::declval<F>()(std::declval<Args>()...), std::true_type())
    \n-
    58 {
    \n-
    59 return {};
    \n-
    60 }
    \n-
    \n-
    61
    \n-
    62 template<class F>
    \n-
    \n-
    63 static constexpr std::false_type has_proper_signature(Dune::PriorityTag<0>)
    \n-
    64 {
    \n-
    65 return {};
    \n-
    66 }
    \n-
    \n-
    67
    \n-
    68 public:
    \n-
    69
    \n-
    \n-
    77 Type create(Key const& key, Args ... args) const {
    \n-
    78 typename Registry::const_iterator i = registry_.find(key);
    \n-
    79 if (i == registry_.end()) {
    \n-\n-
    81 "ParametrizedObjectFactory: key ``" <<
    \n-
    82 key << "'' not registered");
    \n-
    83 }
    \n-
    84 else return i->second(args...);
    \n-
    85 }
    \n-
    \n+
    50 typedef std::vector<std::string> KeyVector;
    \n+
    51
    \n+\n+
    55
    \n+
    56
    \n+
    64 bool hasKey(const std::string& key) const;
    \n+
    65
    \n+
    66
    \n+
    74 bool hasSub(const std::string& sub) const;
    \n+
    75
    \n+
    76
    \n+
    85 std::string& operator[] (const std::string& key);
    \n
    86
    \n-
    100 template<class Impl>
    \n-
    \n-
    101 void define(Key const& key)
    \n-
    102 {
    \n-
    103 registry_[key] = DefaultCreator<Impl>();
    \n-
    104 }
    \n-
    \n-
    105
    \n-
    119 template<class F,
    \n-
    120 typename std::enable_if<has_proper_signature<F>(PriorityTag<42>()), int>::type = 0>
    \n-
    \n-
    121 void define(Key const& key, F&& f)
    \n-
    122 {
    \n-
    123 registry_[key] = f;
    \n-
    124 }
    \n-
    \n-
    125
    \n-
    140 template<class Impl,
    \n-
    141 typename std::enable_if<
    \n-
    142 std::is_convertible<Impl, Type>::value
    \n-
    143 and not std::is_convertible<Impl, Creator>::value,
    \n-
    144 int>::type = 0>
    \n-
    \n-
    145 void define(Key const& key, Impl&& t)
    \n-
    146 {
    \n-
    147 registry_[key] = [=](Args...) { return t;};
    \n-
    148 }
    \n-
    \n+
    87
    \n+
    97 const std::string& operator[] (const std::string& key) const;
    \n+
    98
    \n+
    99
    \n+
    107 void report(std::ostream& stream = std::cout,
    \n+
    108 const std::string& prefix = "") const;
    \n+
    109
    \n+
    110
    \n+
    116 ParameterTree& sub(const std::string& sub);
    \n+
    117
    \n+
    118
    \n+
    125 const ParameterTree& sub(const std::string& sub, bool fail_if_missing = false) const;
    \n+
    126
    \n+
    127
    \n+
    136 std::string get(const std::string& key, const std::string& defaultValue) const;
    \n+
    137
    \n+
    148 std::string get(const std::string& key, const char* defaultValue) const;
    \n
    149
    \n-
    \n-
    150 bool contains(Key const& key) const
    \n-
    151 {
    \n-
    152 return registry_.count(key);
    \n-
    153 }
    \n-
    \n-
    154
    \n-
    155 private:
    \n-
    156
    \n-
    157 template<class T>
    \n-
    158 struct Tag{};
    \n-
    159
    \n-
    160 template<class Impl>
    \n-
    161 struct DefaultCreator
    \n-
    162 {
    \n-
    163 template<class... T>
    \n-
    164 Type operator()(T&&... args) const
    \n-
    165 {
    \n-
    166 return DefaultCreator::create(Tag<Type>(), PriorityTag<42>(), std::forward<T>(args)...);
    \n-
    167 }
    \n-
    168
    \n-
    169 template<class Target, class... T>
    \n-
    170 static Type create(Tag<Target>, PriorityTag<1>, T&& ... args) {
    \n-
    171 return Impl(std::forward<T>(args)...);
    \n-
    172 }
    \n-
    173
    \n-
    174 template<class Target, class... T>
    \n-
    175 static Type create(Tag<std::unique_ptr<Target>>, PriorityTag<2>, T&& ... args) {
    \n-
    176 return std::make_unique<Impl>(std::forward<T>(args)...);
    \n-
    177 }
    \n-
    178
    \n-
    179 template<class Target, class... T>
    \n-
    180 static Type create(Tag<std::shared_ptr<Target>>, PriorityTag<3>, T&& ... args) {
    \n-
    181 return std::make_shared<Impl>(std::forward<T>(args)...);
    \n-
    182 }
    \n-
    183
    \n-
    184 };
    \n-
    185
    \n-
    186 typedef std::map<Key, Creator> Registry;
    \n-
    187 Registry registry_;
    \n-
    188};
    \n+
    150
    \n+
    160 template<typename T>
    \n+
    \n+
    161 T get(const std::string& key, const T& defaultValue) const {
    \n+
    162 if(hasKey(key))
    \n+
    163 return get<T>(key);
    \n+
    164 else
    \n+
    165 return defaultValue;
    \n+
    166 }
    \n+
    \n+
    167
    \n+
    176 template <class T>
    \n+
    \n+
    177 T get(const std::string& key) const {
    \n+
    178 if(not hasKey(key))
    \n+
    179 DUNE_THROW(Dune::RangeError, "Key '" << key
    \n+
    180 << "' not found in ParameterTree (prefix " + prefix_ + ")");
    \n+
    181 try {
    \n+
    182 return Parser<T>::parse((*this)[key]);
    \n+
    183 }
    \n+
    184 catch(const RangeError& e) {
    \n+
    185 // rethrow the error and add more information
    \n+
    186 DUNE_THROW(RangeError, "Cannot parse value \\"" << (*this)[key]
    \n+
    187 << "\\" for key \\"" << prefix_ << "." << key << "\\""
    \n+
    188 << e.what());
    \n+
    189 }
    \n+
    190 }
    \n
    \n-
    189
    \n-
    190
    \n
    191
    \n-
    192} // end namespace Dune
    \n-
    193
    \n-
    194#endif // DUNE_COMMON_PARAMETERIZEDOBJECT_HH
    \n-
    A few common exception classes.
    \n-
    Utilities for type computations, constraining overloads, ...
    \n+
    199 const KeyVector& getValueKeys() const;
    \n+
    200
    \n+
    201
    \n+
    209 const KeyVector& getSubKeys() const;
    \n+
    210
    \n+
    211 protected:
    \n+
    212
    \n+
    213 static const ParameterTree empty_;
    \n+
    214
    \n+
    215 std::string prefix_;
    \n+
    216
    \n+\n+\n+
    219
    \n+
    220 std::map<std::string, std::string> values_;
    \n+
    221 std::map<std::string, ParameterTree> subs_;
    \n+
    222
    \n+
    223 static std::string ltrim(const std::string& s);
    \n+
    224 static std::string rtrim(const std::string& s);
    \n+
    225 static std::vector<std::string> split(const std::string & s);
    \n+
    226
    \n+
    227 // parse into a fixed-size range of iterators
    \n+
    228 template<class Iterator>
    \n+
    \n+
    229 static void parseRange(const std::string &str,
    \n+
    230 Iterator it, const Iterator &end)
    \n+
    231 {
    \n+
    232 typedef typename std::iterator_traits<Iterator>::value_type Value;
    \n+
    233 std::istringstream s(str);
    \n+
    234 // make sure we are in locale "C"
    \n+
    235 s.imbue(std::locale::classic());
    \n+
    236 std::size_t n = 0;
    \n+
    237 for(; it != end; ++it, ++n) {
    \n+
    238 s >> *it;
    \n+
    239 if(!s)
    \n+
    240 DUNE_THROW(RangeError, "as a range of items of type "
    \n+
    241 << className<Value>()
    \n+
    242 << " (" << n << " items were extracted successfully)");
    \n+
    243 }
    \n+
    244 Value dummy;
    \n+
    245 s >> dummy;
    \n+
    246 // now extraction should have failed, and eof should be set
    \n+
    247 if(not s.fail() or not s.eof())
    \n+
    248 DUNE_THROW(RangeError, "as a range of "
    \n+
    249 << n << " items of type "
    \n+
    250 << className<Value>() << " (more items than the range can hold)");
    \n+
    251 }
    \n+
    \n+
    252 };
    \n+
    \n+
    253
    \n+
    254 template<typename T>
    \n+
    255 struct ParameterTree::Parser {
    \n+
    256 static T parse(const std::string& str) {
    \n+
    257 T val;
    \n+
    258 std::istringstream s(str);
    \n+
    259 // make sure we are in locale "C"
    \n+
    260 s.imbue(std::locale::classic());
    \n+
    261 s >> val;
    \n+
    262 if(!s)
    \n+
    263 DUNE_THROW(RangeError, " as a " << className<T>());
    \n+
    264 char dummy;
    \n+
    265 s >> dummy;
    \n+
    266 // now extraction should have failed, and eof should be set
    \n+
    267 if ((! s.fail()) || (! s.eof()))
    \n+
    268 DUNE_THROW(RangeError, " as a " << className<T>());
    \n+
    269 return val;
    \n+
    270 }
    \n+
    271 };
    \n+
    272
    \n+
    273 // "How do I convert a string into a wstring in C++?" "Why, that very simple
    \n+
    274 // son. You just need a these hundred lines of code."
    \n+
    275 // Instead I'm going to restrict myself to string with charT=char here.
    \n+
    276 template<typename traits, typename Allocator>
    \n+
    \n+
    277 struct ParameterTree::Parser<std::basic_string<char, traits, Allocator> > {
    \n+
    278 static std::basic_string<char, traits, Allocator>
    \n+
    \n+
    279 parse(const std::string& str) {
    \n+
    280 std::string trimmed = ltrim(rtrim(str));
    \n+
    281 return std::basic_string<char, traits, Allocator>(trimmed.begin(),
    \n+
    282 trimmed.end());
    \n+
    283 }
    \n+
    \n+
    284 };
    \n+
    \n+
    285
    \n+
    286 template<>
    \n+
    \n+
    287 struct ParameterTree::Parser< bool > {
    \n+
    \n+
    288 struct ToLower {
    \n+
    \n+
    289 char operator()(char c)
    \n+
    290 {
    \n+
    291 return std::tolower(c, std::locale::classic());
    \n+
    292 }
    \n+
    \n+
    293 };
    \n+
    \n+
    294
    \n+
    295 static bool
    \n+
    \n+
    296 parse(const std::string& str) {
    \n+
    297 std::string ret = str;
    \n+
    298
    \n+
    299 std::transform(ret.begin(), ret.end(), ret.begin(), ToLower());
    \n+
    300
    \n+
    301 if (ret == "yes" || ret == "true")
    \n+
    302 return true;
    \n+
    303
    \n+
    304 if (ret == "no" || ret == "false")
    \n+
    305 return false;
    \n+
    306
    \n+
    307 return (Parser<int>::parse(ret) != 0);
    \n+
    308 }
    \n+
    \n+
    309 };
    \n+
    \n+
    310
    \n+
    311 template<typename T, int n>
    \n+
    \n+
    312 struct ParameterTree::Parser<FieldVector<T, n> > {
    \n+
    313 static FieldVector<T, n>
    \n+
    \n+
    314 parse(const std::string& str) {
    \n+\n+
    316 parseRange(str, val.begin(), val.end());
    \n+
    317 return val;
    \n+
    318 }
    \n+
    \n+
    319 };
    \n+
    \n+
    320
    \n+
    321 template<typename T, std::size_t n>
    \n+
    \n+
    322 struct ParameterTree::Parser<std::array<T, n> > {
    \n+
    323 static std::array<T, n>
    \n+
    \n+
    324 parse(const std::string& str) {
    \n+
    325 std::array<T, n> val;
    \n+
    326 parseRange(str, val.begin(), val.end());
    \n+
    327 return val;
    \n+
    328 }
    \n+
    \n+
    329 };
    \n+
    \n+
    330
    \n+
    331 template<std::size_t n>
    \n+
    \n+
    332 struct ParameterTree::Parser<std::bitset<n> > {
    \n+
    333 static std::bitset<n>
    \n+
    \n+
    334 parse(const std::string& str) {
    \n+
    335 std::bitset<n> val;
    \n+
    336 std::vector<std::string> sub = split(str);
    \n+
    337 if (sub.size() != n)
    \n+
    338 DUNE_THROW(RangeError, "as a bitset<" << n << "> "
    \n+
    339 << "because of unmatching size " << sub.size());
    \n+
    340 for (std::size_t i=0; i<n; ++i) {
    \n+
    341 val[i] = ParameterTree::Parser<bool>::parse(sub[i]);
    \n+
    342 }
    \n+
    343 return val;
    \n+
    344 }
    \n+
    \n+
    345 };
    \n+
    \n+
    346
    \n+
    347 template<typename T, typename A>
    \n+
    \n+
    348 struct ParameterTree::Parser<std::vector<T, A> > {
    \n+
    349 static std::vector<T, A>
    \n+
    \n+
    350 parse(const std::string& str) {
    \n+
    351 std::vector<std::string> sub = split(str);
    \n+
    352 std::vector<T, A> vec;
    \n+
    353 for (unsigned int i=0; i<sub.size(); ++i) {
    \n+
    354 T val = ParameterTree::Parser<T>::parse(sub[i]);
    \n+
    355 vec.push_back(val);
    \n+
    356 }
    \n+
    357 return vec;
    \n+
    358 }
    \n+
    \n+
    359 };
    \n+
    \n+
    360
    \n+
    361} // end namespace Dune
    \n+
    362
    \n+
    363#endif // DUNE_PARAMETERTREE_HH
    \n+
    A free function to provide the demangled class name of a given object or type as a string.
    \n+
    A few common exception classes.
    \n+
    Implements a vector constructed from a given type representing a field and a compile-time given size.
    \n+
    const char * what() const noexcept override
    output internal message buffer
    Definition exceptions.cc:37
    \n
    #define DUNE_THROW(E, m)
    Definition exceptions.hh:218
    \n+
    STL namespace.
    \n
    Dune namespace.
    Definition alignedallocator.hh:13
    \n-
    Default exception if a function was called while the object is not in a valid state for that function...
    Definition exceptions.hh:281
    \n-
    A factory class for parameterized objects.
    Definition parameterizedobject.hh:36
    \n-
    std::function< Type(Args...)> Creator
    Definition parameterizedobject.hh:53
    \n-
    static constexpr auto has_proper_signature(Dune::PriorityTag< 1 >) -> decltype(std::declval< F >()(std::declval< Args >()...), std::true_type())
    Definition parameterizedobject.hh:56
    \n-
    TypeT Type
    The type of objects created by the factory.
    Definition parameterizedobject.hh:49
    \n-
    void define(Key const &key, Impl &&t)
    Registers a new type with a key.
    Definition parameterizedobject.hh:145
    \n-
    KeyT Key
    The typ of the keys.
    Definition parameterizedobject.hh:46
    \n-
    Type create(Key const &key, Args ... args) const
    Creates an object identified by a key from given parameters.
    Definition parameterizedobject.hh:77
    \n-
    void define(Key const &key)
    Registers a new type with a key.
    Definition parameterizedobject.hh:101
    \n-
    void define(Key const &key, F &&f)
    Registers a new creator with a key.
    Definition parameterizedobject.hh:121
    \n-
    static constexpr std::false_type has_proper_signature(Dune::PriorityTag< 0 >)
    Definition parameterizedobject.hh:63
    \n-
    bool contains(Key const &key) const
    Definition parameterizedobject.hh:150
    \n-
    Helper class for tagging priorities.
    Definition typeutilities.hh:73
    \n+
    vector space out of a tensor product of fields.
    Definition fvector.hh:91
    \n+
    Iterator begin()
    begin iterator
    Definition densevector.hh:347
    \n+
    Iterator end()
    end iterator
    Definition densevector.hh:353
    \n+
    Default exception class for range errors.
    Definition exceptions.hh:254
    \n+
    Hierarchical structure of string parameters.
    Definition parametertree.hh:37
    \n+
    KeyVector valueKeys_
    Definition parametertree.hh:217
    \n+
    std::map< std::string, ParameterTree > subs_
    Definition parametertree.hh:221
    \n+
    static const ParameterTree empty_
    Definition parametertree.hh:213
    \n+
    static std::string rtrim(const std::string &s)
    Definition parametertree.cc:213
    \n+
    std::string get(const std::string &key, const std::string &defaultValue) const
    get value as string
    Definition parametertree.cc:188
    \n+
    static std::string ltrim(const std::string &s)
    Definition parametertree.cc:204
    \n+
    void report(std::ostream &stream=std::cout, const std::string &prefix="") const
    print distinct substructure to stream
    Definition parametertree.cc:32
    \n+
    std::vector< std::string > KeyVector
    storage for key lists
    Definition parametertree.hh:50
    \n+
    static void parseRange(const std::string &str, Iterator it, const Iterator &end)
    Definition parametertree.hh:229
    \n+
    ParameterTree()
    Create new empty ParameterTree.
    Definition parametertree.cc:20
    \n+
    std::string & operator[](const std::string &key)
    get value reference for key
    Definition parametertree.cc:153
    \n+
    KeyVector subKeys_
    Definition parametertree.hh:218
    \n+
    ParameterTree & sub(const std::string &sub)
    get substructure by name
    Definition parametertree.cc:106
    \n+
    bool hasKey(const std::string &key) const
    test for key
    Definition parametertree.cc:51
    \n+
    const KeyVector & getSubKeys() const
    get substructure keys
    Definition parametertree.cc:243
    \n+
    T get(const std::string &key) const
    Get value.
    Definition parametertree.hh:177
    \n+
    bool hasSub(const std::string &sub) const
    test for substructure
    Definition parametertree.cc:79
    \n+
    std::map< std::string, std::string > values_
    Definition parametertree.hh:220
    \n+
    T get(const std::string &key, const T &defaultValue) const
    get value converted to a certain type
    Definition parametertree.hh:161
    \n+
    std::string prefix_
    Definition parametertree.hh:215
    \n+
    static std::vector< std::string > split(const std::string &s)
    Definition parametertree.cc:222
    \n+
    const KeyVector & getValueKeys() const
    get value keys
    Definition parametertree.cc:238
    \n+
    static std::basic_string< char, traits, Allocator > parse(const std::string &str)
    Definition parametertree.hh:279
    \n+
    static bool parse(const std::string &str)
    Definition parametertree.hh:296
    \n+
    char operator()(char c)
    Definition parametertree.hh:289
    \n+
    static FieldVector< T, n > parse(const std::string &str)
    Definition parametertree.hh:314
    \n+
    static std::array< T, n > parse(const std::string &str)
    Definition parametertree.hh:324
    \n+
    static std::bitset< n > parse(const std::string &str)
    Definition parametertree.hh:334
    \n+
    static std::vector< T, A > parse(const std::string &str)
    Definition parametertree.hh:350
    \n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,200 +1,407 @@\n dune-common\u00a02.10\n Loading...\n Searching...\n No Matches\n * _\bd_\bu_\bn_\be\n * _\bc_\bo_\bm_\bm_\bo_\bn\n-parameterizedobject.hh\n+parametertree.hh\n _\bG_\bo_\b _\bt_\bo_\b _\bt_\bh_\be_\b _\bd_\bo_\bc_\bu_\bm_\be_\bn_\bt_\ba_\bt_\bi_\bo_\bn_\b _\bo_\bf_\b _\bt_\bh_\bi_\bs_\b _\bf_\bi_\bl_\be_\b.\n-1// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-\n-2// vi: set et ts=4 sw=4 sts=4:\n+1// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-\n+2// vi: set et ts=4 sw=2 sts=2:\n 3// SPDX-FileCopyrightInfo: Copyright \u00c2\u00a9 DUNE Project contributors, see file\n LICENSE.md in module root\n 4// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception\n-5#ifndef DUNE_COMMON_PARAMETERIZEDOBJECT_HH\n-6#define DUNE_COMMON_PARAMETERIZEDOBJECT_HH\n+5#ifndef DUNE_PARAMETERTREE_HH\n+6#define DUNE_PARAMETERTREE_HH\n 7\n-8#include \n-9#include \n-10#include \n-11\n-12#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\be_\bx_\bc_\be_\bp_\bt_\bi_\bo_\bn_\bs_\b._\bh_\bh>\n-13#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bt_\by_\bp_\be_\bu_\bt_\bi_\bl_\bi_\bt_\bi_\be_\bs_\b._\bh_\bh>\n-14\n-15namespace _\bD_\bu_\bn_\be {\n-16\n-34template\n-_\b3_\b6class _\bP_\ba_\br_\ba_\bm_\be_\bt_\be_\br_\bi_\bz_\be_\bd_\bO_\bb_\bj_\be_\bc_\bt_\bF_\ba_\bc_\bt_\bo_\br_\by;\n-37\n-38template\n-_\b4_\b1class _\bP_\ba_\br_\ba_\bm_\be_\bt_\be_\br_\bi_\bz_\be_\bd_\bO_\bb_\bj_\be_\bc_\bt_\bF_\ba_\bc_\bt_\bo_\br_\by\n-42{\n-43 public:\n-44\n-_\b4_\b6 typedef KeyT _\bK_\be_\by;\n+12#include \n+13#include \n+14#include \n+15#include \n+16#include \n+17#include \n+18#include \n+19#include \n+20#include \n+21#include \n+22#include \n+23#include \n+24#include \n+25#include \n+26\n+27#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\be_\bx_\bc_\be_\bp_\bt_\bi_\bo_\bn_\bs_\b._\bh_\bh>\n+28#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bf_\bv_\be_\bc_\bt_\bo_\br_\b._\bh_\bh>\n+29#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bc_\bl_\ba_\bs_\bs_\bn_\ba_\bm_\be_\b._\bh_\bh>\n+30\n+31namespace _\bD_\bu_\bn_\be {\n+32\n+_\b3_\b6 class _\bP_\ba_\br_\ba_\bm_\be_\bt_\be_\br_\bT_\br_\be_\be\n+37 {\n+38 // class providing a single static parse() function, used by the\n+39 // generic get() method\n+40 template\n+41 struct Parser;\n+42\n+43 struct EmptyTag {};\n+44 _\bP_\ba_\br_\ba_\bm_\be_\bt_\be_\br_\bT_\br_\be_\be(EmptyTag);\n+45\n+46 public:\n 47\n-_\b4_\b9 using _\bT_\by_\bp_\be = TypeT;\n-50\n-51 protected:\n-52\n-_\b5_\b3 using _\bC_\br_\be_\ba_\bt_\bo_\br = std::function<_\bT_\by_\bp_\be(Args...)>;\n-54\n-55 template\n-_\b5_\b6 static constexpr auto _\bh_\ba_\bs_\b__\bp_\br_\bo_\bp_\be_\br_\b__\bs_\bi_\bg_\bn_\ba_\bt_\bu_\br_\be(_\bD_\bu_\bn_\be_\b:_\b:_\bP_\br_\bi_\bo_\br_\bi_\bt_\by_\bT_\ba_\bg_\b<_\b1_\b>)\n-57 -> decltype( std::declval()(std::declval()...), std::true_type())\n-58 {\n-59 return {};\n-60 }\n-61\n-62 template\n-_\b6_\b3 static constexpr std::false_type _\bh_\ba_\bs_\b__\bp_\br_\bo_\bp_\be_\br_\b__\bs_\bi_\bg_\bn_\ba_\bt_\bu_\br_\be(_\bD_\bu_\bn_\be_\b:_\b:_\bP_\br_\bi_\bo_\br_\bi_\bt_\by_\bT_\ba_\bg_\b<_\b0_\b>)\n-64 {\n-65 return {};\n-66 }\n-67\n-68 public:\n-69\n-_\b7_\b7 _\bT_\by_\bp_\be _\bc_\br_\be_\ba_\bt_\be(_\bK_\be_\by const& key, Args ... args) const {\n-78 typename Registry::const_iterator i = registry_.find(key);\n-79 if (i == registry_.end()) {\n-80 _\bD_\bU_\bN_\bE_\b__\bT_\bH_\bR_\bO_\bW(_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bv_\ba_\bl_\bi_\bd_\bS_\bt_\ba_\bt_\be_\bE_\bx_\bc_\be_\bp_\bt_\bi_\bo_\bn,\n-81 \"ParametrizedObjectFactory: key ``\" <<\n-82 key << \"'' not registered\");\n-83 }\n-84 else return i->second(args...);\n-85 }\n+_\b5_\b0 typedef std::vector _\bK_\be_\by_\bV_\be_\bc_\bt_\bo_\br;\n+51\n+54 _\bP_\ba_\br_\ba_\bm_\be_\bt_\be_\br_\bT_\br_\be_\be();\n+55\n+56\n+64 bool _\bh_\ba_\bs_\bK_\be_\by(const std::string& key) const;\n+65\n+66\n+74 bool _\bh_\ba_\bs_\bS_\bu_\bb(const std::string& _\bs_\bu_\bb) const;\n+75\n+76\n+85 std::string& _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b[_\b]_\b (const std::string& key);\n 86\n-100 template\n-_\b1_\b0_\b1 void _\bd_\be_\bf_\bi_\bn_\be(_\bK_\be_\by const& key)\n-102 {\n-103 registry_[key] = DefaultCreator();\n-104 }\n-105\n-119 template(_\bP_\br_\bi_\bo_\br_\bi_\bt_\by_\bT_\ba_\bg_\b<_\b4_\b2_\b>()), int>::\n-type = 0>\n-_\b1_\b2_\b1 void _\bd_\be_\bf_\bi_\bn_\be(_\bK_\be_\by const& key, F&& f)\n-122 {\n-123 registry_[key] = f;\n-124 }\n-125\n-140 template::value\n-143 and not std::is_convertible::value,\n-144 int>::type = 0>\n-_\b1_\b4_\b5 void _\bd_\be_\bf_\bi_\bn_\be(_\bK_\be_\by const& key, Impl&& t)\n-146 {\n-147 registry_[key] = [=](Args...) { return t;};\n-148 }\n+87\n+97 const std::string& _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b[_\b]_\b (const std::string& key) const;\n+98\n+99\n+107 void _\br_\be_\bp_\bo_\br_\bt(std::ostream& stream = std::cout,\n+108 const std::string& prefix = \"\") const;\n+109\n+110\n+116 _\bP_\ba_\br_\ba_\bm_\be_\bt_\be_\br_\bT_\br_\be_\be& _\bs_\bu_\bb(const std::string& _\bs_\bu_\bb);\n+117\n+118\n+125 const _\bP_\ba_\br_\ba_\bm_\be_\bt_\be_\br_\bT_\br_\be_\be& _\bs_\bu_\bb(const std::string& _\bs_\bu_\bb, bool fail_if_missing =\n+false) const;\n+126\n+127\n+136 std::string _\bg_\be_\bt(const std::string& key, const std::string& defaultValue)\n+const;\n+137\n+148 std::string _\bg_\be_\bt(const std::string& key, const char* defaultValue) const;\n 149\n-_\b1_\b5_\b0 bool _\bc_\bo_\bn_\bt_\ba_\bi_\bn_\bs(_\bK_\be_\by const& key) const\n-151 {\n-152 return registry_.count(key);\n-153 }\n-154\n-155 private:\n-156\n-157 template\n-158 struct Tag{};\n-159\n-160 template\n-161 struct DefaultCreator\n-162 {\n-163 template\n-164 Type operator()(T&&... args) const\n-165 {\n-166 return DefaultCreator::create(Tag(), PriorityTag<42>(), std::\n-forward(args)...);\n-167 }\n-168\n-169 template\n-170 static Type create(Tag, PriorityTag<1>, T&& ... args) {\n-171 return Impl(std::forward(args)...);\n-172 }\n-173\n-174 template\n-175 static Type create(Tag>, PriorityTag<2>, T&& ...\n-args) {\n-176 return std::make_unique(std::forward(args)...);\n-177 }\n-178\n-179 template\n-180 static Type create(Tag>, PriorityTag<3>, T&& ...\n-args) {\n-181 return std::make_shared(std::forward(args)...);\n-182 }\n-183\n-184 };\n-185\n-186 typedef std::map Registry;\n-187 Registry registry_;\n-188};\n-189\n-190\n+150\n+160 template\n+_\b1_\b6_\b1 T _\bg_\be_\bt(const std::string& key, const T& defaultValue) const {\n+162 if(_\bh_\ba_\bs_\bK_\be_\by(key))\n+163 return get(key);\n+164 else\n+165 return defaultValue;\n+166 }\n+167\n+176 template \n+_\b1_\b7_\b7 T _\bg_\be_\bt(const std::string& key) const {\n+178 if(not _\bh_\ba_\bs_\bK_\be_\by(key))\n+179 _\bD_\bU_\bN_\bE_\b__\bT_\bH_\bR_\bO_\bW(_\bD_\bu_\bn_\be_\b:_\b:_\bR_\ba_\bn_\bg_\be_\bE_\br_\br_\bo_\br, \"Key '\" << key\n+180 << \"' not found in ParameterTree (prefix \" + _\bp_\br_\be_\bf_\bi_\bx_\b_ + \")\");\n+181 try {\n+182 return Parser::parse((*this)[key]);\n+183 }\n+184 catch(const _\bR_\ba_\bn_\bg_\be_\bE_\br_\br_\bo_\br& e) {\n+185 // rethrow the error and add more information\n+186 _\bD_\bU_\bN_\bE_\b__\bT_\bH_\bR_\bO_\bW(_\bR_\ba_\bn_\bg_\be_\bE_\br_\br_\bo_\br, \"Cannot parse value \\\"\" << (*this)[key]\n+187 << \"\\\" for key \\\"\" << _\bp_\br_\be_\bf_\bi_\bx_\b_ << \".\" << key << \"\\\"\"\n+188 << e._\bw_\bh_\ba_\bt());\n+189 }\n+190 }\n 191\n-192} // end namespace Dune\n-193\n-194#endif // DUNE_COMMON_PARAMETERIZEDOBJECT_HH\n+199 const _\bK_\be_\by_\bV_\be_\bc_\bt_\bo_\br& _\bg_\be_\bt_\bV_\ba_\bl_\bu_\be_\bK_\be_\by_\bs() const;\n+200\n+201\n+209 const _\bK_\be_\by_\bV_\be_\bc_\bt_\bo_\br& _\bg_\be_\bt_\bS_\bu_\bb_\bK_\be_\by_\bs() const;\n+210\n+211 protected:\n+212\n+_\b2_\b1_\b3 static const _\bP_\ba_\br_\ba_\bm_\be_\bt_\be_\br_\bT_\br_\be_\be _\be_\bm_\bp_\bt_\by_\b_;\n+214\n+_\b2_\b1_\b5 std::string _\bp_\br_\be_\bf_\bi_\bx_\b_;\n+216\n+_\b2_\b1_\b7 _\bK_\be_\by_\bV_\be_\bc_\bt_\bo_\br _\bv_\ba_\bl_\bu_\be_\bK_\be_\by_\bs_\b_;\n+_\b2_\b1_\b8 _\bK_\be_\by_\bV_\be_\bc_\bt_\bo_\br _\bs_\bu_\bb_\bK_\be_\by_\bs_\b_;\n+219\n+_\b2_\b2_\b0 std::map _\bv_\ba_\bl_\bu_\be_\bs_\b_;\n+_\b2_\b2_\b1 std::map _\bs_\bu_\bb_\bs_\b_;\n+222\n+223 static std::string _\bl_\bt_\br_\bi_\bm(const std::string& s);\n+224 static std::string _\br_\bt_\br_\bi_\bm(const std::string& s);\n+225 static std::vector _\bs_\bp_\bl_\bi_\bt(const std::string & s);\n+226\n+227 // parse into a fixed-size range of iterators\n+228 template\n+_\b2_\b2_\b9 static void _\bp_\ba_\br_\bs_\be_\bR_\ba_\bn_\bg_\be(const std::string &str,\n+230 Iterator it, const Iterator &end)\n+231 {\n+232 typedef typename std::iterator_traits::value_type Value;\n+233 std::istringstream s(str);\n+234 // make sure we are in locale \"C\"\n+235 s.imbue(std::locale::classic());\n+236 std::size_t n = 0;\n+237 for(; it != end; ++it, ++n) {\n+238 s >> *it;\n+239 if(!s)\n+240 _\bD_\bU_\bN_\bE_\b__\bT_\bH_\bR_\bO_\bW(_\bR_\ba_\bn_\bg_\be_\bE_\br_\br_\bo_\br, \"as a range of items of type \"\n+241 << className()\n+242 << \" (\" << n << \" items were extracted successfully)\");\n+243 }\n+244 Value dummy;\n+245 s >> dummy;\n+246 // now extraction should have failed, and eof should be set\n+247 if(not s.fail() or not s.eof())\n+248 _\bD_\bU_\bN_\bE_\b__\bT_\bH_\bR_\bO_\bW(_\bR_\ba_\bn_\bg_\be_\bE_\br_\br_\bo_\br, \"as a range of \"\n+249 << n << \" items of type \"\n+250 << className() << \" (more items than the range can hold)\");\n+251 }\n+252 };\n+253\n+254 template\n+255 struct ParameterTree::Parser {\n+256 static T parse(const std::string& str) {\n+257 T val;\n+258 std::istringstream s(str);\n+259 // make sure we are in locale \"C\"\n+260 s.imbue(std::locale::classic());\n+261 s >> val;\n+262 if(!s)\n+263 _\bD_\bU_\bN_\bE_\b__\bT_\bH_\bR_\bO_\bW(RangeError, \" as a \" << className());\n+264 char dummy;\n+265 s >> dummy;\n+266 // now extraction should have failed, and eof should be set\n+267 if ((! s.fail()) || (! s.eof()))\n+268 _\bD_\bU_\bN_\bE_\b__\bT_\bH_\bR_\bO_\bW(RangeError, \" as a \" << className());\n+269 return val;\n+270 }\n+271 };\n+272\n+273 // \"How do I convert a string into a wstring in C++?\" \"Why, that very\n+simple\n+274 // son. You just need a these hundred lines of code.\"\n+275 // Instead I'm going to restrict myself to string with charT=char here.\n+276 template\n+_\b2_\b7_\b7 struct ParameterTree::Parser<_\bs_\bt_\bd::basic_string > {\n+278 static std::basic_string\n+_\b2_\b7_\b9 _\bp_\ba_\br_\bs_\be(const std::string& str) {\n+280 std::string trimmed = _\bl_\bt_\br_\bi_\bm(_\br_\bt_\br_\bi_\bm(str));\n+281 return std::basic_string(trimmed.begin(),\n+282 trimmed.end());\n+283 }\n+284 };\n+285\n+286 template<>\n+_\b2_\b8_\b7 struct ParameterTree::Parser< bool > {\n+_\b2_\b8_\b8 struct ToLower {\n+_\b2_\b8_\b9 char _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b(_\b)(char c)\n+290 {\n+291 return std::tolower(c, std::locale::classic());\n+292 }\n+293 };\n+294\n+295 static bool\n+_\b2_\b9_\b6 _\bp_\ba_\br_\bs_\be(const std::string& str) {\n+297 std::string ret = str;\n+298\n+299 std::transform(ret.begin(), ret.end(), ret.begin(), ToLower());\n+300\n+301 if (ret == \"yes\" || ret == \"true\")\n+302 return true;\n+303\n+304 if (ret == \"no\" || ret == \"false\")\n+305 return false;\n+306\n+307 return (Parser::parse(ret) != 0);\n+308 }\n+309 };\n+310\n+311 template\n+_\b3_\b1_\b2 struct ParameterTree::Parser<_\bF_\bi_\be_\bl_\bd_\bV_\be_\bc_\bt_\bo_\br > {\n+313 static _\bF_\bi_\be_\bl_\bd_\bV_\be_\bc_\bt_\bo_\br_\b<_\bT_\b,_\b _\bn_\b>\n+_\b3_\b1_\b4 _\bp_\ba_\br_\bs_\be(const std::string& str) {\n+315 _\bF_\bi_\be_\bl_\bd_\bV_\be_\bc_\bt_\bo_\br_\b<_\bT_\b,_\b _\bn_\b> val;\n+316 _\bp_\ba_\br_\bs_\be_\bR_\ba_\bn_\bg_\be(str, val._\bb_\be_\bg_\bi_\bn(), val._\be_\bn_\bd());\n+317 return val;\n+318 }\n+319 };\n+320\n+321 template\n+_\b3_\b2_\b2 struct ParameterTree::Parser<_\bs_\bt_\bd::array > {\n+323 static std::array\n+_\b3_\b2_\b4 _\bp_\ba_\br_\bs_\be(const std::string& str) {\n+325 std::array val;\n+326 _\bp_\ba_\br_\bs_\be_\bR_\ba_\bn_\bg_\be(str, val.begin(), val.end());\n+327 return val;\n+328 }\n+329 };\n+330\n+331 template\n+_\b3_\b3_\b2 struct ParameterTree::Parser<_\bs_\bt_\bd::bitset > {\n+333 static std::bitset\n+_\b3_\b3_\b4 _\bp_\ba_\br_\bs_\be(const std::string& str) {\n+335 std::bitset val;\n+336 std::vector _\bs_\bu_\bb = _\bs_\bp_\bl_\bi_\bt(str);\n+337 if (_\bs_\bu_\bb.size() != n)\n+338 _\bD_\bU_\bN_\bE_\b__\bT_\bH_\bR_\bO_\bW(_\bR_\ba_\bn_\bg_\be_\bE_\br_\br_\bo_\br, \"as a bitset<\" << n << \"> \"\n+339 << \"because of unmatching size \" << _\bs_\bu_\bb.size());\n+340 for (std::size_t i=0; i::parse(_\bs_\bu_\bb[i]);\n+342 }\n+343 return val;\n+344 }\n+345 };\n+346\n+347 template\n+_\b3_\b4_\b8 struct ParameterTree::Parser<_\bs_\bt_\bd::vector > {\n+349 static std::vector\n+_\b3_\b5_\b0 _\bp_\ba_\br_\bs_\be(const std::string& str) {\n+351 std::vector _\bs_\bu_\bb = _\bs_\bp_\bl_\bi_\bt(str);\n+352 std::vector vec;\n+353 for (unsigned int i=0; i<_\bs_\bu_\bb.size(); ++i) {\n+354 T val = ParameterTree::Parser::parse(_\bs_\bu_\bb[i]);\n+355 vec.push_back(val);\n+356 }\n+357 return vec;\n+358 }\n+359 };\n+360\n+361} // end namespace Dune\n+362\n+363#endif // DUNE_PARAMETERTREE_HH\n+_\bc_\bl_\ba_\bs_\bs_\bn_\ba_\bm_\be_\b._\bh_\bh\n+A free function to provide the demangled class name of a given object or type\n+as a string.\n _\be_\bx_\bc_\be_\bp_\bt_\bi_\bo_\bn_\bs_\b._\bh_\bh\n A few common exception classes.\n-_\bt_\by_\bp_\be_\bu_\bt_\bi_\bl_\bi_\bt_\bi_\be_\bs_\b._\bh_\bh\n-Utilities for type computations, constraining overloads, ...\n+_\bf_\bv_\be_\bc_\bt_\bo_\br_\b._\bh_\bh\n+Implements a vector constructed from a given type representing a field and a\n+compile-time given size.\n+_\bD_\bu_\bn_\be_\b:_\b:_\bE_\bx_\bc_\be_\bp_\bt_\bi_\bo_\bn_\b:_\b:_\bw_\bh_\ba_\bt\n+const char * what() const noexcept override\n+output internal message buffer\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn exceptions.cc:37\n _\bD_\bU_\bN_\bE_\b__\bT_\bH_\bR_\bO_\bW\n #define DUNE_THROW(E, m)\n D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn exceptions.hh:218\n+_\bs_\bt_\bd\n+STL namespace.\n _\bD_\bu_\bn_\be\n Dune namespace.\n D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn alignedallocator.hh:13\n-_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bv_\ba_\bl_\bi_\bd_\bS_\bt_\ba_\bt_\be_\bE_\bx_\bc_\be_\bp_\bt_\bi_\bo_\bn\n-Default exception if a function was called while the object is not in a valid\n-state for that function...\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn exceptions.hh:281\n-_\bD_\bu_\bn_\be_\b:_\b:_\bP_\ba_\br_\ba_\bm_\be_\bt_\be_\br_\bi_\bz_\be_\bd_\bO_\bb_\bj_\be_\bc_\bt_\bF_\ba_\bc_\bt_\bo_\br_\by\n-A factory class for parameterized objects.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn parameterizedobject.hh:36\n-_\bD_\bu_\bn_\be_\b:_\b:_\bP_\ba_\br_\ba_\bm_\be_\bt_\be_\br_\bi_\bz_\be_\bd_\bO_\bb_\bj_\be_\bc_\bt_\bF_\ba_\bc_\bt_\bo_\br_\by_\b<_\b _\bT_\by_\bp_\be_\bT_\b(_\bA_\br_\bg_\bs_\b._\b._\b._\b)_\b,_\b _\bK_\be_\by_\bT_\b _\b>_\b:_\b:_\bC_\br_\be_\ba_\bt_\bo_\br\n-std::function< Type(Args...)> Creator\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn parameterizedobject.hh:53\n-_\bD_\bu_\bn_\be_\b:_\b:_\bP_\ba_\br_\ba_\bm_\be_\bt_\be_\br_\bi_\bz_\be_\bd_\bO_\bb_\bj_\be_\bc_\bt_\bF_\ba_\bc_\bt_\bo_\br_\by_\b<_\b _\bT_\by_\bp_\be_\bT_\b(_\bA_\br_\bg_\bs_\b._\b._\b._\b)_\b,_\b _\bK_\be_\by_\bT_\b _\b>_\b:_\b:_\bh_\ba_\bs_\b__\bp_\br_\bo_\bp_\be_\br_\b__\bs_\bi_\bg_\bn_\ba_\bt_\bu_\br_\be\n-static constexpr auto has_proper_signature(Dune::PriorityTag< 1 >) -> decltype\n-(std::declval< F >()(std::declval< Args >()...), std::true_type())\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn parameterizedobject.hh:56\n-_\bD_\bu_\bn_\be_\b:_\b:_\bP_\ba_\br_\ba_\bm_\be_\bt_\be_\br_\bi_\bz_\be_\bd_\bO_\bb_\bj_\be_\bc_\bt_\bF_\ba_\bc_\bt_\bo_\br_\by_\b<_\b _\bT_\by_\bp_\be_\bT_\b(_\bA_\br_\bg_\bs_\b._\b._\b._\b)_\b,_\b _\bK_\be_\by_\bT_\b _\b>_\b:_\b:_\bT_\by_\bp_\be\n-TypeT Type\n-The type of objects created by the factory.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn parameterizedobject.hh:49\n-_\bD_\bu_\bn_\be_\b:_\b:_\bP_\ba_\br_\ba_\bm_\be_\bt_\be_\br_\bi_\bz_\be_\bd_\bO_\bb_\bj_\be_\bc_\bt_\bF_\ba_\bc_\bt_\bo_\br_\by_\b<_\b _\bT_\by_\bp_\be_\bT_\b(_\bA_\br_\bg_\bs_\b._\b._\b._\b)_\b,_\b _\bK_\be_\by_\bT_\b _\b>_\b:_\b:_\bd_\be_\bf_\bi_\bn_\be\n-void define(Key const &key, Impl &&t)\n-Registers a new type with a key.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn parameterizedobject.hh:145\n-_\bD_\bu_\bn_\be_\b:_\b:_\bP_\ba_\br_\ba_\bm_\be_\bt_\be_\br_\bi_\bz_\be_\bd_\bO_\bb_\bj_\be_\bc_\bt_\bF_\ba_\bc_\bt_\bo_\br_\by_\b<_\b _\bT_\by_\bp_\be_\bT_\b(_\bA_\br_\bg_\bs_\b._\b._\b._\b)_\b,_\b _\bK_\be_\by_\bT_\b _\b>_\b:_\b:_\bK_\be_\by\n-KeyT Key\n-The typ of the keys.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn parameterizedobject.hh:46\n-_\bD_\bu_\bn_\be_\b:_\b:_\bP_\ba_\br_\ba_\bm_\be_\bt_\be_\br_\bi_\bz_\be_\bd_\bO_\bb_\bj_\be_\bc_\bt_\bF_\ba_\bc_\bt_\bo_\br_\by_\b<_\b _\bT_\by_\bp_\be_\bT_\b(_\bA_\br_\bg_\bs_\b._\b._\b._\b)_\b,_\b _\bK_\be_\by_\bT_\b _\b>_\b:_\b:_\bc_\br_\be_\ba_\bt_\be\n-Type create(Key const &key, Args ... args) const\n-Creates an object identified by a key from given parameters.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn parameterizedobject.hh:77\n-_\bD_\bu_\bn_\be_\b:_\b:_\bP_\ba_\br_\ba_\bm_\be_\bt_\be_\br_\bi_\bz_\be_\bd_\bO_\bb_\bj_\be_\bc_\bt_\bF_\ba_\bc_\bt_\bo_\br_\by_\b<_\b _\bT_\by_\bp_\be_\bT_\b(_\bA_\br_\bg_\bs_\b._\b._\b._\b)_\b,_\b _\bK_\be_\by_\bT_\b _\b>_\b:_\b:_\bd_\be_\bf_\bi_\bn_\be\n-void define(Key const &key)\n-Registers a new type with a key.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn parameterizedobject.hh:101\n-_\bD_\bu_\bn_\be_\b:_\b:_\bP_\ba_\br_\ba_\bm_\be_\bt_\be_\br_\bi_\bz_\be_\bd_\bO_\bb_\bj_\be_\bc_\bt_\bF_\ba_\bc_\bt_\bo_\br_\by_\b<_\b _\bT_\by_\bp_\be_\bT_\b(_\bA_\br_\bg_\bs_\b._\b._\b._\b)_\b,_\b _\bK_\be_\by_\bT_\b _\b>_\b:_\b:_\bd_\be_\bf_\bi_\bn_\be\n-void define(Key const &key, F &&f)\n-Registers a new creator with a key.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn parameterizedobject.hh:121\n-_\bD_\bu_\bn_\be_\b:_\b:_\bP_\ba_\br_\ba_\bm_\be_\bt_\be_\br_\bi_\bz_\be_\bd_\bO_\bb_\bj_\be_\bc_\bt_\bF_\ba_\bc_\bt_\bo_\br_\by_\b<_\b _\bT_\by_\bp_\be_\bT_\b(_\bA_\br_\bg_\bs_\b._\b._\b._\b)_\b,_\b _\bK_\be_\by_\bT_\b _\b>_\b:_\b:_\bh_\ba_\bs_\b__\bp_\br_\bo_\bp_\be_\br_\b__\bs_\bi_\bg_\bn_\ba_\bt_\bu_\br_\be\n-static constexpr std::false_type has_proper_signature(Dune::PriorityTag< 0 >)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn parameterizedobject.hh:63\n-_\bD_\bu_\bn_\be_\b:_\b:_\bP_\ba_\br_\ba_\bm_\be_\bt_\be_\br_\bi_\bz_\be_\bd_\bO_\bb_\bj_\be_\bc_\bt_\bF_\ba_\bc_\bt_\bo_\br_\by_\b<_\b _\bT_\by_\bp_\be_\bT_\b(_\bA_\br_\bg_\bs_\b._\b._\b._\b)_\b,_\b _\bK_\be_\by_\bT_\b _\b>_\b:_\b:_\bc_\bo_\bn_\bt_\ba_\bi_\bn_\bs\n-bool contains(Key const &key) const\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn parameterizedobject.hh:150\n-_\bD_\bu_\bn_\be_\b:_\b:_\bP_\br_\bi_\bo_\br_\bi_\bt_\by_\bT_\ba_\bg\n-Helper class for tagging priorities.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn typeutilities.hh:73\n+_\bD_\bu_\bn_\be_\b:_\b:_\bF_\bi_\be_\bl_\bd_\bV_\be_\bc_\bt_\bo_\br\n+vector space out of a tensor product of fields.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn fvector.hh:91\n+_\bD_\bu_\bn_\be_\b:_\b:_\bD_\be_\bn_\bs_\be_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\bb_\be_\bg_\bi_\bn\n+Iterator begin()\n+begin iterator\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn densevector.hh:347\n+_\bD_\bu_\bn_\be_\b:_\b:_\bD_\be_\bn_\bs_\be_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\be_\bn_\bd\n+Iterator end()\n+end iterator\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn densevector.hh:353\n+_\bD_\bu_\bn_\be_\b:_\b:_\bR_\ba_\bn_\bg_\be_\bE_\br_\br_\bo_\br\n+Default exception class for range errors.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn exceptions.hh:254\n+_\bD_\bu_\bn_\be_\b:_\b:_\bP_\ba_\br_\ba_\bm_\be_\bt_\be_\br_\bT_\br_\be_\be\n+Hierarchical structure of string parameters.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn parametertree.hh:37\n+_\bD_\bu_\bn_\be_\b:_\b:_\bP_\ba_\br_\ba_\bm_\be_\bt_\be_\br_\bT_\br_\be_\be_\b:_\b:_\bv_\ba_\bl_\bu_\be_\bK_\be_\by_\bs_\b_\n+KeyVector valueKeys_\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn parametertree.hh:217\n+_\bD_\bu_\bn_\be_\b:_\b:_\bP_\ba_\br_\ba_\bm_\be_\bt_\be_\br_\bT_\br_\be_\be_\b:_\b:_\bs_\bu_\bb_\bs_\b_\n+std::map< std::string, ParameterTree > subs_\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn parametertree.hh:221\n+_\bD_\bu_\bn_\be_\b:_\b:_\bP_\ba_\br_\ba_\bm_\be_\bt_\be_\br_\bT_\br_\be_\be_\b:_\b:_\be_\bm_\bp_\bt_\by_\b_\n+static const ParameterTree empty_\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn parametertree.hh:213\n+_\bD_\bu_\bn_\be_\b:_\b:_\bP_\ba_\br_\ba_\bm_\be_\bt_\be_\br_\bT_\br_\be_\be_\b:_\b:_\br_\bt_\br_\bi_\bm\n+static std::string rtrim(const std::string &s)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn parametertree.cc:213\n+_\bD_\bu_\bn_\be_\b:_\b:_\bP_\ba_\br_\ba_\bm_\be_\bt_\be_\br_\bT_\br_\be_\be_\b:_\b:_\bg_\be_\bt\n+std::string get(const std::string &key, const std::string &defaultValue) const\n+get value as string\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn parametertree.cc:188\n+_\bD_\bu_\bn_\be_\b:_\b:_\bP_\ba_\br_\ba_\bm_\be_\bt_\be_\br_\bT_\br_\be_\be_\b:_\b:_\bl_\bt_\br_\bi_\bm\n+static std::string ltrim(const std::string &s)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn parametertree.cc:204\n+_\bD_\bu_\bn_\be_\b:_\b:_\bP_\ba_\br_\ba_\bm_\be_\bt_\be_\br_\bT_\br_\be_\be_\b:_\b:_\br_\be_\bp_\bo_\br_\bt\n+void report(std::ostream &stream=std::cout, const std::string &prefix=\"\") const\n+print distinct substructure to stream\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn parametertree.cc:32\n+_\bD_\bu_\bn_\be_\b:_\b:_\bP_\ba_\br_\ba_\bm_\be_\bt_\be_\br_\bT_\br_\be_\be_\b:_\b:_\bK_\be_\by_\bV_\be_\bc_\bt_\bo_\br\n+std::vector< std::string > KeyVector\n+storage for key lists\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn parametertree.hh:50\n+_\bD_\bu_\bn_\be_\b:_\b:_\bP_\ba_\br_\ba_\bm_\be_\bt_\be_\br_\bT_\br_\be_\be_\b:_\b:_\bp_\ba_\br_\bs_\be_\bR_\ba_\bn_\bg_\be\n+static void parseRange(const std::string &str, Iterator it, const Iterator\n+&end)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn parametertree.hh:229\n+_\bD_\bu_\bn_\be_\b:_\b:_\bP_\ba_\br_\ba_\bm_\be_\bt_\be_\br_\bT_\br_\be_\be_\b:_\b:_\bP_\ba_\br_\ba_\bm_\be_\bt_\be_\br_\bT_\br_\be_\be\n+ParameterTree()\n+Create new empty ParameterTree.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn parametertree.cc:20\n+_\bD_\bu_\bn_\be_\b:_\b:_\bP_\ba_\br_\ba_\bm_\be_\bt_\be_\br_\bT_\br_\be_\be_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b[_\b]\n+std::string & operator[](const std::string &key)\n+get value reference for key\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn parametertree.cc:153\n+_\bD_\bu_\bn_\be_\b:_\b:_\bP_\ba_\br_\ba_\bm_\be_\bt_\be_\br_\bT_\br_\be_\be_\b:_\b:_\bs_\bu_\bb_\bK_\be_\by_\bs_\b_\n+KeyVector subKeys_\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn parametertree.hh:218\n+_\bD_\bu_\bn_\be_\b:_\b:_\bP_\ba_\br_\ba_\bm_\be_\bt_\be_\br_\bT_\br_\be_\be_\b:_\b:_\bs_\bu_\bb\n+ParameterTree & sub(const std::string &sub)\n+get substructure by name\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn parametertree.cc:106\n+_\bD_\bu_\bn_\be_\b:_\b:_\bP_\ba_\br_\ba_\bm_\be_\bt_\be_\br_\bT_\br_\be_\be_\b:_\b:_\bh_\ba_\bs_\bK_\be_\by\n+bool hasKey(const std::string &key) const\n+test for key\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn parametertree.cc:51\n+_\bD_\bu_\bn_\be_\b:_\b:_\bP_\ba_\br_\ba_\bm_\be_\bt_\be_\br_\bT_\br_\be_\be_\b:_\b:_\bg_\be_\bt_\bS_\bu_\bb_\bK_\be_\by_\bs\n+const KeyVector & getSubKeys() const\n+get substructure keys\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn parametertree.cc:243\n+_\bD_\bu_\bn_\be_\b:_\b:_\bP_\ba_\br_\ba_\bm_\be_\bt_\be_\br_\bT_\br_\be_\be_\b:_\b:_\bg_\be_\bt\n+T get(const std::string &key) const\n+Get value.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn parametertree.hh:177\n+_\bD_\bu_\bn_\be_\b:_\b:_\bP_\ba_\br_\ba_\bm_\be_\bt_\be_\br_\bT_\br_\be_\be_\b:_\b:_\bh_\ba_\bs_\bS_\bu_\bb\n+bool hasSub(const std::string &sub) const\n+test for substructure\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn parametertree.cc:79\n+_\bD_\bu_\bn_\be_\b:_\b:_\bP_\ba_\br_\ba_\bm_\be_\bt_\be_\br_\bT_\br_\be_\be_\b:_\b:_\bv_\ba_\bl_\bu_\be_\bs_\b_\n+std::map< std::string, std::string > values_\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn parametertree.hh:220\n+_\bD_\bu_\bn_\be_\b:_\b:_\bP_\ba_\br_\ba_\bm_\be_\bt_\be_\br_\bT_\br_\be_\be_\b:_\b:_\bg_\be_\bt\n+T get(const std::string &key, const T &defaultValue) const\n+get value converted to a certain type\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn parametertree.hh:161\n+_\bD_\bu_\bn_\be_\b:_\b:_\bP_\ba_\br_\ba_\bm_\be_\bt_\be_\br_\bT_\br_\be_\be_\b:_\b:_\bp_\br_\be_\bf_\bi_\bx_\b_\n+std::string prefix_\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn parametertree.hh:215\n+_\bD_\bu_\bn_\be_\b:_\b:_\bP_\ba_\br_\ba_\bm_\be_\bt_\be_\br_\bT_\br_\be_\be_\b:_\b:_\bs_\bp_\bl_\bi_\bt\n+static std::vector< std::string > split(const std::string &s)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn parametertree.cc:222\n+_\bD_\bu_\bn_\be_\b:_\b:_\bP_\ba_\br_\ba_\bm_\be_\bt_\be_\br_\bT_\br_\be_\be_\b:_\b:_\bg_\be_\bt_\bV_\ba_\bl_\bu_\be_\bK_\be_\by_\bs\n+const KeyVector & getValueKeys() const\n+get value keys\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn parametertree.cc:238\n+_\bD_\bu_\bn_\be_\b:_\b:_\bP_\ba_\br_\ba_\bm_\be_\bt_\be_\br_\bT_\br_\be_\be_\b:_\b:_\bP_\ba_\br_\bs_\be_\br_\b<_\b _\bs_\bt_\bd_\b:_\b:_\bb_\ba_\bs_\bi_\bc_\b__\bs_\bt_\br_\bi_\bn_\bg_\b<_\b _\bc_\bh_\ba_\br_\b,_\b _\bt_\br_\ba_\bi_\bt_\bs_\b,_\b _\bA_\bl_\bl_\bo_\bc_\ba_\bt_\bo_\br_\b _\b>_\b _\b>_\b:_\b:\n+_\bp_\ba_\br_\bs_\be\n+static std::basic_string< char, traits, Allocator > parse(const std::string\n+&str)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn parametertree.hh:279\n+_\bD_\bu_\bn_\be_\b:_\b:_\bP_\ba_\br_\ba_\bm_\be_\bt_\be_\br_\bT_\br_\be_\be_\b:_\b:_\bP_\ba_\br_\bs_\be_\br_\b<_\b _\bb_\bo_\bo_\bl_\b _\b>_\b:_\b:_\bp_\ba_\br_\bs_\be\n+static bool parse(const std::string &str)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn parametertree.hh:296\n+_\bD_\bu_\bn_\be_\b:_\b:_\bP_\ba_\br_\ba_\bm_\be_\bt_\be_\br_\bT_\br_\be_\be_\b:_\b:_\bP_\ba_\br_\bs_\be_\br_\b<_\b _\bb_\bo_\bo_\bl_\b _\b>_\b:_\b:_\bT_\bo_\bL_\bo_\bw_\be_\br_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b(_\b)\n+char operator()(char c)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn parametertree.hh:289\n+_\bD_\bu_\bn_\be_\b:_\b:_\bP_\ba_\br_\ba_\bm_\be_\bt_\be_\br_\bT_\br_\be_\be_\b:_\b:_\bP_\ba_\br_\bs_\be_\br_\b<_\b _\bF_\bi_\be_\bl_\bd_\bV_\be_\bc_\bt_\bo_\br_\b<_\b _\bT_\b,_\b _\bn_\b _\b>_\b _\b>_\b:_\b:_\bp_\ba_\br_\bs_\be\n+static FieldVector< T, n > parse(const std::string &str)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn parametertree.hh:314\n+_\bD_\bu_\bn_\be_\b:_\b:_\bP_\ba_\br_\ba_\bm_\be_\bt_\be_\br_\bT_\br_\be_\be_\b:_\b:_\bP_\ba_\br_\bs_\be_\br_\b<_\b _\bs_\bt_\bd_\b:_\b:_\ba_\br_\br_\ba_\by_\b<_\b _\bT_\b,_\b _\bn_\b _\b>_\b _\b>_\b:_\b:_\bp_\ba_\br_\bs_\be\n+static std::array< T, n > parse(const std::string &str)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn parametertree.hh:324\n+_\bD_\bu_\bn_\be_\b:_\b:_\bP_\ba_\br_\ba_\bm_\be_\bt_\be_\br_\bT_\br_\be_\be_\b:_\b:_\bP_\ba_\br_\bs_\be_\br_\b<_\b _\bs_\bt_\bd_\b:_\b:_\bb_\bi_\bt_\bs_\be_\bt_\b<_\b _\bn_\b _\b>_\b _\b>_\b:_\b:_\bp_\ba_\br_\bs_\be\n+static std::bitset< n > parse(const std::string &str)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn parametertree.hh:334\n+_\bD_\bu_\bn_\be_\b:_\b:_\bP_\ba_\br_\ba_\bm_\be_\bt_\be_\br_\bT_\br_\be_\be_\b:_\b:_\bP_\ba_\br_\bs_\be_\br_\b<_\b _\bs_\bt_\bd_\b:_\b:_\bv_\be_\bc_\bt_\bo_\br_\b<_\b _\bT_\b,_\b _\bA_\b _\b>_\b _\b>_\b:_\b:_\bp_\ba_\br_\bs_\be\n+static std::vector< T, A > parse(const std::string &str)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn parametertree.hh:350\n ===============================================================================\n Generated by\u00a0_\b[_\bd_\bo_\bx_\by_\bg_\be_\bn_\b] 1.9.8\n"}]}, {"source1": "./usr/share/doc/libdune-common-doc/doxygen/a00167.html", "source2": "./usr/share/doc/libdune-common-doc/doxygen/a00167.html", "unified_diff": "@@ -1,15 +1,15 @@\n \n \n \n \n \n \n \n-dune-common: debugstream.hh File Reference\n+dune-common: simd.hh File Reference\n \n \n \n \n \n \n \n@@ -72,62 +72,94 @@\n
  • dune
  • common
  • \n
    \n
    \n
    \n \n-
    debugstream.hh File Reference
    \n+Typedefs |\n+Functions
    \n+
    simd.hh File Reference
    \n \n
    \n \n-

    Defines several output streams for messages of different importance. \n+

    Abstractions for support of dedicated SIMD data types. \n More...

    \n-
    #include <iostream>
    \n-#include <stack>
    \n-#include <dune/common/exceptions.hh>
    \n+
    #include <cassert>
    \n+#include <cstddef>
    \n+#include <type_traits>
    \n+#include <utility>
    \n+#include <dune/common/conditional.hh>
    \n+#include <dune/common/debugalign.hh>
    \n+#include <dune/common/rangeutilities.hh>
    \n+#include <dune/common/typetraits.hh>
    \n+#include <dune/common/vc.hh>
    \n
    \n

    Go to the source code of this file.

    \n \n \n-\n-\n+\n \n-\n-\n+\n+\n \n-\n-\n+\n \n-\n-\n-\n-\n-\n-\n-\n+\n \n

    \n Classes

    struct  Dune::greater_or_equal< current, threshold >
     Greater or equal template test. More...
    struct  Dune::SimdScalarTypeTraits< T >
     
    struct  Dune::common_bits< current, mask >
     activate if current and mask have common bits switched on. More...
    struct  Dune::SimdScalarTypeTraits< AlignedNumber< T, align > >
     deduce the underlying scalar data type of an AlignedNumber More...
     
    class  Dune::DebugStreamError
     standard exception for the debugstream More...
    struct  Dune::SimdIndexTypeTraits< V, typename >
     
    class  Dune::StreamWrap
     
    class  Dune::DebugStreamState
     Intermediate class to implement tie-operation of DebugStream. More...
     
    class  Dune::DebugStream< thislevel, dlevel, alevel, activator >
     Generic class to implement debug output streams. More...
    struct  Dune::SimdMaskTypeTraits< V, typename >
     
    \n \n \n \n \n

    \n Namespaces

    namespace  Dune
     Dune namespace.
     
    \n \n-\n-\n-\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+

    \n Typedefs

    typedef unsigned int Dune::DebugLevel
     Type for debug levels.
     
    template<typename T >
    using Dune::SimdScalar = typename SimdScalarTypeTraits< T >::type
     
    template<typename V >
    using Dune::SimdIndex = typename SimdIndexTypeTraits< V >::type
     An simd vector of indices corresponding to a simd vector V.
     
    template<typename V >
    using Dune::SimdMask = typename SimdMaskTypeTraits< V >::type
     A simd vector of truth values corresponding to a simd vector V.
     
    \n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n

    \n+Functions

    template<class T >
    std::size_t Dune::lanes (const T &)
     get the number of lanes of a simd vector (scalar version)
     
    template<class T >
    Dune::lane (std::size_t l, const T &v)
     access a lane of a simd vector (scalar version)
     
    template<class T >
    T & Dune::lane (std::size_t l, T &v)
     access a lane of a simd vector (scalar version)
     
    template<class T >
    void Dune::assign (T &dst, const T &src, bool mask)
     masked Simd assignment (scalar version)
     
    template<class T >
    void Dune::swap (T &v1, T &v2, bool mask)
     
    \n

    Detailed Description

    \n-

    Defines several output streams for messages of different importance.

    \n-

    This file implements the class DebugStream to support output in a variety of debug levels. Additionally, template parameters control if the output operation is really performed so that unused debug levels can be deactivated

    \n+

    Abstractions for support of dedicated SIMD data types.

    \n+

    Libraries like Vc (https://github.com/VcDevel/Vc) add high-level data types for SIMD (or vectorization) support in C++. Most of these operations mimic the behavior of a numerical data type. Some boolean operations can not be implemented in a compatible way to trivial data types.

    \n+

    This header contains additional abstractions to help writing code that works with trivial numerical data types (like double) and Vc vectorization data types.

    \n+

    See also the conditional.hh and range_utils.hh headers.

    \n+
    Deprecated:
    Use the newer simd architecture from dune/common/simd/simd.hh instead.
    \n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,47 +1,79 @@\n dune-common\u00a02.10\n Loading...\n Searching...\n No Matches\n * _\bd_\bu_\bn_\be\n * _\bc_\bo_\bm_\bm_\bo_\bn\n-_\bC_\bl_\ba_\bs_\bs_\be_\bs | _\bN_\ba_\bm_\be_\bs_\bp_\ba_\bc_\be_\bs | _\bT_\by_\bp_\be_\bd_\be_\bf_\bs\n-debugstream.hh File Reference\n-_\bC_\bo_\bm_\bm_\bo_\bn \u00bb _\bD_\be_\bb_\bu_\bg_\b _\bo_\bu_\bt_\bp_\bu_\bt\n-Defines several output streams for messages of different importance. _\bM_\bo_\br_\be_\b._\b._\b.\n-#include \n-#include \n-#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\be_\bx_\bc_\be_\bp_\bt_\bi_\bo_\bn_\bs_\b._\bh_\bh>\n+_\bC_\bl_\ba_\bs_\bs_\be_\bs | _\bN_\ba_\bm_\be_\bs_\bp_\ba_\bc_\be_\bs | _\bT_\by_\bp_\be_\bd_\be_\bf_\bs | _\bF_\bu_\bn_\bc_\bt_\bi_\bo_\bn_\bs\n+simd.hh File Reference\n+Abstractions for support of dedicated SIMD data types. _\bM_\bo_\br_\be_\b._\b._\b.\n+#include \n+#include \n+#include \n+#include \n+#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\ba_\bl_\b._\bh_\bh>\n+#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bd_\be_\bb_\bu_\bg_\ba_\bl_\bi_\bg_\bn_\b._\bh_\bh>\n+#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\br_\ba_\bn_\bg_\be_\bu_\bt_\bi_\bl_\bi_\bt_\bi_\be_\bs_\b._\bh_\bh>\n+#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bt_\by_\bp_\be_\bt_\br_\ba_\bi_\bt_\bs_\b._\bh_\bh>\n+#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bv_\bc_\b._\bh_\bh>\n _\bG_\bo_\b _\bt_\bo_\b _\bt_\bh_\be_\b _\bs_\bo_\bu_\br_\bc_\be_\b _\bc_\bo_\bd_\be_\b _\bo_\bf_\b _\bt_\bh_\bi_\bs_\b _\bf_\bi_\bl_\be_\b.\n C\bCl\bla\bas\bss\bse\bes\bs\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bg_\br_\be_\ba_\bt_\be_\br_\b__\bo_\br_\b__\be_\bq_\bu_\ba_\bl_\b<_\b _\bc_\bu_\br_\br_\be_\bn_\bt_\b,_\b _\bt_\bh_\br_\be_\bs_\bh_\bo_\bl_\bd_\b _\b>\n-\u00a0 Greater or equal template test. _\bM_\bo_\br_\be_\b._\b._\b.\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bS_\bi_\bm_\bd_\bS_\bc_\ba_\bl_\ba_\br_\bT_\by_\bp_\be_\bT_\br_\ba_\bi_\bt_\bs_\b<_\b _\bT_\b _\b>\n \u00a0\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bc_\bo_\bm_\bm_\bo_\bn_\b__\bb_\bi_\bt_\bs_\b<_\b _\bc_\bu_\br_\br_\be_\bn_\bt_\b,_\b _\bm_\ba_\bs_\bk_\b _\b>\n-\u00a0 activate if current and mask have common bits switched on. _\bM_\bo_\br_\be_\b._\b._\b.\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bS_\bi_\bm_\bd_\bS_\bc_\ba_\bl_\ba_\br_\bT_\by_\bp_\be_\bT_\br_\ba_\bi_\bt_\bs_\b<_\b _\bA_\bl_\bi_\bg_\bn_\be_\bd_\bN_\bu_\bm_\bb_\be_\br_\b<_\b _\bT_\b,_\b _\ba_\bl_\bi_\bg_\bn_\b _\b>_\b _\b>\n+\u00a0 deduce the underlying scalar data type of an AlignedNumber _\bM_\bo_\br_\be_\b._\b._\b.\n \u00a0\n- class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bD_\be_\bb_\bu_\bg_\bS_\bt_\br_\be_\ba_\bm_\bE_\br_\br_\bo_\br\n-\u00a0 standard exception for the debugstream _\bM_\bo_\br_\be_\b._\b._\b.\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bS_\bi_\bm_\bd_\bI_\bn_\bd_\be_\bx_\bT_\by_\bp_\be_\bT_\br_\ba_\bi_\bt_\bs_\b<_\b _\bV_\b,_\b _\bt_\by_\bp_\be_\bn_\ba_\bm_\be_\b _\b>\n \u00a0\n- class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bS_\bt_\br_\be_\ba_\bm_\bW_\br_\ba_\bp\n-\u00a0\n- class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bD_\be_\bb_\bu_\bg_\bS_\bt_\br_\be_\ba_\bm_\bS_\bt_\ba_\bt_\be\n-\u00a0 Intermediate class to implement tie-operation of _\bD_\be_\bb_\bu_\bg_\bS_\bt_\br_\be_\ba_\bm. _\bM_\bo_\br_\be_\b._\b._\b.\n-\u00a0\n- class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bD_\be_\bb_\bu_\bg_\bS_\bt_\br_\be_\ba_\bm_\b<_\b _\bt_\bh_\bi_\bs_\bl_\be_\bv_\be_\bl_\b,_\b _\bd_\bl_\be_\bv_\be_\bl_\b,_\b _\ba_\bl_\be_\bv_\be_\bl_\b,_\b _\ba_\bc_\bt_\bi_\bv_\ba_\bt_\bo_\br_\b _\b>\n-\u00a0 Generic class to implement debug output streams. _\bM_\bo_\br_\be_\b._\b._\b.\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bS_\bi_\bm_\bd_\bM_\ba_\bs_\bk_\bT_\by_\bp_\be_\bT_\br_\ba_\bi_\bt_\bs_\b<_\b _\bV_\b,_\b _\bt_\by_\bp_\be_\bn_\ba_\bm_\be_\b _\b>\n \u00a0\n N\bNa\bam\bme\bes\bsp\bpa\bac\bce\bes\bs\n namespace \u00a0 _\bD_\bu_\bn_\be\n \u00a0 _\bD_\bu_\bn_\be namespace.\n \u00a0\n T\bTy\byp\bpe\bed\bde\bef\bfs\bs\n-typedef unsigned int\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bD_\be_\bb_\bu_\bg_\bL_\be_\bv_\be_\bl\n-\u00a0 Type for debug levels.\n+template\n+using\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bS_\bi_\bm_\bd_\bS_\bc_\ba_\bl_\ba_\br = typename _\bS_\bi_\bm_\bd_\bS_\bc_\ba_\bl_\ba_\br_\bT_\by_\bp_\be_\bT_\br_\ba_\bi_\bt_\bs< T >::type\n+\u00a0\n+template\n+using\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bS_\bi_\bm_\bd_\bI_\bn_\bd_\be_\bx = typename _\bS_\bi_\bm_\bd_\bI_\bn_\bd_\be_\bx_\bT_\by_\bp_\be_\bT_\br_\ba_\bi_\bt_\bs< V >::type\n+\u00a0 An simd vector of indices corresponding to a simd vector V.\n+\u00a0\n+template\n+using\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bS_\bi_\bm_\bd_\bM_\ba_\bs_\bk = typename _\bS_\bi_\bm_\bd_\bM_\ba_\bs_\bk_\bT_\by_\bp_\be_\bT_\br_\ba_\bi_\bt_\bs< V >::type\n+\u00a0 A simd vector of truth values corresponding to a simd vector V.\n+\u00a0\n+F\bFu\bun\bnc\bct\bti\bio\bon\bns\bs\n+template\n+std::size_t\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bl_\ba_\bn_\be_\bs (const T &)\n+\u00a0 get the number of lanes of a simd vector (scalar version)\n+\u00a0\n+template\n+ T\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bl_\ba_\bn_\be (std::size_t l, const T &v)\n+\u00a0 access a lane of a simd vector (scalar version)\n+\u00a0\n+template\n+ T &\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bl_\ba_\bn_\be (std::size_t l, T &v)\n+\u00a0 access a lane of a simd vector (scalar version)\n+\u00a0\n+template\n+ void\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\ba_\bs_\bs_\bi_\bg_\bn (T &dst, const T &src, bool mask)\n+\u00a0 masked _\bS_\bi_\bm_\bd assignment (scalar version)\n+\u00a0\n+template\n+ void\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bs_\bw_\ba_\bp (T &v1, T &v2, bool mask)\n \u00a0\n *\b**\b**\b**\b**\b* D\bDe\bet\bta\bai\bil\ble\bed\bd D\bDe\bes\bsc\bcr\bri\bip\bpt\bti\bio\bon\bn *\b**\b**\b**\b**\b*\n-Defines several output streams for messages of different importance.\n-This file implements the class DebugStream to support output in a variety of\n-debug levels. Additionally, template parameters control if the output operation\n-is really performed so that unused debug levels can be deactivated\n+Abstractions for support of dedicated SIMD data types.\n+Libraries like Vc (_\bh_\bt_\bt_\bp_\bs_\b:_\b/_\b/_\bg_\bi_\bt_\bh_\bu_\bb_\b._\bc_\bo_\bm_\b/_\bV_\bc_\bD_\be_\bv_\be_\bl_\b/_\bV_\bc) add high-level data types for\n+SIMD (or vectorization) support in C++. Most of these operations mimic the\n+behavior of a numerical data type. Some boolean operations can not be\n+implemented in a compatible way to trivial data types.\n+This header contains additional abstractions to help writing code that works\n+with trivial numerical data types (like double) and Vc vectorization data\n+types.\n+See also the _\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\ba_\bl_\b._\bh_\bh and range_utils.hh headers.\n+ _\bD\bD_\be\be_\bp\bp_\br\br_\be\be_\bc\bc_\ba\ba_\bt\bt_\be\be_\bd\bd_\b:\b:\n+ Use the newer simd architecture from _\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bs_\bi_\bm_\bd_\b/_\bs_\bi_\bm_\bd_\b._\bh_\bh instead.\n ===============================================================================\n Generated by\u00a0_\b[_\bd_\bo_\bx_\by_\bg_\be_\bn_\b] 1.9.8\n"}]}, {"source1": "./usr/share/doc/libdune-common-doc/doxygen/a00167_source.html", "source2": "./usr/share/doc/libdune-common-doc/doxygen/a00167_source.html", "unified_diff": "@@ -1,15 +1,15 @@\n \n \n \n \n \n \n \n-dune-common: debugstream.hh Source File\n+dune-common: simd.hh Source File\n \n \n \n \n \n \n \n@@ -74,333 +74,518 @@\n \n
    \n \n
    \n
    \n
    \n-
    debugstream.hh
    \n+
    simd.hh
    \n
    \n
    \n-Go to the documentation of this file.
    1// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
    \n-
    2// vi: set et ts=4 sw=2 sts=2:
    \n-
    3// SPDX-FileCopyrightInfo: Copyright \u00a9 DUNE Project contributors, see file LICENSE.md in module root
    \n-
    4// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception
    \n+Go to the documentation of this file.
    1// SPDX-FileCopyrightInfo: Copyright \u00a9 DUNE Project contributors, see file LICENSE.md in module root
    \n+
    2// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception
    \n+
    3#ifndef DUNE_COMMON_SIMD_HH
    \n+
    4#define DUNE_COMMON_SIMD_HH
    \n
    5
    \n-
    6#ifndef DUNE_DEBUGSTREAM_HH
    \n-
    7#define DUNE_DEBUGSTREAM_HH
    \n+
    6#warning dune/common/simd.hh is deprecated.
    \n+
    7#warning Use the new infrastructure from dune/common/simd/simd.h instead.
    \n
    8
    \n-
    13#include <iostream>
    \n-
    14#include <stack>
    \n-
    15
    \n-\n-
    17
    \n-
    18namespace Dune {
    \n-
    19
    \n-
    118 typedef unsigned int DebugLevel;
    \n-
    119
    \n-
    129 template <DebugLevel current, DebugLevel threshold>
    \n-
    \n-\n-
    131 constexpr static bool value = (current >= threshold);
    \n-
    132 };
    \n-
    \n-
    133
    \n-
    134
    \n-
    141 template <DebugLevel current, DebugLevel mask>
    \n-
    \n-
    142 struct common_bits {
    \n-
    143 constexpr static bool value = ((current & mask) != 0);
    \n-
    144 };
    \n-
    \n-
    145
    \n-
    146
    \n-
    148 class DebugStreamError : public IOError {};
    \n-
    149
    \n-
    \n-\n-
    151 public:
    \n-
    152 StreamWrap(std::ostream& _out) : out(_out) { }
    \n-
    153 std::ostream& out;
    \n-\n-
    155 };
    \n-
    \n-
    156
    \n-
    \n-\n-
    159 // !!! should be protected somehow but that won't be easy
    \n-
    160 public:
    \n-\n-
    163
    \n-\n-
    166
    \n-
    168 bool _tied;
    \n-
    169
    \n-
    171 unsigned int _tied_streams;
    \n-
    172 };
    \n-
    \n-
    173
    \n-
    188 template <DebugLevel thislevel = 1,
    \n-
    189 DebugLevel dlevel = 1,
    \n-
    190 DebugLevel alevel = 1,
    \n-
    191 template<DebugLevel, DebugLevel> class activator = greater_or_equal>
    \n-
    \n-\n-
    193 public:
    \n-
    \n-
    199 DebugStream(std::ostream& out = std::cerr) {
    \n-
    200 // start a new list of streams
    \n-
    201 current = new StreamWrap(out);
    \n-
    202 current->next = 0;
    \n-
    203
    \n-
    204 // check if we are above the default activation level
    \n-
    205 _active = activator<thislevel,alevel>::value;
    \n-
    206
    \n-
    207 // we're not tied to another DebugStream
    \n-
    208 _tied = false;
    \n-
    209
    \n-
    210 // no child streams yet
    \n-
    211 _tied_streams = 0;
    \n-
    212 }
    \n-
    \n-
    213
    \n-
    \n-\n-
    220 std::ostream& fallback = std::cerr)
    \n-
    221 {
    \n-
    222 // start a new list of streams
    \n-
    223 current = new StreamWrap(fallback);
    \n-
    224 current->next = 0;
    \n+
    30#include <cassert>
    \n+
    31#include <cstddef>
    \n+
    32#include <type_traits>
    \n+
    33#include <utility>
    \n+
    34
    \n+\n+\n+\n+
    38#if HAVE_VC
    \n+
    39// include Vc part of new simd interface to provide compatibility for
    \n+
    40// functionality that has been switched over.
    \n+\n+
    42#endif
    \n+\n+
    44#include <dune/common/vc.hh>
    \n+
    45
    \n+
    46namespace Dune
    \n+
    47{
    \n+
    48
    \n+
    49#if HAVE_VC
    \n+
    50 namespace VcImpl {
    \n+
    52
    \n+
    61 template<class V>
    \n+
    62 class Proxy
    \n+
    63 {
    \n+
    64 static_assert(std::is_same<V, std::decay_t<V> >::value, "Class Proxy "
    \n+
    65 "may only be instantiated with unqualified types");
    \n+
    66 public:
    \n+
    67 using value_type = typename V::value_type;
    \n+
    68
    \n+
    69 private:
    \n+
    70 static_assert(std::is_arithmetic<value_type>::value,
    \n+
    71 "Only arithmetic types are supported");
    \n+
    72 V &vec_;
    \n+
    73 std::size_t idx_;
    \n+
    74
    \n+
    75 public:
    \n+
    76 Proxy(std::size_t idx, V &vec)
    \n+
    77 : vec_(vec), idx_(idx)
    \n+
    78 { }
    \n+
    79
    \n+
    80 operator value_type() const { return vec_[idx_]; }
    \n+
    81
    \n+
    82 // postfix operators
    \n+
    83
    \n+
    84 template<class T = value_type,
    \n+
    85 class = std::enable_if_t<!std::is_same<T, bool>::value> >
    \n+
    86 value_type operator++(int) { return vec_[idx_]++; }
    \n+
    87 template<class T = value_type,
    \n+
    88 class = std::enable_if_t<!std::is_same<T, bool>::value> >
    \n+
    89 value_type operator--(int) { return vec_[idx_]--; }
    \n+
    90
    \n+
    91 // unary (prefix) operators
    \n+
    92 template<class T = value_type,
    \n+
    93 class = std::enable_if_t<!std::is_same<T, bool>::value> >
    \n+
    94 Proxy &operator++() { ++(vec_[idx_]); return *this; }
    \n+
    95 template<class T = value_type,
    \n+
    96 class = std::enable_if_t<!std::is_same<T, bool>::value> >
    \n+
    97 Proxy &operator--() { --(vec_[idx_]); return *this; }
    \n+
    98 decltype(auto) operator!() const { return !(vec_[idx_]); }
    \n+
    99 decltype(auto) operator+() const { return +(vec_[idx_]); }
    \n+
    100 decltype(auto) operator-() const { return -(vec_[idx_]); }
    \n+
    101 template<class T = value_type,
    \n+
    102 class = std::enable_if_t<std::is_integral<T>::value> >
    \n+
    103 decltype(auto) operator~() const { return ~(vec_[idx_]); }
    \n+
    104
    \n+
    105 // binary operators
    \n+
    106#define DUNE_SIMD_VC_BINARY_OP(OP) \\
    \n+
    107 template<class T> \\
    \n+
    108 auto operator OP(T &&o) const \\
    \n+
    109 -> decltype(vec_[idx_] OP valueCast(std::forward<T>(o))) \\
    \n+
    110 { \\
    \n+
    111 return vec_[idx_] OP valueCast(std::forward<T>(o)); \\
    \n+
    112 } \\
    \n+
    113 static_assert(true, "Require semicolon to unconfuse editors")
    \n+
    114
    \n+
    115 DUNE_SIMD_VC_BINARY_OP(*);
    \n+
    116 DUNE_SIMD_VC_BINARY_OP(/);
    \n+
    117 DUNE_SIMD_VC_BINARY_OP(%);
    \n+
    118
    \n+
    119 DUNE_SIMD_VC_BINARY_OP(+);
    \n+
    120 DUNE_SIMD_VC_BINARY_OP(-);
    \n+
    121
    \n+
    122 DUNE_SIMD_VC_BINARY_OP(<<);
    \n+
    123 DUNE_SIMD_VC_BINARY_OP(>>);
    \n+
    124
    \n+
    125 DUNE_SIMD_VC_BINARY_OP(<);
    \n+
    126 DUNE_SIMD_VC_BINARY_OP(>);
    \n+
    127 DUNE_SIMD_VC_BINARY_OP(<=);
    \n+
    128 DUNE_SIMD_VC_BINARY_OP(>=);
    \n+
    129
    \n+
    130 DUNE_SIMD_VC_BINARY_OP(==);
    \n+
    131 DUNE_SIMD_VC_BINARY_OP(!=);
    \n+
    132
    \n+
    133 DUNE_SIMD_VC_BINARY_OP(&);
    \n+
    134 DUNE_SIMD_VC_BINARY_OP(^);
    \n+
    135 DUNE_SIMD_VC_BINARY_OP(|);
    \n+
    136
    \n+
    137 DUNE_SIMD_VC_BINARY_OP(&&);
    \n+
    138 DUNE_SIMD_VC_BINARY_OP(||);
    \n+
    139#undef DUNE_SIMD_VC_BINARY_OP
    \n+
    140
    \n+
    141#define DUNE_SIMD_VC_ASSIGNMENT(OP) \\
    \n+
    142 template<class T> \\
    \n+
    143 auto operator OP(T &&o) \\
    \n+
    144 -> std::enable_if_t<AlwaysTrue<decltype( \\
    \n+
    145 vec_[idx_] OP valueCast(std::forward<T>(o)) \\
    \n+
    146 )>::value, Proxy&> \\
    \n+
    147 { \\
    \n+
    148 vec_[idx_] OP valueCast(std::forward<T>(o)); \\
    \n+
    149 return *this; \\
    \n+
    150 } \\
    \n+
    151 static_assert(true, "Require semicolon to unconfuse editors")
    \n+
    152
    \n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+
    164#undef DUNE_SIMD_VC_ASSIGNMENT
    \n+
    165
    \n+
    166 // swap on proxies swaps the proxied vector entries. As such, it
    \n+
    167 // applies to rvalues of proxies too, not just lvalues
    \n+
    168 template<class V1, class V2>
    \n+
    169 friend void swap(Proxy<V1>, Proxy<V2>);
    \n+
    170
    \n+
    171 template<class T>
    \n+
    172 friend void swap(Proxy p1, T& s2)
    \n+
    173 {
    \n+
    174 // don't use swap() ourselves -- not supported by Vc 1.3.0 (but is
    \n+
    175 // supported by Vc 1.3.2)
    \n+
    176 T tmp = p1.vec_[p1.idx_];
    \n+
    177 p1.vec_[p1.idx_] = s2;
    \n+
    178 s2 = tmp;
    \n+
    179 }
    \n+
    180
    \n+
    181 template<class T>
    \n+
    182 friend void swap(T& s1, Proxy p2)
    \n+
    183 {
    \n+
    184 T tmp = s1;
    \n+
    185 s1 = p2.vec_[p2.idx_];
    \n+
    186 p2.vec_[p2.idx_] = tmp;
    \n+
    187 }
    \n+
    188 };
    \n+
    189
    \n+
    190 template<class V1, class V2>
    \n+
    191 void swap(Proxy<V1> p1, Proxy<V2> p2)
    \n+
    192 {
    \n+
    193 typename V1::value_type tmp = p1.vec_[p1.idx_];
    \n+
    194 p1.vec_[p1.idx_] = p2.vec_[p2.idx_];
    \n+
    195 p2.vec_[p2.idx_] = tmp;
    \n+
    196 }
    \n+
    197 } // namespace VcImpl
    \n+
    198#endif // HAVE_VC
    \n+
    199
    \n+
    200 template<typename T>
    \n+
    \n+\n+
    202 {
    \n+
    203 using type = T;
    \n+
    204 };
    \n+
    \n+
    205
    \n+
    206 template<typename T>
    \n+\n+
    208
    \n+
    209#if HAVE_VC
    \n+
    210 /*
    \n+
    211 Add Vc specializations for the SimdScalarTypeTraits trais class
    \n+
    212 */
    \n+
    213 template<typename T, typename A>
    \n+
    214 struct SimdScalarTypeTraits< Vc::Vector<T,A> >
    \n+
    215 {
    \n+
    216 using type = T;
    \n+
    217 };
    \n+
    218
    \n+
    219 template<typename T, std::size_t N, typename V, std::size_t M>
    \n+
    220 struct SimdScalarTypeTraits< Vc::SimdArray<T,N,V,M> >
    \n+
    221 {
    \n+
    222 using type = T;
    \n+
    223 };
    \n+
    224#endif // HAVE_VC
    \n
    225
    \n-
    226 // check if we are above the default activation level
    \n-
    227 _active = activator<thislevel,alevel>::value;
    \n-
    228 _tied_streams = 0;
    \n-
    229
    \n-
    230 // tie to the provided stream
    \n-
    231 _tied = true;
    \n-
    232 tiedstate = &master;
    \n-
    233 tiedstate->_tied_streams++;
    \n-
    234 }
    \n-
    \n-
    235
    \n-
    \n-\n-
    244 {
    \n-
    245 // untie
    \n-
    246 if (_tied)
    \n-
    247 tiedstate->_tied_streams--;
    \n-
    248 else {
    \n-
    249 // check if somebody still ties to us...
    \n-
    250 if (_tied_streams != 0)
    \n-
    251 {
    \n-
    252 std::cerr << "DebugStream destructor is called while other streams are still tied to it. Terminating!" << std::endl;
    \n-
    253 std::terminate();
    \n-
    254 }
    \n-
    255 }
    \n-
    256
    \n-
    257 // remove ostream-stack
    \n-
    258 while (current != 0) {
    \n-
    259 StreamWrap *s = current;
    \n-\n-
    261 delete s;
    \n-
    262 }
    \n-
    263 }
    \n+
    227 template<typename T, std::size_t align>
    \n+
    \n+\n+
    229 {
    \n+
    230 using type = T;
    \n+
    231 };
    \n+
    \n+
    232
    \n+
    233 template<typename V, typename = void>
    \n+
    \n+\n+
    235 using type = std::size_t;
    \n+
    236 };
    \n+
    \n+
    237
    \n+
    239
    \n+
    245 template<typename V>
    \n+\n+
    247
    \n+
    248#if HAVE_VC
    \n+
    249 template<typename T, typename A>
    \n+
    250 struct SimdIndexTypeTraits<Vc::Vector<T, A> > {
    \n+
    251 using type = typename Vc::Vector<T, A>::index_type;
    \n+
    252 };
    \n+
    253
    \n+
    254 template<typename T, std::size_t n, typename V>
    \n+
    255 struct SimdIndexTypeTraits<Vc::SimdArray<T, n, V> > {
    \n+
    256 using type = typename Vc::SimdArray<T, n, V>::index_type;
    \n+
    257 };
    \n+
    258#endif // HAVE_VC
    \n+
    259
    \n+
    260 template<typename V, typename = void>
    \n+
    \n+\n+
    262 using type = bool;
    \n+
    263 };
    \n
    \n
    264
    \n-
    266 template <class T>
    \n-
    \n-
    267 DebugStream& operator<<(const T data) {
    \n-
    268 // remove the following code if stream wasn't compiled active
    \n-
    269 if (activator<thislevel, dlevel>::value) {
    \n-
    270 if (! _tied) {
    \n-
    271 if (_active)
    \n-
    272 current->out << data;
    \n-
    273 } else {
    \n-
    274 if (_active && tiedstate->_active)
    \n-
    275 tiedstate->current->out << data;
    \n-
    276 }
    \n-
    277 }
    \n-
    278
    \n-
    279 return *this;
    \n-
    280 }
    \n-
    \n-
    281
    \n-
    \n-
    289 DebugStream& operator<<(const int data) {
    \n-
    290 // remove the following code if stream wasn't compiled active
    \n-
    291 if (activator<thislevel, dlevel>::value) {
    \n-
    292 if (! _tied) {
    \n-
    293 if (_active)
    \n-
    294 current->out << data;
    \n-
    295 } else {
    \n-
    296 if (_active && tiedstate->_active)
    \n-
    297 tiedstate->current->out << data;
    \n-
    298 }
    \n-
    299 }
    \n-
    300
    \n-
    301 return *this;
    \n-
    302 }
    \n-
    \n-
    303
    \n-
    \n-
    305 DebugStream& operator<<(std::ostream& (*f)(std::ostream&)) {
    \n-
    306 if (activator<thislevel, dlevel>::value) {
    \n-
    307 if (! _tied) {
    \n-
    308 if (_active)
    \n-
    309 f(current->out);
    \n-
    310 } else {
    \n-
    311 if (_active && tiedstate->_active)
    \n-
    312 f(tiedstate->current->out);
    \n-
    313 }
    \n-
    314 }
    \n-
    315
    \n-
    316 return *this;
    \n-
    317 }
    \n-
    \n-
    318
    \n-
    \n-\n-
    321 if (activator<thislevel, dlevel>::value) {
    \n-
    322 if (! _tied) {
    \n-
    323 if (_active)
    \n-
    324 current->out.flush();
    \n-
    325 } else {
    \n-
    326 if (_active && tiedstate->_active)
    \n-
    327 tiedstate->current->out.flush();
    \n-
    328 }
    \n-
    329 }
    \n-
    330
    \n-
    331 return *this;
    \n-
    332 }
    \n-
    \n-
    333
    \n-
    \n-
    335 void push(bool b) {
    \n-
    336 // are we at all active?
    \n-
    337 if (activator<thislevel,alevel>::value) {
    \n-
    338 _actstack.push(_active);
    \n-
    339 _active = b;
    \n-
    340 } else {
    \n-
    341 // stay off
    \n-
    342 _actstack.push(false);
    \n-
    343 }
    \n-
    344 }
    \n-
    \n-
    345
    \n-
    \n-
    349 void pop() {
    \n-
    350 if (_actstack.empty())
    \n-
    351 DUNE_THROW(DebugStreamError, "No previous activation setting!");
    \n+
    266
    \n+
    269 template<typename V>
    \n+\n+
    271
    \n+
    272#if HAVE_VC
    \n+
    273 template<typename T, typename A>
    \n+
    274 struct SimdMaskTypeTraits<Vc::Vector<T, A> > {
    \n+
    275 using type = typename Vc::Vector<T, A>::mask_type;
    \n+
    276 };
    \n+
    277
    \n+
    278 template<typename T, std::size_t n, typename V>
    \n+
    279 struct SimdMaskTypeTraits<Vc::SimdArray<T, n, V> > {
    \n+
    280 using type = typename Vc::SimdArray<T, n, V>::mask_type;
    \n+
    281 };
    \n+
    282#endif // HAVE_VC
    \n+
    283
    \n+
    284#if HAVE_VC
    \n+
    285 /*
    \n+
    286 Add Vc specializations for cond(), see conditional.hh
    \n+
    287 */
    \n+
    288 template<typename T, typename A>
    \n+
    289 Vc::Vector<T,A> cond(const Vc::Mask<T,A> & b,
    \n+
    290 const Vc::Vector<T,A> & v1,
    \n+
    291 const Vc::Vector<T,A> & v2)
    \n+
    292 {
    \n+
    293 return std::move(Vc::iif(b, v1, v2));
    \n+
    294 }
    \n+
    295
    \n+
    296 template<typename T, std::size_t N, typename V, std::size_t M>
    \n+
    297 Vc::SimdArray<T,N,V,M> cond(const typename Vc::SimdArray<T,N,V,M>::mask_type & b,
    \n+
    298 const Vc::SimdArray<T,N,V,M> & v1,
    \n+
    299 const Vc::SimdArray<T,N,V,M> & v2)
    \n+
    300 {
    \n+
    301 return std::move(Vc::iif(b, v1, v2));
    \n+
    302 }
    \n+
    303#endif // HAVE_VC
    \n+
    304
    \n+
    305#if HAVE_VC
    \n+
    306 /*
    \n+
    307 Add Vc specializations for several boolean operations, see rangeutitlities.hh:
    \n+
    308
    \n+
    309 max_value, min_value, any_true, all_true
    \n+
    310 */
    \n+
    311 template<typename T, typename A>
    \n+
    312 T max_value(const Vc::Vector<T,A> & v)
    \n+
    313 {
    \n+
    314 return v.max();
    \n+
    315 }
    \n+
    316
    \n+
    317 template<typename T, std::size_t N, typename V, std::size_t M>
    \n+
    318 double max_value(const Vc::SimdArray<T,N,V,M> & v)
    \n+
    319 {
    \n+
    320 return v.max();
    \n+
    321 }
    \n+
    322
    \n+
    323 template<typename T, typename A>
    \n+
    324 T min_value(const Vc::Vector<T,A> & v)
    \n+
    325 {
    \n+
    326 return v.min();
    \n+
    327 }
    \n+
    328
    \n+
    329 template<typename T, std::size_t N, typename V, std::size_t M>
    \n+
    330 double min_value(const Vc::SimdArray<T,N,V,M> & v)
    \n+
    331 {
    \n+
    332 return v.min();
    \n+
    333 }
    \n+
    334
    \n+
    335 template<typename T, typename A>
    \n+
    336 bool any_true(const Vc::Mask<T,A> & v)
    \n+
    337 {
    \n+
    338 return Vc::any_of(v);
    \n+
    339 }
    \n+
    340
    \n+
    341 template<typename T, std::size_t N, typename V, std::size_t M>
    \n+
    342 bool any_true(const Vc::SimdMaskArray<T,N,V,M> & v)
    \n+
    343 {
    \n+
    344 return Vc::any_of(v);
    \n+
    345 }
    \n+
    346
    \n+
    347 template<typename T, typename A>
    \n+
    348 bool all_true(const Vc::Mask<T,A> & v)
    \n+
    349 {
    \n+
    350 return Vc::all_of(v);
    \n+
    351 }
    \n
    352
    \n-
    353 _active = _actstack.top();
    \n-
    354 _actstack.pop();
    \n-
    355 }
    \n-
    \n-
    356
    \n-
    \n-
    363 bool active() const {
    \n-
    364 return activator<thislevel, dlevel>::value && _active;
    \n-
    365 }
    \n-
    \n-
    366
    \n-
    \n-
    371 void attach(std::ostream& stream) {
    \n-
    372 if (_tied)
    \n-
    373 DUNE_THROW(DebugStreamError, "Cannot attach to a tied stream!");
    \n-
    374
    \n-
    375 StreamWrap* newcurr = new StreamWrap(stream);
    \n-
    376 newcurr->next = current;
    \n-
    377 current = newcurr;
    \n-
    378 }
    \n+
    353 template<typename T, std::size_t N, typename V, std::size_t M>
    \n+
    354 bool all_true(const Vc::SimdMaskArray<T,N,V,M> & v)
    \n+
    355 {
    \n+
    356 return Vc::all_of(v);
    \n+
    357 }
    \n+
    358#endif // HAVE_VC
    \n+
    359
    \n+
    361 template<class T>
    \n+
    362 std::size_t lanes(const T &) { return 1; }
    \n+
    363
    \n+
    365 template<class T>
    \n+
    \n+
    366 T lane(std::size_t l, const T &v)
    \n+
    367 {
    \n+
    368 assert(l == 0);
    \n+
    369 return v;
    \n+
    370 }
    \n+
    \n+
    371
    \n+
    373 template<class T>
    \n+
    \n+
    374 T &lane(std::size_t l, T &v)
    \n+
    375 {
    \n+
    376 assert(l == 0);
    \n+
    377 return v;
    \n+
    378 }
    \n
    \n
    379
    \n-
    \n-
    383 void detach() {
    \n-
    384 if (current->next == 0)
    \n-
    385 DUNE_THROW(DebugStreamError, "Cannot detach initial stream!");
    \n-
    386 if (_tied)
    \n-
    387 DUNE_THROW(DebugStreamError, "Cannot detach a tied stream!");
    \n-
    388
    \n-
    389 StreamWrap* old = current;
    \n-\n-
    391 delete old;
    \n-
    392 }
    \n-
    \n+
    380#if HAVE_VC
    \n+
    381 template<class T, class A>
    \n+
    382 std::size_t lanes(const Vc::Vector<T, A> &)
    \n+
    383 {
    \n+
    384 return Vc::Vector<T, A>::size();
    \n+
    385 }
    \n+
    386
    \n+
    387 template<class T, class A>
    \n+
    388 T lane(std::size_t l, const Vc::Vector<T, A> &v)
    \n+
    389 {
    \n+
    390 assert(l < lanes(v));
    \n+
    391 return v[l];
    \n+
    392 }
    \n
    393
    \n-
    \n-\n-
    398 if (to._tied)
    \n-
    399 DUNE_THROW(DebugStreamError, "Cannot tie to an already tied stream!");
    \n-
    400 if (_tied)
    \n-
    401 DUNE_THROW(DebugStreamError, "Stream already tied: untie first!");
    \n-
    402
    \n-
    403 _tied = true;
    \n-
    404 tiedstate = &to;
    \n-
    405
    \n-
    406 // tell master class
    \n-
    407 tiedstate->_tied_streams++;
    \n-
    408 }
    \n-
    \n-
    409
    \n-
    \n-
    413 void untie() {
    \n-
    414 if(! _tied)
    \n-
    415 DUNE_THROW(DebugStreamError, "Cannot untie, stream is not tied!");
    \n-
    416
    \n-
    417 tiedstate->_tied_streams--;
    \n-
    418 _tied = false;
    \n-
    419 tiedstate = 0;
    \n-
    420 }
    \n-
    \n-
    421
    \n-
    422 private:
    \n-
    424 DebugStreamState* tiedstate;
    \n-
    425
    \n-
    430 std::stack<bool> _actstack;
    \n-
    431 };
    \n-
    \n-
    432
    \n-
    434}
    \n-
    435
    \n-
    436
    \n-
    437#endif
    \n-
    A few common exception classes.
    \n-
    StreamWrap(std::ostream &_out)
    Definition debugstream.hh:152
    \n-
    DebugStream(std::ostream &out=std::cerr)
    Create a DebugStream and set initial output stream.
    Definition debugstream.hh:199
    \n-
    void untie()
    Untie stream.
    Definition debugstream.hh:413
    \n-
    DebugStream & flush()
    pass on flush to underlying output stream
    Definition debugstream.hh:320
    \n-
    void attach(std::ostream &stream)
    set output to a different stream.
    Definition debugstream.hh:371
    \n-
    void detach()
    detach current output stream and restore to previous stream
    Definition debugstream.hh:383
    \n-
    static constexpr bool value
    Definition debugstream.hh:143
    \n-
    std::ostream & out
    Definition debugstream.hh:153
    \n-
    void pop()
    restore previously set activation flag
    Definition debugstream.hh:349
    \n-
    bool active() const
    reports if this stream will produce output
    Definition debugstream.hh:363
    \n-
    bool _active
    flag to switch output during runtime
    Definition debugstream.hh:165
    \n-
    unsigned int _tied_streams
    how many streams are tied to this state
    Definition debugstream.hh:171
    \n-
    void tie(DebugStreamState &to)
    Tie a stream to this one.
    Definition debugstream.hh:397
    \n-
    void push(bool b)
    set activation flag and store old value
    Definition debugstream.hh:335
    \n-
    unsigned int DebugLevel
    Type for debug levels.
    Definition debugstream.hh:118
    \n-
    bool _tied
    are we tied to another DebugStream?
    Definition debugstream.hh:168
    \n-
    StreamWrap * current
    current output stream and link to possibly pushed old output streams
    Definition debugstream.hh:162
    \n-
    DebugStream & operator<<(const T data)
    Generic types are passed on to current output stream.
    Definition debugstream.hh:267
    \n-
    static constexpr bool value
    Definition debugstream.hh:131
    \n-
    ~DebugStream()
    Destroy stream.
    Definition debugstream.hh:243
    \n-
    DebugStream(DebugStreamState &master, std::ostream &fallback=std::cerr)
    Create a DebugStream and directly tie to another DebugStream.
    Definition debugstream.hh:219
    \n-
    DebugStream & operator<<(const int data)
    explicit specialization so that enums can be printed
    Definition debugstream.hh:289
    \n-
    DebugStream & operator<<(std::ostream &(*f)(std::ostream &))
    pass on manipulators to underlying output stream
    Definition debugstream.hh:305
    \n-
    StreamWrap * next
    Definition debugstream.hh:154
    \n-
    #define DUNE_THROW(E, m)
    Definition exceptions.hh:218
    \n+
    394 template<class T, class A>
    \n+
    395 auto lane(std::size_t l, Vc::Vector<T, A> &v)
    \n+
    396 {
    \n+
    397 assert(l < lanes(v));
    \n+
    398 return VcImpl::Proxy<Vc::Vector<T, A> >{l, v};
    \n+
    399 }
    \n+
    400
    \n+
    401 template<class T, std::size_t n, class V>
    \n+
    402 std::size_t lanes(const Vc::SimdArray<T, n, V> &)
    \n+
    403 {
    \n+
    404 return n;
    \n+
    405 }
    \n+
    406
    \n+
    407 template<class T, std::size_t n, class V>
    \n+
    408 T lane(std::size_t l, const Vc::SimdArray<T, n, V> &v)
    \n+
    409 {
    \n+
    410 assert(l < n);
    \n+
    411 return v[l];
    \n+
    412 }
    \n+
    413
    \n+
    414 template<class T, std::size_t n, class V>
    \n+
    415 auto lane(std::size_t l, Vc::SimdArray<T, n, V> &v)
    \n+
    416 {
    \n+
    417 assert(l < n);
    \n+
    418 return VcImpl::Proxy<Vc::SimdArray<T, n, V> >{l, v};
    \n+
    419 }
    \n+
    420
    \n+
    421 template<class T, std::size_t n, class V>
    \n+
    422 std::size_t lanes(const Vc::SimdMaskArray<T, n, V> &)
    \n+
    423 {
    \n+
    424 return n;
    \n+
    425 }
    \n+
    426
    \n+
    427 template<class T, std::size_t n, class V>
    \n+
    428 bool lane(std::size_t l, const Vc::SimdMaskArray<T, n, V> &v)
    \n+
    429 {
    \n+
    430 assert(l < n);
    \n+
    431 return v[l];
    \n+
    432 }
    \n+
    433
    \n+
    434 template<class T, std::size_t n, class V>
    \n+
    435 auto lane(std::size_t l, Vc::SimdMaskArray<T, n, V> &v)
    \n+
    436 {
    \n+
    437 assert(l < n);
    \n+
    438 return VcImpl::Proxy<Vc::SimdMaskArray<T, n, V> >{l, v};
    \n+
    439 }
    \n+
    440#endif // HAVE_VC
    \n+
    441
    \n+
    443
    \n+
    446 template<class T>
    \n+
    \n+
    447 void assign(T &dst, const T &src, bool mask)
    \n+
    448 {
    \n+
    449 if(mask) dst = src;
    \n+
    450 }
    \n+
    \n+
    451
    \n+
    452#if HAVE_VC
    \n+
    453 /*
    \n+
    454 Add Vc specializations for masked assignment
    \n+
    455 */
    \n+
    456 template<class T, class A>
    \n+
    457 void assign(Vc::Vector<T, A> &dst, const Vc::Vector<T, A> &src,
    \n+
    458 typename Vc::Vector<T, A>::mask_type mask)
    \n+
    459 {
    \n+
    460 dst(mask) = src;
    \n+
    461 }
    \n+
    462
    \n+
    463 template<class T, std::size_t n, class V>
    \n+
    464 void assign(Vc::SimdArray<T, n, V> &dst, const Vc::SimdArray<T, n, V> &src,
    \n+
    465 typename Vc::SimdArray<T, n, V>::mask_type mask)
    \n+
    466 {
    \n+
    467 dst(mask) = src;
    \n+
    468 }
    \n+
    469#endif // HAVE_VC
    \n+
    470
    \n+
    471 template<class T>
    \n+
    \n+
    472 void swap(T &v1, T &v2, bool mask)
    \n+
    473 {
    \n+
    474 using std::swap;
    \n+
    475 if(mask) swap(v1, v2);
    \n+
    476 }
    \n+
    \n+
    477
    \n+
    478#if HAVE_VC
    \n+
    479 /*
    \n+
    480 Add Vc specializations for masked swap
    \n+
    481 */
    \n+
    482 template<class T, class A>
    \n+
    483 void swap(Vc::Vector<T, A> &v1, Vc::Vector<T, A> &v2,
    \n+
    484 typename Vc::Vector<T, A>::mask_type mask)
    \n+
    485 {
    \n+
    486 auto tmp = v1;
    \n+
    487 v1(mask) = v2;
    \n+
    488 v2(mask) = tmp;
    \n+
    489 }
    \n+
    490
    \n+
    491 template<class T, std::size_t n, class V>
    \n+
    492 void swap(Vc::SimdArray<T, n, V> &v1, Vc::SimdArray<T, n, V> &v2,
    \n+
    493 typename Vc::SimdArray<T, n, V>::mask_type mask)
    \n+
    494 {
    \n+
    495 auto tmp = v1;
    \n+
    496 v1(mask) = v2;
    \n+
    497 v2(mask) = tmp;
    \n+
    498 }
    \n+
    499#endif // HAVE_VC
    \n+
    500
    \n+
    501} // end namespace Dune
    \n+
    502
    \n+
    503#endif // DUNE_COMMON_SIMD_HH
    \n+
    Utilities for reduction like operations on ranges.
    \n+
    Traits for type conversions and type information.
    \n+
    Compatibility header for including <Vc/Vc>
    \n+\n+\n
    Dune namespace.
    Definition alignedallocator.hh:13
    \n-
    Greater or equal template test.
    Definition debugstream.hh:130
    \n-
    activate if current and mask have common bits switched on.
    Definition debugstream.hh:142
    \n-
    standard exception for the debugstream
    Definition debugstream.hh:148
    \n-
    Definition debugstream.hh:150
    \n-
    Intermediate class to implement tie-operation of DebugStream.
    Definition debugstream.hh:158
    \n-
    Generic class to implement debug output streams.
    Definition debugstream.hh:192
    \n-
    Default exception class for I/O errors.
    Definition exceptions.hh:231
    \n+
    bool any_true(const AlignedNumber< bool, align > &val)
    Definition debugalign.hh:506
    \n+
    bool all_true(const AlignedNumber< bool, align > &val)
    Definition debugalign.hh:512
    \n+
    typename SimdIndexTypeTraits< V >::type SimdIndex
    An simd vector of indices corresponding to a simd vector V.
    Definition simd.hh:246
    \n+
    typename SimdScalarTypeTraits< T >::type SimdScalar
    Definition simd.hh:207
    \n+
    typename SimdMaskTypeTraits< V >::type SimdMask
    A simd vector of truth values corresponding to a simd vector V.
    Definition simd.hh:270
    \n+
    T lane(std::size_t l, const T &v)
    access a lane of a simd vector (scalar version)
    Definition simd.hh:366
    \n+
    void swap(T &v1, T &v2, bool mask)
    Definition simd.hh:472
    \n+
    void assign(T &dst, const T &src, bool mask)
    masked Simd assignment (scalar version)
    Definition simd.hh:447
    \n+
    const T1 cond(bool b, const T1 &v1, const T2 &v2)
    conditional evaluate
    Definition conditional.hh:28
    \n+
    T max_value(const AlignedNumber< T, align > &val)
    Definition debugalign.hh:494
    \n+
    T min_value(const AlignedNumber< T, align > &val)
    Definition debugalign.hh:500
    \n+
    std::size_t lanes(const T &)
    get the number of lanes of a simd vector (scalar version)
    Definition simd.hh:362
    \n+
    aligned wrappers for arithmetic types
    Definition debugalign.hh:128
    \n+
    Definition simd.hh:202
    \n+
    T type
    Definition simd.hh:203
    \n+\n+
    Definition simd.hh:234
    \n+
    std::size_t type
    Definition simd.hh:235
    \n+
    Definition simd.hh:261
    \n+
    bool type
    Definition simd.hh:262
    \n+
    SIMD abstractions for Vc.
    \n+
    #define DUNE_SIMD_VC_ASSIGNMENT(OP)
    Definition simd/vc.hh:224
    \n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,375 +1,549 @@\n dune-common\u00a02.10\n Loading...\n Searching...\n No Matches\n * _\bd_\bu_\bn_\be\n * _\bc_\bo_\bm_\bm_\bo_\bn\n-debugstream.hh\n+simd.hh\n _\bG_\bo_\b _\bt_\bo_\b _\bt_\bh_\be_\b _\bd_\bo_\bc_\bu_\bm_\be_\bn_\bt_\ba_\bt_\bi_\bo_\bn_\b _\bo_\bf_\b _\bt_\bh_\bi_\bs_\b _\bf_\bi_\bl_\be_\b.\n-1// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-\n-2// vi: set et ts=4 sw=2 sts=2:\n-3// SPDX-FileCopyrightInfo: Copyright \u00c2\u00a9 DUNE Project contributors, see file\n+1// SPDX-FileCopyrightInfo: Copyright \u00c2\u00a9 DUNE Project contributors, see file\n LICENSE.md in module root\n-4// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception\n+2// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception\n+3#ifndef DUNE_COMMON_SIMD_HH\n+4#define DUNE_COMMON_SIMD_HH\n 5\n-6#ifndef DUNE_DEBUGSTREAM_HH\n-7#define DUNE_DEBUGSTREAM_HH\n+6#warning dune/common/simd.hh is deprecated.\n+7#warning Use the new infrastructure from dune/common/simd/simd.h instead.\n 8\n-13#include \n-14#include \n-15\n-16#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\be_\bx_\bc_\be_\bp_\bt_\bi_\bo_\bn_\bs_\b._\bh_\bh>\n-17\n-18namespace _\bD_\bu_\bn_\be {\n-19\n-_\b1_\b1_\b8 typedef unsigned int _\bD_\be_\bb_\bu_\bg_\bL_\be_\bv_\be_\bl;\n-119\n-129 template \n-_\b1_\b3_\b0 struct _\bg_\br_\be_\ba_\bt_\be_\br_\b__\bo_\br_\b__\be_\bq_\bu_\ba_\bl {\n-_\b1_\b3_\b1 constexpr static bool _\bv_\ba_\bl_\bu_\be = (current >= threshold);\n-132 };\n-133\n-134\n-141 template \n-_\b1_\b4_\b2 struct _\bc_\bo_\bm_\bm_\bo_\bn_\b__\bb_\bi_\bt_\bs {\n-_\b1_\b4_\b3 constexpr static bool _\bv_\ba_\bl_\bu_\be = ((current & mask) != 0);\n-144 };\n-145\n-146\n-_\b1_\b4_\b8 class _\bD_\be_\bb_\bu_\bg_\bS_\bt_\br_\be_\ba_\bm_\bE_\br_\br_\bo_\br : public _\bI_\bO_\bE_\br_\br_\bo_\br {};\n-149\n-_\b1_\b5_\b0 class _\bS_\bt_\br_\be_\ba_\bm_\bW_\br_\ba_\bp {\n-151 public:\n-_\b1_\b5_\b2 _\bS_\bt_\br_\be_\ba_\bm_\bW_\br_\ba_\bp(std::ostream& _out) : _\bo_\bu_\bt(_out) { }\n-_\b1_\b5_\b3 std::ostream& _\bo_\bu_\bt;\n-_\b1_\b5_\b4 _\bS_\bt_\br_\be_\ba_\bm_\bW_\br_\ba_\bp *_\bn_\be_\bx_\bt;\n-155 };\n-156\n-_\b1_\b5_\b8 class _\bD_\be_\bb_\bu_\bg_\bS_\bt_\br_\be_\ba_\bm_\bS_\bt_\ba_\bt_\be {\n-159 // !!! should be protected somehow but that won't be easy\n-160 public:\n-_\b1_\b6_\b2 _\bS_\bt_\br_\be_\ba_\bm_\bW_\br_\ba_\bp* _\bc_\bu_\br_\br_\be_\bn_\bt;\n-163\n-_\b1_\b6_\b5 bool _\b__\ba_\bc_\bt_\bi_\bv_\be;\n-166\n-_\b1_\b6_\b8 bool _\b__\bt_\bi_\be_\bd;\n-169\n-_\b1_\b7_\b1 unsigned int _\b__\bt_\bi_\be_\bd_\b__\bs_\bt_\br_\be_\ba_\bm_\bs;\n-172 };\n-173\n-188 template <_\bD_\be_\bb_\bu_\bg_\bL_\be_\bv_\be_\bl thislevel = 1,\n-189 _\bD_\be_\bb_\bu_\bg_\bL_\be_\bv_\be_\bl dlevel = 1,\n-190 _\bD_\be_\bb_\bu_\bg_\bL_\be_\bv_\be_\bl alevel = 1,\n-191 template class activator = _\bg_\br_\be_\ba_\bt_\be_\br_\b__\bo_\br_\b__\be_\bq_\bu_\ba_\bl>\n-_\b1_\b9_\b2 class _\bD_\be_\bb_\bu_\bg_\bS_\bt_\br_\be_\ba_\bm : public _\bD_\be_\bb_\bu_\bg_\bS_\bt_\br_\be_\ba_\bm_\bS_\bt_\ba_\bt_\be {\n-193 public:\n-_\b1_\b9_\b9 _\bD_\be_\bb_\bu_\bg_\bS_\bt_\br_\be_\ba_\bm(std::ostream& out = std::cerr) {\n-200 // start a new list of streams\n-201 _\bc_\bu_\br_\br_\be_\bn_\bt = new _\bS_\bt_\br_\be_\ba_\bm_\bW_\br_\ba_\bp(out);\n-202 _\bc_\bu_\br_\br_\be_\bn_\bt->_\bn_\be_\bx_\bt = 0;\n-203\n-204 // check if we are above the default activation level\n-205 _\b__\ba_\bc_\bt_\bi_\bv_\be = activator::value;\n-206\n-207 // we're not tied to another DebugStream\n-208 _\b__\bt_\bi_\be_\bd = false;\n-209\n-210 // no child streams yet\n-211 _\b__\bt_\bi_\be_\bd_\b__\bs_\bt_\br_\be_\ba_\bm_\bs = 0;\n-212 }\n-213\n-_\b2_\b1_\b9 _\bD_\be_\bb_\bu_\bg_\bS_\bt_\br_\be_\ba_\bm (_\bD_\be_\bb_\bu_\bg_\bS_\bt_\br_\be_\ba_\bm_\bS_\bt_\ba_\bt_\be& master,\n-220 std::ostream& fallback = std::cerr)\n+30#include \n+31#include \n+32#include \n+33#include \n+34\n+35#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\ba_\bl_\b._\bh_\bh>\n+36#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bd_\be_\bb_\bu_\bg_\ba_\bl_\bi_\bg_\bn_\b._\bh_\bh>\n+37#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\br_\ba_\bn_\bg_\be_\bu_\bt_\bi_\bl_\bi_\bt_\bi_\be_\bs_\b._\bh_\bh>\n+38#if HAVE_VC\n+39// include Vc part of new simd interface to provide compatibility for\n+40// functionality that has been switched over.\n+41#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bs_\bi_\bm_\bd_\b/_\bv_\bc_\b._\bh_\bh>\n+42#endif\n+43#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bt_\by_\bp_\be_\bt_\br_\ba_\bi_\bt_\bs_\b._\bh_\bh>\n+44#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bv_\bc_\b._\bh_\bh>\n+45\n+46namespace _\bD_\bu_\bn_\be\n+47{\n+48\n+49#if HAVE_VC\n+50 namespace VcImpl {\n+52\n+61 template\n+62 class Proxy\n+63 {\n+64 static_assert(std::is_same >::value, \"Class Proxy \"\n+65 \"may only be instantiated with unqualified types\");\n+66 public:\n+67 using value_type = typename V::value_type;\n+68\n+69 private:\n+70 static_assert(std::is_arithmetic::value,\n+71 \"Only arithmetic types are supported\");\n+72 V &vec_;\n+73 std::size_t idx_;\n+74\n+75 public:\n+76 Proxy(std::size_t idx, V &vec)\n+77 : vec_(vec), idx_(idx)\n+78 { }\n+79\n+80 operator value_type() const { return vec_[idx_]; }\n+81\n+82 // postfix operators\n+83\n+84 template::value> >\n+86 value_type operator++(int) { return vec_[idx_]++; }\n+87 template::value> >\n+89 value_type operator--(int) { return vec_[idx_]--; }\n+90\n+91 // unary (prefix) operators\n+92 template::value> >\n+94 Proxy &operator++() { ++(vec_[idx_]); return *this; }\n+95 template::value> >\n+97 Proxy &operator--() { --(vec_[idx_]); return *this; }\n+98 decltype(auto) operator!() const { return !(vec_[idx_]); }\n+99 decltype(auto) operator+() const { return +(vec_[idx_]); }\n+100 decltype(auto) operator-() const { return -(vec_[idx_]); }\n+101 template::value> >\n+103 decltype(auto) operator~() const { return ~(vec_[idx_]); }\n+104\n+105 // binary operators\n+106#define DUNE_SIMD_VC_BINARY_OP(OP) \\\n+107 template \\\n+108 auto operator OP(T &&o) const \\\n+109 -> decltype(vec_[idx_] OP valueCast(std::forward(o))) \\\n+110 { \\\n+111 return vec_[idx_] OP valueCast(std::forward(o)); \\\n+112 } \\\n+113 static_assert(true, \"Require semicolon to unconfuse editors\")\n+114\n+115 DUNE_SIMD_VC_BINARY_OP(*);\n+116 DUNE_SIMD_VC_BINARY_OP(/);\n+117 DUNE_SIMD_VC_BINARY_OP(%);\n+118\n+119 DUNE_SIMD_VC_BINARY_OP(+);\n+120 DUNE_SIMD_VC_BINARY_OP(-);\n+121\n+122 DUNE_SIMD_VC_BINARY_OP(<<);\n+123 DUNE_SIMD_VC_BINARY_OP(>>);\n+124\n+125 DUNE_SIMD_VC_BINARY_OP(<);\n+126 DUNE_SIMD_VC_BINARY_OP(>);\n+127 DUNE_SIMD_VC_BINARY_OP(<=);\n+128 DUNE_SIMD_VC_BINARY_OP(>=);\n+129\n+130 DUNE_SIMD_VC_BINARY_OP(==);\n+131 DUNE_SIMD_VC_BINARY_OP(!=);\n+132\n+133 DUNE_SIMD_VC_BINARY_OP(&);\n+134 DUNE_SIMD_VC_BINARY_OP(^);\n+135 DUNE_SIMD_VC_BINARY_OP(|);\n+136\n+137 DUNE_SIMD_VC_BINARY_OP(&&);\n+138 DUNE_SIMD_VC_BINARY_OP(||);\n+139#undef DUNE_SIMD_VC_BINARY_OP\n+140\n+141#define DUNE_SIMD_VC_ASSIGNMENT(OP) \\\n+142 template \\\n+143 auto operator OP(T &&o) \\\n+144 -> std::enable_if_t(o)) \\\n+146 )>::value, Proxy&> \\\n+147 { \\\n+148 vec_[idx_] OP valueCast(std::forward(o)); \\\n+149 return *this; \\\n+150 } \\\n+151 static_assert(true, \"Require semicolon to unconfuse editors\")\n+152\n+153 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bV_\bC_\b__\bA_\bS_\bS_\bI_\bG_\bN_\bM_\bE_\bN_\bT(=);\n+154 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bV_\bC_\b__\bA_\bS_\bS_\bI_\bG_\bN_\bM_\bE_\bN_\bT(*=);\n+155 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bV_\bC_\b__\bA_\bS_\bS_\bI_\bG_\bN_\bM_\bE_\bN_\bT(/=);\n+156 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bV_\bC_\b__\bA_\bS_\bS_\bI_\bG_\bN_\bM_\bE_\bN_\bT(%=);\n+157 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bV_\bC_\b__\bA_\bS_\bS_\bI_\bG_\bN_\bM_\bE_\bN_\bT(+=);\n+158 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bV_\bC_\b__\bA_\bS_\bS_\bI_\bG_\bN_\bM_\bE_\bN_\bT(-=);\n+159 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bV_\bC_\b__\bA_\bS_\bS_\bI_\bG_\bN_\bM_\bE_\bN_\bT(<<=);\n+160 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bV_\bC_\b__\bA_\bS_\bS_\bI_\bG_\bN_\bM_\bE_\bN_\bT(>>=);\n+161 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bV_\bC_\b__\bA_\bS_\bS_\bI_\bG_\bN_\bM_\bE_\bN_\bT(&=);\n+162 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bV_\bC_\b__\bA_\bS_\bS_\bI_\bG_\bN_\bM_\bE_\bN_\bT(^=);\n+163 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bV_\bC_\b__\bA_\bS_\bS_\bI_\bG_\bN_\bM_\bE_\bN_\bT(|=);\n+164#undef DUNE_SIMD_VC_ASSIGNMENT\n+165\n+166 // swap on proxies swaps the proxied vector entries. As such, it\n+167 // applies to rvalues of proxies too, not just lvalues\n+168 template\n+169 friend void _\bs_\bw_\ba_\bp(Proxy, Proxy);\n+170\n+171 template\n+172 friend void _\bs_\bw_\ba_\bp(Proxy p1, T& s2)\n+173 {\n+174 // don't use swap() ourselves -- not supported by Vc 1.3.0 (but is\n+175 // supported by Vc 1.3.2)\n+176 T tmp = p1.vec_[p1.idx_];\n+177 p1.vec_[p1.idx_] = s2;\n+178 s2 = tmp;\n+179 }\n+180\n+181 template\n+182 friend void _\bs_\bw_\ba_\bp(T& s1, Proxy p2)\n+183 {\n+184 T tmp = s1;\n+185 s1 = p2.vec_[p2.idx_];\n+186 p2.vec_[p2.idx_] = tmp;\n+187 }\n+188 };\n+189\n+190 template\n+191 void _\bs_\bw_\ba_\bp(Proxy p1, Proxy p2)\n+192 {\n+193 typename V1::value_type tmp = p1.vec_[p1.idx_];\n+194 p1.vec_[p1.idx_] = p2.vec_[p2.idx_];\n+195 p2.vec_[p2.idx_] = tmp;\n+196 }\n+197 } // namespace VcImpl\n+198#endif // HAVE_VC\n+199\n+200 template\n+_\b2_\b0_\b1 struct _\bS_\bi_\bm_\bd_\bS_\bc_\ba_\bl_\ba_\br_\bT_\by_\bp_\be_\bT_\br_\ba_\bi_\bt_\bs\n+202 {\n+_\b2_\b0_\b3 using _\bt_\by_\bp_\be = T;\n+204 };\n+205\n+206 template\n+_\b2_\b0_\b7 using _\bS_\bi_\bm_\bd_\bS_\bc_\ba_\bl_\ba_\br = typename _\bS_\bi_\bm_\bd_\bS_\bc_\ba_\bl_\ba_\br_\bT_\by_\bp_\be_\bT_\br_\ba_\bi_\bt_\bs_\b<_\bT_\b>_\b:_\b:_\bt_\by_\bp_\be;\n+208\n+209#if HAVE_VC\n+210 /*\n+211 Add Vc specializations for the SimdScalarTypeTraits trais class\n+212 */\n+213 template\n+214 struct _\bS_\bi_\bm_\bd_\bS_\bc_\ba_\bl_\ba_\br_\bT_\by_\bp_\be_\bT_\br_\ba_\bi_\bt_\bs< Vc::Vector >\n+215 {\n+216 using _\bt_\by_\bp_\be = T;\n+217 };\n+218\n+219 template\n+220 struct SimdScalarTypeTraits< Vc::SimdArray >\n 221 {\n-222 // start a new list of streams\n-223 _\bc_\bu_\br_\br_\be_\bn_\bt = new _\bS_\bt_\br_\be_\ba_\bm_\bW_\br_\ba_\bp(fallback);\n-224 _\bc_\bu_\br_\br_\be_\bn_\bt->_\bn_\be_\bx_\bt = 0;\n+222 using _\bt_\by_\bp_\be = T;\n+223 };\n+224#endif // HAVE_VC\n 225\n-226 // check if we are above the default activation level\n-227 _\b__\ba_\bc_\bt_\bi_\bv_\be = activator::value;\n-228 _\b__\bt_\bi_\be_\bd_\b__\bs_\bt_\br_\be_\ba_\bm_\bs = 0;\n-229\n-230 // tie to the provided stream\n-231 _\b__\bt_\bi_\be_\bd = true;\n-232 tiedstate = &master;\n-233 tiedstate->_\b__\bt_\bi_\be_\bd_\b__\bs_\bt_\br_\be_\ba_\bm_\bs++;\n-234 }\n-235\n-_\b2_\b4_\b3 _\b~_\bD_\be_\bb_\bu_\bg_\bS_\bt_\br_\be_\ba_\bm()\n-244 {\n-245 // untie\n-246 if (_\b__\bt_\bi_\be_\bd)\n-247 tiedstate->_\b__\bt_\bi_\be_\bd_\b__\bs_\bt_\br_\be_\ba_\bm_\bs--;\n-248 else {\n-249 // check if somebody still ties to us...\n-250 if (_\b__\bt_\bi_\be_\bd_\b__\bs_\bt_\br_\be_\ba_\bm_\bs != 0)\n-251 {\n-252 std::cerr << \"DebugStream destructor is called while other streams are\n-still tied to it. Terminating!\" << std::endl;\n-253 std::terminate();\n-254 }\n-255 }\n-256\n-257 // remove ostream-stack\n-258 while (_\bc_\bu_\br_\br_\be_\bn_\bt != 0) {\n-259 _\bS_\bt_\br_\be_\ba_\bm_\bW_\br_\ba_\bp *s = _\bc_\bu_\br_\br_\be_\bn_\bt;\n-260 _\bc_\bu_\br_\br_\be_\bn_\bt = _\bc_\bu_\br_\br_\be_\bn_\bt->_\bn_\be_\bx_\bt;\n-261 delete s;\n-262 }\n-263 }\n+227 template\n+_\b2_\b2_\b8 struct _\bS_\bi_\bm_\bd_\bS_\bc_\ba_\bl_\ba_\br_\bT_\by_\bp_\be_\bT_\br_\ba_\bi_\bt_\bs< _\bA_\bl_\bi_\bg_\bn_\be_\bd_\bN_\bu_\bm_\bb_\be_\br >\n+229 {\n+_\b2_\b3_\b0 using _\bt_\by_\bp_\be = T;\n+231 };\n+232\n+233 template\n+_\b2_\b3_\b4 struct _\bS_\bi_\bm_\bd_\bI_\bn_\bd_\be_\bx_\bT_\by_\bp_\be_\bT_\br_\ba_\bi_\bt_\bs {\n+_\b2_\b3_\b5 using _\bt_\by_\bp_\be = std::size_t;\n+236 };\n+237\n+239\n+245 template\n+_\b2_\b4_\b6 using _\bS_\bi_\bm_\bd_\bI_\bn_\bd_\be_\bx = typename _\bS_\bi_\bm_\bd_\bI_\bn_\bd_\be_\bx_\bT_\by_\bp_\be_\bT_\br_\ba_\bi_\bt_\bs_\b<_\bV_\b>_\b:_\b:_\bt_\by_\bp_\be;\n+247\n+248#if HAVE_VC\n+249 template\n+250 struct _\bS_\bi_\bm_\bd_\bI_\bn_\bd_\be_\bx_\bT_\by_\bp_\be_\bT_\br_\ba_\bi_\bt_\bs > {\n+251 using _\bt_\by_\bp_\be = typename Vc::Vector::index_type;\n+252 };\n+253\n+254 template\n+255 struct SimdIndexTypeTraits > {\n+256 using _\bt_\by_\bp_\be = typename Vc::SimdArray::index_type;\n+257 };\n+258#endif // HAVE_VC\n+259\n+260 template\n+_\b2_\b6_\b1 struct _\bS_\bi_\bm_\bd_\bM_\ba_\bs_\bk_\bT_\by_\bp_\be_\bT_\br_\ba_\bi_\bt_\bs {\n+_\b2_\b6_\b2 using _\bt_\by_\bp_\be = bool;\n+263 };\n 264\n-266 template \n-_\b2_\b6_\b7 _\bD_\be_\bb_\bu_\bg_\bS_\bt_\br_\be_\ba_\bm& _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b<_\b<(const T data) {\n-268 // remove the following code if stream wasn't compiled active\n-269 if (activator::value) {\n-270 if (! _\b__\bt_\bi_\be_\bd) {\n-271 if (_\b__\ba_\bc_\bt_\bi_\bv_\be)\n-272 _\bc_\bu_\br_\br_\be_\bn_\bt->_\bo_\bu_\bt << data;\n-273 } else {\n-274 if (_\b__\ba_\bc_\bt_\bi_\bv_\be && tiedstate->_\b__\ba_\bc_\bt_\bi_\bv_\be)\n-275 tiedstate->_\bc_\bu_\br_\br_\be_\bn_\bt->_\bo_\bu_\bt << data;\n-276 }\n-277 }\n-278\n-279 return *this;\n-280 }\n-281\n-_\b2_\b8_\b9 _\bD_\be_\bb_\bu_\bg_\bS_\bt_\br_\be_\ba_\bm& _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b<_\b<(const int data) {\n-290 // remove the following code if stream wasn't compiled active\n-291 if (activator::value) {\n-292 if (! _\b__\bt_\bi_\be_\bd) {\n-293 if (_\b__\ba_\bc_\bt_\bi_\bv_\be)\n-294 _\bc_\bu_\br_\br_\be_\bn_\bt->_\bo_\bu_\bt << data;\n-295 } else {\n-296 if (_\b__\ba_\bc_\bt_\bi_\bv_\be && tiedstate->_\b__\ba_\bc_\bt_\bi_\bv_\be)\n-297 tiedstate->_\bc_\bu_\br_\br_\be_\bn_\bt->_\bo_\bu_\bt << data;\n-298 }\n-299 }\n-300\n-301 return *this;\n+266\n+269 template\n+_\b2_\b7_\b0 using _\bS_\bi_\bm_\bd_\bM_\ba_\bs_\bk = typename _\bS_\bi_\bm_\bd_\bM_\ba_\bs_\bk_\bT_\by_\bp_\be_\bT_\br_\ba_\bi_\bt_\bs_\b<_\bV_\b>_\b:_\b:_\bt_\by_\bp_\be;\n+271\n+272#if HAVE_VC\n+273 template\n+274 struct _\bS_\bi_\bm_\bd_\bM_\ba_\bs_\bk_\bT_\by_\bp_\be_\bT_\br_\ba_\bi_\bt_\bs > {\n+275 using _\bt_\by_\bp_\be = typename Vc::Vector::mask_type;\n+276 };\n+277\n+278 template\n+279 struct SimdMaskTypeTraits > {\n+280 using _\bt_\by_\bp_\be = typename Vc::SimdArray::mask_type;\n+281 };\n+282#endif // HAVE_VC\n+283\n+284#if HAVE_VC\n+285 /*\n+286 Add Vc specializations for cond(), see conditional.hh\n+287 */\n+288 template\n+289 Vc::Vector _\bc_\bo_\bn_\bd(const Vc::Mask & b,\n+290 const Vc::Vector & v1,\n+291 const Vc::Vector & v2)\n+292 {\n+293 return std::move(Vc::iif(b, v1, v2));\n+294 }\n+295\n+296 template\n+297 Vc::SimdArray _\bc_\bo_\bn_\bd(const typename Vc::SimdArray::\n+mask_type & b,\n+298 const Vc::SimdArray & v1,\n+299 const Vc::SimdArray & v2)\n+300 {\n+301 return std::move(Vc::iif(b, v1, v2));\n 302 }\n-303\n-_\b3_\b0_\b5 _\bD_\be_\bb_\bu_\bg_\bS_\bt_\br_\be_\ba_\bm& _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b<_\b<(std::ostream& (*f)(std::ostream&)) {\n-306 if (activator::value) {\n-307 if (! _\b__\bt_\bi_\be_\bd) {\n-308 if (_\b__\ba_\bc_\bt_\bi_\bv_\be)\n-309 f(_\bc_\bu_\br_\br_\be_\bn_\bt->_\bo_\bu_\bt);\n-310 } else {\n-311 if (_\b__\ba_\bc_\bt_\bi_\bv_\be && tiedstate->_\b__\ba_\bc_\bt_\bi_\bv_\be)\n-312 f(tiedstate->_\bc_\bu_\br_\br_\be_\bn_\bt->_\bo_\bu_\bt);\n-313 }\n-314 }\n-315\n-316 return *this;\n-317 }\n-318\n-_\b3_\b2_\b0 _\bD_\be_\bb_\bu_\bg_\bS_\bt_\br_\be_\ba_\bm& _\bf_\bl_\bu_\bs_\bh() {\n-321 if (activator::value) {\n-322 if (! _\b__\bt_\bi_\be_\bd) {\n-323 if (_\b__\ba_\bc_\bt_\bi_\bv_\be)\n-324 _\bc_\bu_\br_\br_\be_\bn_\bt->_\bo_\bu_\bt.flush();\n-325 } else {\n-326 if (_\b__\ba_\bc_\bt_\bi_\bv_\be && tiedstate->_\b__\ba_\bc_\bt_\bi_\bv_\be)\n-327 tiedstate->_\bc_\bu_\br_\br_\be_\bn_\bt->_\bo_\bu_\bt.flush();\n-328 }\n-329 }\n-330\n-331 return *this;\n-332 }\n-333\n-_\b3_\b3_\b5 void _\bp_\bu_\bs_\bh(bool b) {\n-336 // are we at all active?\n-337 if (activator::value) {\n-338 _actstack.push(_\b__\ba_\bc_\bt_\bi_\bv_\be);\n-339 _\b__\ba_\bc_\bt_\bi_\bv_\be = b;\n-340 } else {\n-341 // stay off\n-342 _actstack.push(false);\n-343 }\n-344 }\n-345\n-_\b3_\b4_\b9 void _\bp_\bo_\bp() {\n-350 if (_actstack.empty())\n-351 _\bD_\bU_\bN_\bE_\b__\bT_\bH_\bR_\bO_\bW(_\bD_\be_\bb_\bu_\bg_\bS_\bt_\br_\be_\ba_\bm_\bE_\br_\br_\bo_\br, \"No previous activation setting!\");\n+303#endif // HAVE_VC\n+304\n+305#if HAVE_VC\n+306 /*\n+307 Add Vc specializations for several boolean operations, see\n+rangeutitlities.hh:\n+308\n+309 max_value, min_value, any_true, all_true\n+310 */\n+311 template\n+312 T _\bm_\ba_\bx_\b__\bv_\ba_\bl_\bu_\be(const Vc::Vector & v)\n+313 {\n+314 return v.max();\n+315 }\n+316\n+317 template\n+318 double _\bm_\ba_\bx_\b__\bv_\ba_\bl_\bu_\be(const Vc::SimdArray & v)\n+319 {\n+320 return v.max();\n+321 }\n+322\n+323 template\n+324 T _\bm_\bi_\bn_\b__\bv_\ba_\bl_\bu_\be(const Vc::Vector & v)\n+325 {\n+326 return v.min();\n+327 }\n+328\n+329 template\n+330 double _\bm_\bi_\bn_\b__\bv_\ba_\bl_\bu_\be(const Vc::SimdArray & v)\n+331 {\n+332 return v.min();\n+333 }\n+334\n+335 template\n+336 bool _\ba_\bn_\by_\b__\bt_\br_\bu_\be(const Vc::Mask & v)\n+337 {\n+338 return Vc::any_of(v);\n+339 }\n+340\n+341 template\n+342 bool _\ba_\bn_\by_\b__\bt_\br_\bu_\be(const Vc::SimdMaskArray & v)\n+343 {\n+344 return Vc::any_of(v);\n+345 }\n+346\n+347 template\n+348 bool _\ba_\bl_\bl_\b__\bt_\br_\bu_\be(const Vc::Mask & v)\n+349 {\n+350 return Vc::all_of(v);\n+351 }\n 352\n-353 _\b__\ba_\bc_\bt_\bi_\bv_\be = _actstack.top();\n-354 _actstack.pop();\n-355 }\n-356\n-_\b3_\b6_\b3 bool _\ba_\bc_\bt_\bi_\bv_\be() const {\n-364 return activator::value && _\b__\ba_\bc_\bt_\bi_\bv_\be;\n-365 }\n-366\n-_\b3_\b7_\b1 void _\ba_\bt_\bt_\ba_\bc_\bh(std::ostream& stream) {\n-372 if (_\b__\bt_\bi_\be_\bd)\n-373 _\bD_\bU_\bN_\bE_\b__\bT_\bH_\bR_\bO_\bW(_\bD_\be_\bb_\bu_\bg_\bS_\bt_\br_\be_\ba_\bm_\bE_\br_\br_\bo_\br, \"Cannot attach to a tied stream!\");\n-374\n-375 _\bS_\bt_\br_\be_\ba_\bm_\bW_\br_\ba_\bp* newcurr = new _\bS_\bt_\br_\be_\ba_\bm_\bW_\br_\ba_\bp(stream);\n-376 newcurr->_\bn_\be_\bx_\bt = _\bc_\bu_\br_\br_\be_\bn_\bt;\n-377 _\bc_\bu_\br_\br_\be_\bn_\bt = newcurr;\n+353 template\n+354 bool _\ba_\bl_\bl_\b__\bt_\br_\bu_\be(const Vc::SimdMaskArray & v)\n+355 {\n+356 return Vc::all_of(v);\n+357 }\n+358#endif // HAVE_VC\n+359\n+361 template\n+_\b3_\b6_\b2 std::size_t _\bl_\ba_\bn_\be_\bs(const T &) { return 1; }\n+363\n+365 template\n+_\b3_\b6_\b6 T _\bl_\ba_\bn_\be(std::size_t l, const T &v)\n+367 {\n+368 assert(l == 0);\n+369 return v;\n+370 }\n+371\n+373 template\n+_\b3_\b7_\b4 T &_\bl_\ba_\bn_\be(std::size_t l, T &v)\n+375 {\n+376 assert(l == 0);\n+377 return v;\n 378 }\n 379\n-_\b3_\b8_\b3 void _\bd_\be_\bt_\ba_\bc_\bh() {\n-384 if (_\bc_\bu_\br_\br_\be_\bn_\bt->_\bn_\be_\bx_\bt == 0)\n-385 _\bD_\bU_\bN_\bE_\b__\bT_\bH_\bR_\bO_\bW(_\bD_\be_\bb_\bu_\bg_\bS_\bt_\br_\be_\ba_\bm_\bE_\br_\br_\bo_\br, \"Cannot detach initial stream!\");\n-386 if (_\b__\bt_\bi_\be_\bd)\n-387 _\bD_\bU_\bN_\bE_\b__\bT_\bH_\bR_\bO_\bW(_\bD_\be_\bb_\bu_\bg_\bS_\bt_\br_\be_\ba_\bm_\bE_\br_\br_\bo_\br, \"Cannot detach a tied stream!\");\n-388\n-389 _\bS_\bt_\br_\be_\ba_\bm_\bW_\br_\ba_\bp* old = _\bc_\bu_\br_\br_\be_\bn_\bt;\n-390 _\bc_\bu_\br_\br_\be_\bn_\bt = _\bc_\bu_\br_\br_\be_\bn_\bt->_\bn_\be_\bx_\bt;\n-391 delete old;\n+380#if HAVE_VC\n+381 template\n+382 std::size_t _\bl_\ba_\bn_\be_\bs(const Vc::Vector &)\n+383 {\n+384 return Vc::Vector::size();\n+385 }\n+386\n+387 template\n+388 T _\bl_\ba_\bn_\be(std::size_t l, const Vc::Vector &v)\n+389 {\n+390 assert(l < _\bl_\ba_\bn_\be_\bs(v));\n+391 return v[l];\n 392 }\n 393\n-_\b3_\b9_\b7 void _\bt_\bi_\be(_\bD_\be_\bb_\bu_\bg_\bS_\bt_\br_\be_\ba_\bm_\bS_\bt_\ba_\bt_\be& to) {\n-398 if (to._\b__\bt_\bi_\be_\bd)\n-399 _\bD_\bU_\bN_\bE_\b__\bT_\bH_\bR_\bO_\bW(_\bD_\be_\bb_\bu_\bg_\bS_\bt_\br_\be_\ba_\bm_\bE_\br_\br_\bo_\br, \"Cannot tie to an already tied stream!\");\n-400 if (_\b__\bt_\bi_\be_\bd)\n-401 _\bD_\bU_\bN_\bE_\b__\bT_\bH_\bR_\bO_\bW(_\bD_\be_\bb_\bu_\bg_\bS_\bt_\br_\be_\ba_\bm_\bE_\br_\br_\bo_\br, \"Stream already tied: untie first!\");\n-402\n-403 _\b__\bt_\bi_\be_\bd = true;\n-404 tiedstate = &to;\n-405\n-406 // tell master class\n-407 tiedstate->_\b__\bt_\bi_\be_\bd_\b__\bs_\bt_\br_\be_\ba_\bm_\bs++;\n-408 }\n-409\n-_\b4_\b1_\b3 void _\bu_\bn_\bt_\bi_\be() {\n-414 if(! _\b__\bt_\bi_\be_\bd)\n-415 _\bD_\bU_\bN_\bE_\b__\bT_\bH_\bR_\bO_\bW(_\bD_\be_\bb_\bu_\bg_\bS_\bt_\br_\be_\ba_\bm_\bE_\br_\br_\bo_\br, \"Cannot untie, stream is not tied!\");\n-416\n-417 tiedstate->_\b__\bt_\bi_\be_\bd_\b__\bs_\bt_\br_\be_\ba_\bm_\bs--;\n-418 _\b__\bt_\bi_\be_\bd = false;\n-419 tiedstate = 0;\n-420 }\n-421\n-422 private:\n-424 _\bD_\be_\bb_\bu_\bg_\bS_\bt_\br_\be_\ba_\bm_\bS_\bt_\ba_\bt_\be* tiedstate;\n-425\n-430 std::stack _actstack;\n-431 };\n-432\n-434}\n-435\n-436\n-437#endif\n-_\be_\bx_\bc_\be_\bp_\bt_\bi_\bo_\bn_\bs_\b._\bh_\bh\n-A few common exception classes.\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bt_\br_\be_\ba_\bm_\bW_\br_\ba_\bp_\b:_\b:_\bS_\bt_\br_\be_\ba_\bm_\bW_\br_\ba_\bp\n-StreamWrap(std::ostream &_out)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn debugstream.hh:152\n-_\bD_\bu_\bn_\be_\b:_\b:_\bD_\be_\bb_\bu_\bg_\bS_\bt_\br_\be_\ba_\bm_\b:_\b:_\bD_\be_\bb_\bu_\bg_\bS_\bt_\br_\be_\ba_\bm\n-DebugStream(std::ostream &out=std::cerr)\n-Create a DebugStream and set initial output stream.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn debugstream.hh:199\n-_\bD_\bu_\bn_\be_\b:_\b:_\bD_\be_\bb_\bu_\bg_\bS_\bt_\br_\be_\ba_\bm_\b:_\b:_\bu_\bn_\bt_\bi_\be\n-void untie()\n-Untie stream.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn debugstream.hh:413\n-_\bD_\bu_\bn_\be_\b:_\b:_\bD_\be_\bb_\bu_\bg_\bS_\bt_\br_\be_\ba_\bm_\b:_\b:_\bf_\bl_\bu_\bs_\bh\n-DebugStream & flush()\n-pass on flush to underlying output stream\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn debugstream.hh:320\n-_\bD_\bu_\bn_\be_\b:_\b:_\bD_\be_\bb_\bu_\bg_\bS_\bt_\br_\be_\ba_\bm_\b:_\b:_\ba_\bt_\bt_\ba_\bc_\bh\n-void attach(std::ostream &stream)\n-set output to a different stream.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn debugstream.hh:371\n-_\bD_\bu_\bn_\be_\b:_\b:_\bD_\be_\bb_\bu_\bg_\bS_\bt_\br_\be_\ba_\bm_\b:_\b:_\bd_\be_\bt_\ba_\bc_\bh\n-void detach()\n-detach current output stream and restore to previous stream\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn debugstream.hh:383\n-_\bD_\bu_\bn_\be_\b:_\b:_\bc_\bo_\bm_\bm_\bo_\bn_\b__\bb_\bi_\bt_\bs_\b:_\b:_\bv_\ba_\bl_\bu_\be\n-static constexpr bool value\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn debugstream.hh:143\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bt_\br_\be_\ba_\bm_\bW_\br_\ba_\bp_\b:_\b:_\bo_\bu_\bt\n-std::ostream & out\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn debugstream.hh:153\n-_\bD_\bu_\bn_\be_\b:_\b:_\bD_\be_\bb_\bu_\bg_\bS_\bt_\br_\be_\ba_\bm_\b:_\b:_\bp_\bo_\bp\n-void pop()\n-restore previously set activation flag\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn debugstream.hh:349\n-_\bD_\bu_\bn_\be_\b:_\b:_\bD_\be_\bb_\bu_\bg_\bS_\bt_\br_\be_\ba_\bm_\b:_\b:_\ba_\bc_\bt_\bi_\bv_\be\n-bool active() const\n-reports if this stream will produce output\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn debugstream.hh:363\n-_\bD_\bu_\bn_\be_\b:_\b:_\bD_\be_\bb_\bu_\bg_\bS_\bt_\br_\be_\ba_\bm_\bS_\bt_\ba_\bt_\be_\b:_\b:_\b__\ba_\bc_\bt_\bi_\bv_\be\n-bool _active\n-flag to switch output during runtime\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn debugstream.hh:165\n-_\bD_\bu_\bn_\be_\b:_\b:_\bD_\be_\bb_\bu_\bg_\bS_\bt_\br_\be_\ba_\bm_\bS_\bt_\ba_\bt_\be_\b:_\b:_\b__\bt_\bi_\be_\bd_\b__\bs_\bt_\br_\be_\ba_\bm_\bs\n-unsigned int _tied_streams\n-how many streams are tied to this state\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn debugstream.hh:171\n-_\bD_\bu_\bn_\be_\b:_\b:_\bD_\be_\bb_\bu_\bg_\bS_\bt_\br_\be_\ba_\bm_\b:_\b:_\bt_\bi_\be\n-void tie(DebugStreamState &to)\n-Tie a stream to this one.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn debugstream.hh:397\n-_\bD_\bu_\bn_\be_\b:_\b:_\bD_\be_\bb_\bu_\bg_\bS_\bt_\br_\be_\ba_\bm_\b:_\b:_\bp_\bu_\bs_\bh\n-void push(bool b)\n-set activation flag and store old value\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn debugstream.hh:335\n-_\bD_\bu_\bn_\be_\b:_\b:_\bD_\be_\bb_\bu_\bg_\bL_\be_\bv_\be_\bl\n-unsigned int DebugLevel\n-Type for debug levels.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn debugstream.hh:118\n-_\bD_\bu_\bn_\be_\b:_\b:_\bD_\be_\bb_\bu_\bg_\bS_\bt_\br_\be_\ba_\bm_\bS_\bt_\ba_\bt_\be_\b:_\b:_\b__\bt_\bi_\be_\bd\n-bool _tied\n-are we tied to another DebugStream?\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn debugstream.hh:168\n-_\bD_\bu_\bn_\be_\b:_\b:_\bD_\be_\bb_\bu_\bg_\bS_\bt_\br_\be_\ba_\bm_\bS_\bt_\ba_\bt_\be_\b:_\b:_\bc_\bu_\br_\br_\be_\bn_\bt\n-StreamWrap * current\n-current output stream and link to possibly pushed old output streams\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn debugstream.hh:162\n-_\bD_\bu_\bn_\be_\b:_\b:_\bD_\be_\bb_\bu_\bg_\bS_\bt_\br_\be_\ba_\bm_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b<_\b<\n-DebugStream & operator<<(const T data)\n-Generic types are passed on to current output stream.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn debugstream.hh:267\n-_\bD_\bu_\bn_\be_\b:_\b:_\bg_\br_\be_\ba_\bt_\be_\br_\b__\bo_\br_\b__\be_\bq_\bu_\ba_\bl_\b:_\b:_\bv_\ba_\bl_\bu_\be\n-static constexpr bool value\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn debugstream.hh:131\n-_\bD_\bu_\bn_\be_\b:_\b:_\bD_\be_\bb_\bu_\bg_\bS_\bt_\br_\be_\ba_\bm_\b:_\b:_\b~_\bD_\be_\bb_\bu_\bg_\bS_\bt_\br_\be_\ba_\bm\n-~DebugStream()\n-Destroy stream.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn debugstream.hh:243\n-_\bD_\bu_\bn_\be_\b:_\b:_\bD_\be_\bb_\bu_\bg_\bS_\bt_\br_\be_\ba_\bm_\b:_\b:_\bD_\be_\bb_\bu_\bg_\bS_\bt_\br_\be_\ba_\bm\n-DebugStream(DebugStreamState &master, std::ostream &fallback=std::cerr)\n-Create a DebugStream and directly tie to another DebugStream.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn debugstream.hh:219\n-_\bD_\bu_\bn_\be_\b:_\b:_\bD_\be_\bb_\bu_\bg_\bS_\bt_\br_\be_\ba_\bm_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b<_\b<\n-DebugStream & operator<<(const int data)\n-explicit specialization so that enums can be printed\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn debugstream.hh:289\n-_\bD_\bu_\bn_\be_\b:_\b:_\bD_\be_\bb_\bu_\bg_\bS_\bt_\br_\be_\ba_\bm_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b<_\b<\n-DebugStream & operator<<(std::ostream &(*f)(std::ostream &))\n-pass on manipulators to underlying output stream\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn debugstream.hh:305\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bt_\br_\be_\ba_\bm_\bW_\br_\ba_\bp_\b:_\b:_\bn_\be_\bx_\bt\n-StreamWrap * next\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn debugstream.hh:154\n-_\bD_\bU_\bN_\bE_\b__\bT_\bH_\bR_\bO_\bW\n-#define DUNE_THROW(E, m)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn exceptions.hh:218\n+394 template\n+395 auto _\bl_\ba_\bn_\be(std::size_t l, Vc::Vector &v)\n+396 {\n+397 assert(l < _\bl_\ba_\bn_\be_\bs(v));\n+398 return VcImpl::Proxy >{l, v};\n+399 }\n+400\n+401 template\n+402 std::size_t _\bl_\ba_\bn_\be_\bs(const Vc::SimdArray &)\n+403 {\n+404 return n;\n+405 }\n+406\n+407 template\n+408 T _\bl_\ba_\bn_\be(std::size_t l, const Vc::SimdArray &v)\n+409 {\n+410 assert(l < n);\n+411 return v[l];\n+412 }\n+413\n+414 template\n+415 auto _\bl_\ba_\bn_\be(std::size_t l, Vc::SimdArray &v)\n+416 {\n+417 assert(l < n);\n+418 return VcImpl::Proxy >{l, v};\n+419 }\n+420\n+421 template\n+422 std::size_t _\bl_\ba_\bn_\be_\bs(const Vc::SimdMaskArray &)\n+423 {\n+424 return n;\n+425 }\n+426\n+427 template\n+428 bool _\bl_\ba_\bn_\be(std::size_t l, const Vc::SimdMaskArray &v)\n+429 {\n+430 assert(l < n);\n+431 return v[l];\n+432 }\n+433\n+434 template\n+435 auto _\bl_\ba_\bn_\be(std::size_t l, Vc::SimdMaskArray &v)\n+436 {\n+437 assert(l < n);\n+438 return VcImpl::Proxy >{l, v};\n+439 }\n+440#endif // HAVE_VC\n+441\n+443\n+446 template\n+_\b4_\b4_\b7 void _\ba_\bs_\bs_\bi_\bg_\bn(T &dst, const T &src, bool mask)\n+448 {\n+449 if(mask) dst = src;\n+450 }\n+451\n+452#if HAVE_VC\n+453 /*\n+454 Add Vc specializations for masked assignment\n+455 */\n+456 template\n+457 void _\ba_\bs_\bs_\bi_\bg_\bn(Vc::Vector &dst, const Vc::Vector &src,\n+458 typename Vc::Vector::mask_type mask)\n+459 {\n+460 dst(mask) = src;\n+461 }\n+462\n+463 template\n+464 void _\ba_\bs_\bs_\bi_\bg_\bn(Vc::SimdArray &dst, const Vc::SimdArray &src,\n+465 typename Vc::SimdArray::mask_type mask)\n+466 {\n+467 dst(mask) = src;\n+468 }\n+469#endif // HAVE_VC\n+470\n+471 template\n+_\b4_\b7_\b2 void _\bs_\bw_\ba_\bp(T &v1, T &v2, bool mask)\n+473 {\n+474 using std::swap;\n+475 if(mask) _\bs_\bw_\ba_\bp(v1, v2);\n+476 }\n+477\n+478#if HAVE_VC\n+479 /*\n+480 Add Vc specializations for masked swap\n+481 */\n+482 template\n+483 void _\bs_\bw_\ba_\bp(Vc::Vector &v1, Vc::Vector &v2,\n+484 typename Vc::Vector::mask_type mask)\n+485 {\n+486 auto tmp = v1;\n+487 v1(mask) = v2;\n+488 v2(mask) = tmp;\n+489 }\n+490\n+491 template\n+492 void _\bs_\bw_\ba_\bp(Vc::SimdArray &v1, Vc::SimdArray &v2,\n+493 typename Vc::SimdArray::mask_type mask)\n+494 {\n+495 auto tmp = v1;\n+496 v1(mask) = v2;\n+497 v2(mask) = tmp;\n+498 }\n+499#endif // HAVE_VC\n+500\n+501} // end namespace Dune\n+502\n+503#endif // DUNE_COMMON_SIMD_HH\n+_\br_\ba_\bn_\bg_\be_\bu_\bt_\bi_\bl_\bi_\bt_\bi_\be_\bs_\b._\bh_\bh\n+Utilities for reduction like operations on ranges.\n+_\bt_\by_\bp_\be_\bt_\br_\ba_\bi_\bt_\bs_\b._\bh_\bh\n+Traits for type conversions and type information.\n+_\bv_\bc_\b._\bh_\bh\n+Compatibility header for including \n+_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\ba_\bl_\b._\bh_\bh\n+_\bd_\be_\bb_\bu_\bg_\ba_\bl_\bi_\bg_\bn_\b._\bh_\bh\n _\bD_\bu_\bn_\be\n Dune namespace.\n D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn alignedallocator.hh:13\n-_\bD_\bu_\bn_\be_\b:_\b:_\bg_\br_\be_\ba_\bt_\be_\br_\b__\bo_\br_\b__\be_\bq_\bu_\ba_\bl\n-Greater or equal template test.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn debugstream.hh:130\n-_\bD_\bu_\bn_\be_\b:_\b:_\bc_\bo_\bm_\bm_\bo_\bn_\b__\bb_\bi_\bt_\bs\n-activate if current and mask have common bits switched on.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn debugstream.hh:142\n-_\bD_\bu_\bn_\be_\b:_\b:_\bD_\be_\bb_\bu_\bg_\bS_\bt_\br_\be_\ba_\bm_\bE_\br_\br_\bo_\br\n-standard exception for the debugstream\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn debugstream.hh:148\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bt_\br_\be_\ba_\bm_\bW_\br_\ba_\bp\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn debugstream.hh:150\n-_\bD_\bu_\bn_\be_\b:_\b:_\bD_\be_\bb_\bu_\bg_\bS_\bt_\br_\be_\ba_\bm_\bS_\bt_\ba_\bt_\be\n-Intermediate class to implement tie-operation of DebugStream.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn debugstream.hh:158\n-_\bD_\bu_\bn_\be_\b:_\b:_\bD_\be_\bb_\bu_\bg_\bS_\bt_\br_\be_\ba_\bm\n-Generic class to implement debug output streams.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn debugstream.hh:192\n-_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bO_\bE_\br_\br_\bo_\br\n-Default exception class for I/O errors.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn exceptions.hh:231\n+_\bD_\bu_\bn_\be_\b:_\b:_\ba_\bn_\by_\b__\bt_\br_\bu_\be\n+bool any_true(const AlignedNumber< bool, align > &val)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn debugalign.hh:506\n+_\bD_\bu_\bn_\be_\b:_\b:_\ba_\bl_\bl_\b__\bt_\br_\bu_\be\n+bool all_true(const AlignedNumber< bool, align > &val)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn debugalign.hh:512\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bi_\bm_\bd_\bI_\bn_\bd_\be_\bx\n+typename SimdIndexTypeTraits< V >::type SimdIndex\n+An simd vector of indices corresponding to a simd vector V.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn simd.hh:246\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bi_\bm_\bd_\bS_\bc_\ba_\bl_\ba_\br\n+typename SimdScalarTypeTraits< T >::type SimdScalar\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn simd.hh:207\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bi_\bm_\bd_\bM_\ba_\bs_\bk\n+typename SimdMaskTypeTraits< V >::type SimdMask\n+A simd vector of truth values corresponding to a simd vector V.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn simd.hh:270\n+_\bD_\bu_\bn_\be_\b:_\b:_\bl_\ba_\bn_\be\n+T lane(std::size_t l, const T &v)\n+access a lane of a simd vector (scalar version)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn simd.hh:366\n+_\bD_\bu_\bn_\be_\b:_\b:_\bs_\bw_\ba_\bp\n+void swap(T &v1, T &v2, bool mask)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn simd.hh:472\n+_\bD_\bu_\bn_\be_\b:_\b:_\ba_\bs_\bs_\bi_\bg_\bn\n+void assign(T &dst, const T &src, bool mask)\n+masked Simd assignment (scalar version)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn simd.hh:447\n+_\bD_\bu_\bn_\be_\b:_\b:_\bc_\bo_\bn_\bd\n+const T1 cond(bool b, const T1 &v1, const T2 &v2)\n+conditional evaluate\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn conditional.hh:28\n+_\bD_\bu_\bn_\be_\b:_\b:_\bm_\ba_\bx_\b__\bv_\ba_\bl_\bu_\be\n+T max_value(const AlignedNumber< T, align > &val)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn debugalign.hh:494\n+_\bD_\bu_\bn_\be_\b:_\b:_\bm_\bi_\bn_\b__\bv_\ba_\bl_\bu_\be\n+T min_value(const AlignedNumber< T, align > &val)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn debugalign.hh:500\n+_\bD_\bu_\bn_\be_\b:_\b:_\bl_\ba_\bn_\be_\bs\n+std::size_t lanes(const T &)\n+get the number of lanes of a simd vector (scalar version)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn simd.hh:362\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bl_\bi_\bg_\bn_\be_\bd_\bN_\bu_\bm_\bb_\be_\br_\bI_\bm_\bp_\bl_\b:_\b:_\bA_\bl_\bi_\bg_\bn_\be_\bd_\bN_\bu_\bm_\bb_\be_\br\n+aligned wrappers for arithmetic types\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn debugalign.hh:128\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bi_\bm_\bd_\bS_\bc_\ba_\bl_\ba_\br_\bT_\by_\bp_\be_\bT_\br_\ba_\bi_\bt_\bs\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn simd.hh:202\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bi_\bm_\bd_\bS_\bc_\ba_\bl_\ba_\br_\bT_\by_\bp_\be_\bT_\br_\ba_\bi_\bt_\bs_\b:_\b:_\bt_\by_\bp_\be\n+T type\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn simd.hh:203\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bi_\bm_\bd_\bS_\bc_\ba_\bl_\ba_\br_\bT_\by_\bp_\be_\bT_\br_\ba_\bi_\bt_\bs_\b<_\b _\bA_\bl_\bi_\bg_\bn_\be_\bd_\bN_\bu_\bm_\bb_\be_\br_\b<_\b _\bT_\b,_\b _\ba_\bl_\bi_\bg_\bn_\b _\b>_\b _\b>_\b:_\b:_\bt_\by_\bp_\be\n+T type\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn simd.hh:230\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bi_\bm_\bd_\bI_\bn_\bd_\be_\bx_\bT_\by_\bp_\be_\bT_\br_\ba_\bi_\bt_\bs\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn simd.hh:234\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bi_\bm_\bd_\bI_\bn_\bd_\be_\bx_\bT_\by_\bp_\be_\bT_\br_\ba_\bi_\bt_\bs_\b:_\b:_\bt_\by_\bp_\be\n+std::size_t type\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn simd.hh:235\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bi_\bm_\bd_\bM_\ba_\bs_\bk_\bT_\by_\bp_\be_\bT_\br_\ba_\bi_\bt_\bs\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn simd.hh:261\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bi_\bm_\bd_\bM_\ba_\bs_\bk_\bT_\by_\bp_\be_\bT_\br_\ba_\bi_\bt_\bs_\b:_\b:_\bt_\by_\bp_\be\n+bool type\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn simd.hh:262\n+_\bv_\bc_\b._\bh_\bh\n+SIMD abstractions for Vc.\n+_\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bV_\bC_\b__\bA_\bS_\bS_\bI_\bG_\bN_\bM_\bE_\bN_\bT\n+#define DUNE_SIMD_VC_ASSIGNMENT(OP)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn simd/vc.hh:224\n ===============================================================================\n Generated by\u00a0_\b[_\bd_\bo_\bx_\by_\bg_\be_\bn_\b] 1.9.8\n"}]}, {"source1": "./usr/share/doc/libdune-common-doc/doxygen/a00170.html", "source2": "./usr/share/doc/libdune-common-doc/doxygen/a00170.html", "unified_diff": "@@ -1,15 +1,15 @@\n \n \n \n \n \n \n \n-dune-common: hash.hh File Reference\n+dune-common: vc.hh File Reference\n \n \n \n \n \n \n \n@@ -69,181 +69,25 @@\n \n
    \n \n
    \n
    \n
    \n- \n-
    hash.hh File Reference
    \n+
    vc.hh File Reference
    \n
    \n
    \n \n-

    Support for calculating hash values of objects. \n+

    Compatibility header for including <Vc/Vc> \n More...

    \n-
    #include <functional>
    \n-#include <dune/common/typetraits.hh>
    \n-
    \n+\n

    Go to the source code of this file.

    \n-\n-\n-\n-\n-\n-

    \n-Classes

    struct  Dune::hash< T >
     Functor for hashing objects of type T. More...
     
    \n-\n-\n-\n-\n-

    \n-Namespaces

    namespace  Dune
     Dune namespace.
     
    \n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-

    \n-Macros

    #define DUNE_DEFINE_HASH(template_args, type)
     Defines the required struct specialization to make type hashable via Dune::hash.
     
    #define DUNE_HASH_TEMPLATE_ARGS(...)
     Wrapper macro for the template arguments in DUNE_DEFINE_HASH.
     
    #define DUNE_HASH_TYPE(...)
     Wrapper macro for the type to be hashed in DUNE_DEFINE_HASH.
     
    \n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-

    \n-Functions

    template<typename T >
    void Dune::hash_combine (std::size_t &seed, const T &arg)
     Calculates the hash value of arg and combines it in-place with seed.
     
    template<typename It >
    std::size_t Dune::hash_range (It first, It last)
     Hashes all elements in the range [first,last) and returns the combined hash.
     
    template<typename It >
    void Dune::hash_range (std::size_t &seed, It first, It last)
     Hashes all elements in the range [first,last) and combines the hashes in-place with seed.
     
    \n

    Detailed Description

    \n-

    Support for calculating hash values of objects.

    \n-

    This file provides the functor Dune::hash to calculate hash values and some infrastructure to simplify extending Dune::hash for user-defined types, independent of the actual underlying implementation.

    \n-

    Macro Definition Documentation

    \n-\n-

    ◆ DUNE_DEFINE_HASH

    \n-\n-
    \n-
    \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n-
    #define DUNE_DEFINE_HASH( template_args,
     type 
    )
    \n-
    \n-\n-

    Defines the required struct specialization to make type hashable via Dune::hash.

    \n-

    In order to calculate the hash, operator() of the generated specialization will return the result of an unqualified call to the global function hash_value(const type&). As the call is not qualified, the function will be found using argument-dependent lookup, allowing implementors to conveniently place it inside the class body.

    \n-

    Consider the following type:

    \n-
    namespace ns {
    \n-
    template<typename A, int i>
    \n-
    class Foo
    \n-
    {
    \n-
    ...
    \n-
    };
    \n-
    }
    \n-

    In order to add support for Dune::hash, you need to extend the definition like this:

    \n-
    namespace ns {
    \n-
    template<typename A, int i>
    \n-
    class Foo
    \n-
    {
    \n-
    ...
    \n-
    // The keyword "friend" turns this into a global function that is a friend of Foo.
    \n-
    inline friend std::size_t hash_value(const Foo& arg)
    \n-
    {
    \n-
    return ...;
    \n-
    }
    \n-
    };
    \n-
    }
    \n-
    \n-
    // Define hash struct specialization
    \n-\n-
    #define DUNE_DEFINE_HASH(template_args, type)
    Defines the required struct specialization to make type hashable via Dune::hash.
    Definition hash.hh:100
    \n-
    #define DUNE_HASH_TYPE(...)
    Wrapper macro for the type to be hashed in DUNE_DEFINE_HASH.
    Definition hash.hh:117
    \n-
    #define DUNE_HASH_TEMPLATE_ARGS(...)
    Wrapper macro for the template arguments in DUNE_DEFINE_HASH.
    Definition hash.hh:109
    \n-
    Warning
    As the specialization has to be placed in the original namespace of the hash struct (e.g. std), this macro must be called from the global namespace!
    \n-
    Parameters
    \n- \n- \n- \n-
    template_argsThe template arguments required by the hash struct specialization, wrapped in a call to DUNE_HASH_TEMPLATE_ARGS. If this is a complete specialization, call DUNE_HASH_TEMPLATE_ARGS without arguments.
    typeThe exact type of the specialization, wrapped in a call to DUNE_HASH_TYPE.
    \n-
    \n-
    \n-\n-
    \n-
    \n-\n-

    ◆ DUNE_HASH_TEMPLATE_ARGS

    \n-\n-
    \n-
    \n- \n- \n- \n- \n- \n- \n- \n- \n-
    #define DUNE_HASH_TEMPLATE_ARGS( ...)
    \n-
    \n-\n-

    Wrapper macro for the template arguments in DUNE_DEFINE_HASH.

    \n-

    This macro should always be used as a wrapper for the template arguments when calling DUNE_DEFINE_HASH. It works around some preprocessor limitations when the template arguments contain commas or the list is completely empty.

    \n-\n-
    \n-
    \n-\n-

    ◆ DUNE_HASH_TYPE

    \n-\n-
    \n-
    \n- \n- \n- \n- \n- \n- \n- \n- \n-
    #define DUNE_HASH_TYPE( ...)
    \n-
    \n-\n-

    Wrapper macro for the type to be hashed in DUNE_DEFINE_HASH.

    \n-

    This macro should always be used as a wrapper for the type of the specialization when calling DUNE_DEFINE_HASH. It works around some preprocessor limitations when the type contains commas.

    \n-\n-
    \n-
    \n-
    \n+

    Compatibility header for including <Vc/Vc>

    \n+

    Certain versions (1.3.2) of Vc (https://github.com/VcDevel/Vc) have a problem with certain compiler versions (g++ 7.2.0) in c++17 mode, see #88.

    \n+
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,129 +1,15 @@\n dune-common\u00a02.10\n Loading...\n Searching...\n No Matches\n * _\bd_\bu_\bn_\be\n * _\bc_\bo_\bm_\bm_\bo_\bn\n-_\bC_\bl_\ba_\bs_\bs_\be_\bs | _\bN_\ba_\bm_\be_\bs_\bp_\ba_\bc_\be_\bs | _\bM_\ba_\bc_\br_\bo_\bs | _\bF_\bu_\bn_\bc_\bt_\bi_\bo_\bn_\bs\n-hash.hh File Reference\n-Support for calculating hash values of objects. _\bM_\bo_\br_\be_\b._\b._\b.\n-#include \n-#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bt_\by_\bp_\be_\bt_\br_\ba_\bi_\bt_\bs_\b._\bh_\bh>\n+vc.hh File Reference\n+Compatibility header for including _\bM_\bo_\br_\be_\b._\b._\b.\n _\bG_\bo_\b _\bt_\bo_\b _\bt_\bh_\be_\b _\bs_\bo_\bu_\br_\bc_\be_\b _\bc_\bo_\bd_\be_\b _\bo_\bf_\b _\bt_\bh_\bi_\bs_\b _\bf_\bi_\bl_\be_\b.\n-C\bCl\bla\bas\bss\bse\bes\bs\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bh_\ba_\bs_\bh_\b<_\b _\bT_\b _\b>\n-\u00a0 Functor for hashing objects of type T. _\bM_\bo_\br_\be_\b._\b._\b.\n-\u00a0\n-N\bNa\bam\bme\bes\bsp\bpa\bac\bce\bes\bs\n-namespace \u00a0 _\bD_\bu_\bn_\be\n-\u00a0 _\bD_\bu_\bn_\be namespace.\n-\u00a0\n-M\bMa\bac\bcr\bro\bos\bs\n-#define\u00a0 _\bD_\bU_\bN_\bE_\b__\bD_\bE_\bF_\bI_\bN_\bE_\b__\bH_\bA_\bS_\bH(template_args, type)\n-\u00a0 Defines the required struct specialization to make type hashable via\n- _\bD_\bu_\bn_\be_\b:_\b:_\bh_\ba_\bs_\bh.\n-\u00a0\n-#define\u00a0 _\bD_\bU_\bN_\bE_\b__\bH_\bA_\bS_\bH_\b__\bT_\bE_\bM_\bP_\bL_\bA_\bT_\bE_\b__\bA_\bR_\bG_\bS(...)\n-\u00a0 Wrapper macro for the template arguments in DUNE_DEFINE_HASH.\n-\u00a0\n-#define\u00a0 _\bD_\bU_\bN_\bE_\b__\bH_\bA_\bS_\bH_\b__\bT_\bY_\bP_\bE(...)\n-\u00a0 Wrapper macro for the type to be hashed in DUNE_DEFINE_HASH.\n-\u00a0\n-F\bFu\bun\bnc\bct\bti\bio\bon\bns\bs\n-template\n- void\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bh_\ba_\bs_\bh_\b__\bc_\bo_\bm_\bb_\bi_\bn_\be (std::size_t &seed, const T &arg)\n-\u00a0 Calculates the hash value of arg and combines it in-place with\n- seed.\n-\u00a0\n-template\n-std::size_t\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bh_\ba_\bs_\bh_\b__\br_\ba_\bn_\bg_\be (It first, It last)\n-\u00a0 Hashes all elements in the range [first,last) and returns the\n- combined hash.\n-\u00a0\n-template\n- void\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bh_\ba_\bs_\bh_\b__\br_\ba_\bn_\bg_\be (std::size_t &seed, It first, It last)\n-\u00a0 Hashes all elements in the range [first,last) and combines the\n- hashes in-place with seed.\n-\u00a0\n *\b**\b**\b**\b**\b* D\bDe\bet\bta\bai\bil\ble\bed\bd D\bDe\bes\bsc\bcr\bri\bip\bpt\bti\bio\bon\bn *\b**\b**\b**\b**\b*\n-Support for calculating hash values of objects.\n-This file provides the functor _\bD_\bu_\bn_\be_\b:_\b:_\bh_\ba_\bs_\bh to calculate hash values and some\n-infrastructure to simplify extending _\bD_\bu_\bn_\be_\b:_\b:_\bh_\ba_\bs_\bh for user-defined types,\n-independent of the actual underlying implementation.\n-*\b**\b**\b**\b**\b* M\bMa\bac\bcr\bro\bo D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn D\bDo\boc\bcu\bum\bme\ben\bnt\bta\bat\bti\bio\bon\bn *\b**\b**\b**\b**\b*\n-*\b**\b**\b**\b**\b* _\b?\b\u25c6_\b?\b\u00a0D\bDU\bUN\bNE\bE_\b_D\bDE\bEF\bFI\bIN\bNE\bE_\b_H\bHA\bAS\bSH\bH *\b**\b**\b**\b**\b*\n-#define DUNE_DEFINE_HASH ( \u00a0 template_args,\n- \u00a0 type\u00a0\n- )\n-Defines the required struct specialization to make type hashable via _\bD_\bu_\bn_\be_\b:_\b:\n-_\bh_\ba_\bs_\bh.\n-In order to calculate the hash, operator() of the generated specialization will\n-return the result of an unqualified call to the global function hash_value\n-(const type&). As the call is not qualified, the function will be found using\n-argument-dependent lookup, allowing implementors to conveniently place it\n-inside the class body.\n-Consider the following type:\n-namespace ns {\n-template\n-class Foo\n-{\n-...\n-};\n-}\n-In order to add support for _\bD_\bu_\bn_\be_\b:_\b:_\bh_\ba_\bs_\bh, you need to extend the definition like\n-this:\n-namespace ns {\n-template\n-class Foo\n-{\n-...\n-// The keyword \"friend\" turns this into a global function that is a friend of\n-Foo.\n-inline friend std::size_t hash_value(const Foo& arg)\n-{\n-return ...;\n-}\n-};\n-}\n-// Define hash struct specialization\n-_\bD_\bU_\bN_\bE_\b__\bD_\bE_\bF_\bI_\bN_\bE_\b__\bH_\bA_\bS_\bH(_\bD_\bU_\bN_\bE_\b__\bH_\bA_\bS_\bH_\b__\bT_\bE_\bM_\bP_\bL_\bA_\bT_\bE_\b__\bA_\bR_\bG_\bS(typename A, int i),_\bD_\bU_\bN_\bE_\b__\bH_\bA_\bS_\bH_\b__\bT_\bY_\bP_\bE\n-(Foo))\n-_\bD_\bU_\bN_\bE_\b__\bD_\bE_\bF_\bI_\bN_\bE_\b__\bH_\bA_\bS_\bH\n-#define DUNE_DEFINE_HASH(template_args, type)\n-Defines the required struct specialization to make type hashable via Dune::\n-hash.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn hash.hh:100\n-_\bD_\bU_\bN_\bE_\b__\bH_\bA_\bS_\bH_\b__\bT_\bY_\bP_\bE\n-#define DUNE_HASH_TYPE(...)\n-Wrapper macro for the type to be hashed in DUNE_DEFINE_HASH.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn hash.hh:117\n-_\bD_\bU_\bN_\bE_\b__\bH_\bA_\bS_\bH_\b__\bT_\bE_\bM_\bP_\bL_\bA_\bT_\bE_\b__\bA_\bR_\bG_\bS\n-#define DUNE_HASH_TEMPLATE_ARGS(...)\n-Wrapper macro for the template arguments in DUNE_DEFINE_HASH.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn hash.hh:109\n- Warning\n- As the specialization has to be placed in the original namespace of the\n- hash struct (e.g. std), this macro m\bmu\bus\bst\bt be called from the global\n- namespace!\n- Parameters\n- The template arguments required by the hash struct\n- specialization, wrapped in a call to\n- template_args DUNE_HASH_TEMPLATE_ARGS. If this is a complete\n- specialization, call DUNE_HASH_TEMPLATE_ARGS without\n- arguments.\n- type The exact type of the specialization, wrapped in a call to\n- DUNE_HASH_TYPE.\n-*\b**\b**\b**\b**\b* _\b?\b\u25c6_\b?\b\u00a0D\bDU\bUN\bNE\bE_\b_H\bHA\bAS\bSH\bH_\b_T\bTE\bEM\bMP\bPL\bLA\bAT\bTE\bE_\b_A\bAR\bRG\bGS\bS *\b**\b**\b**\b**\b*\n-#define DUNE_HASH_TEMPLATE_ARGS ( \u00a0 .\b..\b..\b. )\n-Wrapper macro for the template arguments in DUNE_DEFINE_HASH.\n-This macro should always be used as a wrapper for the template arguments when\n-calling DUNE_DEFINE_HASH. It works around some preprocessor limitations when\n-the template arguments contain commas or the list is completely empty.\n-*\b**\b**\b**\b**\b* _\b?\b\u25c6_\b?\b\u00a0D\bDU\bUN\bNE\bE_\b_H\bHA\bAS\bSH\bH_\b_T\bTY\bYP\bPE\bE *\b**\b**\b**\b**\b*\n-#define DUNE_HASH_TYPE ( \u00a0 .\b..\b..\b. )\n-Wrapper macro for the type to be hashed in DUNE_DEFINE_HASH.\n-This macro should always be used as a wrapper for the type of the\n-specialization when calling DUNE_DEFINE_HASH. It works around some preprocessor\n-limitations when the type contains commas.\n+Compatibility header for including \n+Certain versions (1.3.2) of Vc (_\bh_\bt_\bt_\bp_\bs_\b:_\b/_\b/_\bg_\bi_\bt_\bh_\bu_\bb_\b._\bc_\bo_\bm_\b/_\bV_\bc_\bD_\be_\bv_\be_\bl_\b/_\bV_\bc) have a problem\n+with certain compiler versions (g++ 7.2.0) in c++17 mode, see #88.\n ===============================================================================\n Generated by\u00a0_\b[_\bd_\bo_\bx_\by_\bg_\be_\bn_\b] 1.9.8\n"}]}, {"source1": "./usr/share/doc/libdune-common-doc/doxygen/a00170_source.html", "source2": "./usr/share/doc/libdune-common-doc/doxygen/a00170_source.html", "unified_diff": "@@ -1,15 +1,15 @@\n \n \n \n \n \n \n \n-dune-common: hash.hh Source File\n+dune-common: vc.hh Source File\n \n \n \n \n \n \n \n@@ -74,289 +74,38 @@\n \n
    \n \n
    \n
    \n
    \n-
    hash.hh
    \n+
    vc.hh
    \n
    \n
    \n-Go to the documentation of this file.
    1// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
    \n-
    2// vi: set et ts=4 sw=2 sts=2:
    \n-
    3// SPDX-FileCopyrightInfo: Copyright \u00a9 DUNE Project contributors, see file LICENSE.md in module root
    \n-
    4// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception
    \n-
    5#ifndef DUNE_COMMON_HASH_HH
    \n-
    6#define DUNE_COMMON_HASH_HH
    \n-
    7
    \n-
    8#include <functional>
    \n-
    9
    \n-\n-
    11
    \n-
    24// ********************************************************************************
    \n-
    25// Doxygen documentation
    \n-
    26// ********************************************************************************
    \n+Go to the documentation of this file.
    1// SPDX-FileCopyrightInfo: Copyright \u00a9 DUNE Project contributors, see file LICENSE.md in module root
    \n+
    2// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception
    \n+
    3#ifndef DUNE_COMMON_VC_HH
    \n+
    4#define DUNE_COMMON_VC_HH
    \n+
    5
    \n+
    15#if HAVE_VC
    \n+
    16
    \n+
    17// include Vc's macro definitions
    \n+
    18#include <Vc/global.h>
    \n+
    19
    \n+
    20// undefine the macro that signals C++17 support, if set
    \n+
    21#ifdef Vc_CXX17
    \n+
    22#undef Vc_CXX17
    \n+
    23#endif
    \n+
    24
    \n+
    25// include the rest of Vc
    \n+
    26#include <Vc/Vc>
    \n
    27
    \n-
    28#ifdef DOXYGEN
    \n+
    28#endif // HAVE_VC
    \n
    29
    \n-
    30namespace Dune {
    \n-
    31
    \n-
    33
    \n-
    38 template<typename T>
    \n-
    \n-
    39 struct hash
    \n-
    40 {
    \n-
    41
    \n-
    \n-
    43 std::size_t operator()(const T& t) const
    \n-
    44 {
    \n-
    45 return hash(t);
    \n-
    46 }
    \n-
    \n-
    47
    \n-
    48 };
    \n-
    \n-
    49
    \n-
    50}
    \n-
    51
    \n-
    53
    \n-
    100#define DUNE_DEFINE_HASH(template_args,type)
    \n-
    101
    \n-
    102
    \n-
    104
    \n-
    109#define DUNE_HASH_TEMPLATE_ARGS(...)
    \n-
    110
    \n-
    112
    \n-
    117#define DUNE_HASH_TYPE(...)
    \n-
    118
    \n-
    119#else // DOXYGEN - hide all the ugly implementation
    \n-
    120
    \n-
    121
    \n-
    122
    \n-
    123// ********************************************************************************
    \n-
    124// C++11 support
    \n-
    125// ********************************************************************************
    \n-
    126
    \n-
    127// import std::hash into Dune namespace
    \n-
    128namespace Dune {
    \n-
    129
    \n-
    130 using std::hash;
    \n-
    131
    \n-
    132}
    \n-
    133
    \n-
    134// Macro for defining a std::hash specialization for type.
    \n-
    135// This should not be called directly. Call DUNE_DEFINE_HASH
    \n-
    136// instead.
    \n-
    137#define DUNE_DEFINE_STD_HASH(template_args,type) \\
    \n-
    138 namespace std { \\
    \n-
    139 \\
    \n-
    140 template<template_args> \\
    \n-
    141 struct hash<type> \\
    \n-
    142 { \\
    \n-
    143 \\
    \n-
    144 typedef type argument_type; \\
    \n-
    145 typedef std::size_t result_type; \\
    \n-
    146 \\
    \n-
    147 std::size_t operator()(const type& arg) const \\
    \n-
    148 { \\
    \n-
    149 return hash_value(arg); \\
    \n-
    150 } \\
    \n-
    151 }; \\
    \n-
    152 \\
    \n-
    153 template<template_args> \\
    \n-
    154 struct hash<const type> \\
    \n-
    155 { \\
    \n-
    156 \\
    \n-
    157 typedef type argument_type; \\
    \n-
    158 typedef std::size_t result_type; \\
    \n-
    159 \\
    \n-
    160 std::size_t operator()(const type& arg) const \\
    \n-
    161 { \\
    \n-
    162 return hash_value(arg); \\
    \n-
    163 } \\
    \n-
    164 }; \\
    \n-
    165 \\
    \n-
    166 } \\
    \n-
    167
    \n-
    168// Wrapper macro for template arguments.
    \n-
    169// This is required because the template arguments can contain commas,
    \n-
    170// which will create a macro argument list of unknown length. That in itself
    \n-
    171// would not be a problem, but DUNE_DEFINE_HASH has to be called with two argument
    \n-
    172// lists of unknown length. So this macro wraps its arguments with parentheses,
    \n-
    173// turning it into a single argument. The result is used as the parameter list of
    \n-
    174// an expansion macro in the calls to the implementation-specific macros
    \n-
    175// for C++11 and TR1. Noto that technically, this trick is only legal for C++11,
    \n-
    176// but pretty much every compiler supports variadic macros in C++03 mode, as they
    \n-
    177// are part of C99.
    \n-
    178#define DUNE_HASH_TEMPLATE_ARGS(...) (__VA_ARGS__)
    \n-
    179
    \n-
    180// Wrapper macro for type to be hashed.
    \n-
    181// See above for rationale.
    \n-
    182#define DUNE_HASH_TYPE(...) (__VA_ARGS__)
    \n-
    183
    \n-
    184// Expansion macro for the parenthesized argument lists created by
    \n-
    185// DUNE_HASH_TEMPLATE_ARGS and DUNE_HASH_TYPE.
    \n-
    186#define DUNE_HASH_EXPAND_VA_ARGS(...) __VA_ARGS__
    \n-
    187
    \n-
    188// Define specializations for all discovered hash implementations.
    \n-
    189#define DUNE_DEFINE_HASH(template_args,type) \\
    \n-
    190 DUNE_DEFINE_STD_HASH(DUNE_HASH_EXPAND_VA_ARGS template_args, DUNE_HASH_EXPAND_VA_ARGS type) \\
    \n-
    191
    \n-
    192
    \n-
    193#endif // DOXYGEN
    \n-
    194
    \n-
    195
    \n-
    196
    \n-
    197// ********************************************************************************
    \n-
    198// Some utility functions for combining hashes of member variables.
    \n-
    199// ********************************************************************************
    \n-
    200
    \n-
    201namespace Dune {
    \n-
    202
    \n-
    203 // The following functions are an implementation of the proposed hash extensions for
    \n-
    204 // the C++ standard by Peter Dimov
    \n-
    205 // (cf. http://www.open-std.org/JTC1/SC22/WG21/docs/papers/2005/n1756.pdf, issue 6.18).
    \n-
    206 // They are also contained in the boost::functional::hash library by Daniel James, but
    \n-
    207 // that implementation uses boost::hash internally, while we want to use Dune::hash. They
    \n-
    208 // are also considered for inclusion in TR2 (then based on std::hash, of course).
    \n-
    209
    \n-
    210#ifndef DOXYGEN
    \n-
    211
    \n-
    212 // helper struct for providing different hash combining algorithms dependent on
    \n-
    213 // the size of size_t.
    \n-
    214 // hash_combiner has to be specialized for the size (in bytes) of std::size_t.
    \n-
    215 // Specialized versions should provide a method
    \n-
    216 //
    \n-
    217 // template <typename typeof_size_t, typename T>
    \n-
    218 // void operator()(typeof_size_t& seed, const T& arg) const;
    \n-
    219 //
    \n-
    220 // that will be called by the interface function hash_combine() described further below.
    \n-
    221 // The redundant template parameter typeof_size_t is needed to avoid warnings for the
    \n-
    222 // unused 64-bit specialization on 32-bit systems.
    \n-
    223 //
    \n-
    224 // There is no default implementation!
    \n-
    225 template<int sizeof_size_t>
    \n-
    226 struct hash_combiner;
    \n-
    227
    \n-
    228
    \n-
    229 // hash combining for 64-bit platforms.
    \n-
    230 template<>
    \n-
    231 struct hash_combiner<8>
    \n-
    232 {
    \n-
    233
    \n-
    234 template<typename typeof_size_t, typename T>
    \n-
    235 void operator()(typeof_size_t& seed, const T& arg) const
    \n-
    236 {
    \n-
    237 static_assert(sizeof(typeof_size_t)==8, "hash_combiner::operator() instantiated with nonmatching type and size");
    \n-
    238
    \n-
    239 // The following algorithm for combining two 64-bit hash values is inspired by a similar
    \n-
    240 // function in CityHash (http://cityhash.googlecode.com/svn-history/r2/trunk/src/city.h),
    \n-
    241 // which is in turn based on ideas from the MurmurHash library. The basic idea is easy to
    \n-
    242 // grasp, though: New information is XORed into the existing hash multiple times at different
    \n-
    243 // places (using shift operations), and the resulting pattern is spread over the complete
    \n-
    244 // range of available bits via multiplication with a "magic" constant. The constants used
    \n-
    245 // below (47 and 0x9ddfea08eb382d69ULL) are taken from the CityHash implementation.
    \n-
    246 //
    \n-
    247 // We opted not to use the mixing algorithm proposed in the C++ working group defect list at
    \n-
    248 // http://www.open-std.org/JTC1/SC22/WG21/docs/papers/2005/n1756.pdf, p. 57f. because it
    \n-
    249 // has very bad hash distribution properties if you apply it to lists of very small numbers,
    \n-
    250 // an application that is frequent in PDELab's ordering framework.
    \n-
    251
    \n-
    252 Dune::hash<T> hasher;
    \n-
    253 const typeof_size_t kMul = 0x9ddfea08eb382d69ULL;
    \n-
    254 typeof_size_t h = hasher(arg);
    \n-
    255 typeof_size_t a = (seed ^ h) * kMul;
    \n-
    256 a ^= (a >> 47);
    \n-
    257 typeof_size_t b = (h ^ a) * kMul;
    \n-
    258 b ^= (b >> 47);
    \n-
    259 b *= kMul;
    \n-
    260 seed = b;
    \n-
    261 }
    \n-
    262
    \n-
    263 };
    \n-
    264
    \n-
    265
    \n-
    266 // hash combining for 32-bit platforms.
    \n-
    267 template<>
    \n-
    268 struct hash_combiner<4>
    \n-
    269 {
    \n-
    270
    \n-
    271 template<typename typeof_size_t, typename T>
    \n-
    272 void operator()(typeof_size_t& seed, const T& arg) const
    \n-
    273 {
    \n-
    274 static_assert(sizeof(typeof_size_t)==4, "hash_combiner::operator() instantiated with nonmatching type and size");
    \n-
    275
    \n-
    276 // The default algorithm above requires a 64-bit std::size_t. The following algorithm is a
    \n-
    277 // 32-bit compatible fallback, again inspired by CityHash and MurmurHash
    \n-
    278 // (http://cityhash.googlecode.com/svn-history/r2/trunk/src/city.cc).
    \n-
    279 // It uses 32-bit constants and relies on rotation instead of multiplication to spread the
    \n-
    280 // mixed bits as that is apparently more efficient on IA-32. The constants used below are again
    \n-
    281 // taken from CityHash, in particular from the file referenced above.
    \n-
    282
    \n-
    283 Dune::hash<T> hasher;
    \n-
    284 const typeof_size_t c1 = 0xcc9e2d51;
    \n-
    285 const typeof_size_t c2 = 0x1b873593;
    \n-
    286 const typeof_size_t c3 = 0xe6546b64;
    \n-
    287 typeof_size_t h = hasher(arg);
    \n-
    288 typeof_size_t a = seed * c1;
    \n-
    289 a = (a >> 17) | (a << (32 - 17));
    \n-
    290 a *= c2;
    \n-
    291 h ^= a;
    \n-
    292 h = (h >> 19) | (h << (32 - 19));
    \n-
    293 seed = h * 5 + c3;
    \n-
    294 }
    \n-
    295
    \n-
    296 };
    \n-
    297
    \n-
    298#endif // DOXYGEN
    \n-
    299
    \n-
    301
    \n-
    306 template<typename T>
    \n-
    \n-
    307 inline void hash_combine(std::size_t& seed, const T& arg)
    \n-
    308 {
    \n-
    309 hash_combiner<sizeof(std::size_t)>()(seed,arg);
    \n-
    310 }
    \n-
    \n-
    311
    \n-
    313
    \n-
    321 template<typename It>
    \n-
    \n-
    322 inline std::size_t hash_range(It first, It last)
    \n-
    323 {
    \n-
    324 std::size_t seed = 0;
    \n-
    325 for (; first != last; ++first)
    \n-
    326 {
    \n-
    327 hash_combine(seed,*first);
    \n-
    328 }
    \n-
    329 return seed;
    \n-
    330 }
    \n-
    \n-
    331
    \n-
    333
    \n-
    340 template<typename It>
    \n-
    \n-
    341 inline void hash_range(std::size_t& seed, It first, It last)
    \n-
    342 {
    \n-
    343 for (; first != last; ++first)
    \n-
    344 {
    \n-
    345 hash_combine(seed,*first);
    \n-
    346 }
    \n-
    347 }
    \n-
    \n-
    348
    \n-
    349} // end namespace Dune
    \n-
    350
    \n-
    351#endif // DUNE_COMMON_HASH_HH
    \n-
    Traits for type conversions and type information.
    \n-
    Dune namespace.
    Definition alignedallocator.hh:13
    \n-
    std::size_t hash_range(It first, It last)
    Hashes all elements in the range [first,last) and returns the combined hash.
    Definition hash.hh:322
    \n-
    void hash_combine(std::size_t &seed, const T &arg)
    Calculates the hash value of arg and combines it in-place with seed.
    Definition hash.hh:307
    \n-
    Functor for hashing objects of type T.
    Definition hash.hh:40
    \n-
    std::size_t operator()(const T &t) const
    Calculates the hash of t.
    Definition hash.hh:43
    \n+
    30#endif // DUNE_COMMON_VC_HH
    \n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,329 +1,32 @@\n dune-common\u00a02.10\n Loading...\n Searching...\n No Matches\n * _\bd_\bu_\bn_\be\n * _\bc_\bo_\bm_\bm_\bo_\bn\n-hash.hh\n+vc.hh\n _\bG_\bo_\b _\bt_\bo_\b _\bt_\bh_\be_\b _\bd_\bo_\bc_\bu_\bm_\be_\bn_\bt_\ba_\bt_\bi_\bo_\bn_\b _\bo_\bf_\b _\bt_\bh_\bi_\bs_\b _\bf_\bi_\bl_\be_\b.\n-1// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-\n-2// vi: set et ts=4 sw=2 sts=2:\n-3// SPDX-FileCopyrightInfo: Copyright \u00c2\u00a9 DUNE Project contributors, see file\n+1// SPDX-FileCopyrightInfo: Copyright \u00c2\u00a9 DUNE Project contributors, see file\n LICENSE.md in module root\n-4// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception\n-5#ifndef DUNE_COMMON_HASH_HH\n-6#define DUNE_COMMON_HASH_HH\n-7\n-8#include \n-9\n-10#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bt_\by_\bp_\be_\bt_\br_\ba_\bi_\bt_\bs_\b._\bh_\bh>\n-11\n-24/\n-/\n-********************************************************************************\n-25// Doxygen documentation\n-26/\n-/\n-********************************************************************************\n+2// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception\n+3#ifndef DUNE_COMMON_VC_HH\n+4#define DUNE_COMMON_VC_HH\n+5\n+15#if HAVE_VC\n+16\n+17// include Vc's macro definitions\n+18#include \n+19\n+20// undefine the macro that signals C++17 support, if set\n+21#ifdef Vc_CXX17\n+22#undef Vc_CXX17\n+23#endif\n+24\n+25// include the rest of Vc\n+26#include \n 27\n-28#ifdef DOXYGEN\n+28#endif // HAVE_VC\n 29\n-30namespace _\bD_\bu_\bn_\be {\n-31\n-33\n-38 template\n-_\b3_\b9 struct _\bh_\ba_\bs_\bh\n-40 {\n-41\n-_\b4_\b3 std::size_t _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b(_\b)(const T& t) const\n-44 {\n-45 return _\bh_\ba_\bs_\bh(t);\n-46 }\n-47\n-48 };\n-49\n-50}\n-51\n-53\n-_\b1_\b0_\b0#define DUNE_DEFINE_HASH(template_args,type)\n-101\n-102\n-104\n-_\b1_\b0_\b9#define DUNE_HASH_TEMPLATE_ARGS(...)\n-110\n-112\n-_\b1_\b1_\b7#define DUNE_HASH_TYPE(...)\n-118\n-119#else // DOXYGEN - hide all the ugly implementation\n-120\n-121\n-122\n-123/\n-/\n-********************************************************************************\n-124// C++11 support\n-125/\n-/\n-********************************************************************************\n-126\n-127// import std::hash into Dune namespace\n-128namespace _\bD_\bu_\bn_\be {\n-129\n-130 using std::hash;\n-131\n-132}\n-133\n-134// Macro for defining a std::hash specialization for type.\n-135// This should not be called directly. Call DUNE_DEFINE_HASH\n-136// instead.\n-137#define DUNE_DEFINE_STD_HASH(template_args,type) \\\n-138 namespace std { \\\n-139 \\\n-140 template \\\n-141 struct hash \\\n-142 { \\\n-143 \\\n-144 typedef type argument_type; \\\n-145 typedef std::size_t result_type; \\\n-146 \\\n-147 std::size_t operator()(const type& arg) const \\\n-148 { \\\n-149 return hash_value(arg); \\\n-150 } \\\n-151 }; \\\n-152 \\\n-153 template \\\n-154 struct hash \\\n-155 { \\\n-156 \\\n-157 typedef type argument_type; \\\n-158 typedef std::size_t result_type; \\\n-159 \\\n-160 std::size_t operator()(const type& arg) const \\\n-161 { \\\n-162 return hash_value(arg); \\\n-163 } \\\n-164 }; \\\n-165 \\\n-166 } \\\n-167\n-168// Wrapper macro for template arguments.\n-169// This is required because the template arguments can contain commas,\n-170// which will create a macro argument list of unknown length. That in itself\n-171// would not be a problem, but DUNE_DEFINE_HASH has to be called with two\n-argument\n-172// lists of unknown length. So this macro wraps its arguments with\n-parentheses,\n-173// turning it into a single argument. The result is used as the parameter\n-list of\n-174// an expansion macro in the calls to the implementation-specific macros\n-175// for C++11 and TR1. Noto that technically, this trick is only legal for\n-C++11,\n-176// but pretty much every compiler supports variadic macros in C++03 mode, as\n-they\n-177// are part of C99.\n-178#define DUNE_HASH_TEMPLATE_ARGS(...) (__VA_ARGS__)\n-179\n-180// Wrapper macro for type to be hashed.\n-181// See above for rationale.\n-182#define DUNE_HASH_TYPE(...) (__VA_ARGS__)\n-183\n-184// Expansion macro for the parenthesized argument lists created by\n-185// DUNE_HASH_TEMPLATE_ARGS and DUNE_HASH_TYPE.\n-186#define DUNE_HASH_EXPAND_VA_ARGS(...) __VA_ARGS__\n-187\n-188// Define specializations for all discovered hash implementations.\n-189#define DUNE_DEFINE_HASH(template_args,type) \\\n-190 DUNE_DEFINE_STD_HASH(DUNE_HASH_EXPAND_VA_ARGS template_args,\n-DUNE_HASH_EXPAND_VA_ARGS type) \\\n-191\n-192\n-193#endif // DOXYGEN\n-194\n-195\n-196\n-197/\n-/\n-********************************************************************************\n-198// Some utility functions for combining hashes of member variables.\n-199/\n-/\n-********************************************************************************\n-200\n-201namespace _\bD_\bu_\bn_\be {\n-202\n-203 // The following functions are an implementation of the proposed hash\n-extensions for\n-204 // the C++ standard by Peter Dimov\n-205 // (cf. http://www.open-std.org/JTC1/SC22/WG21/docs/papers/2005/n1756.pdf,\n-issue 6.18).\n-206 // They are also contained in the boost::functional::hash library by Daniel\n-James, but\n-207 // that implementation uses boost::hash internally, while we want to use\n-Dune::hash. They\n-208 // are also considered for inclusion in TR2 (then based on std::hash, of\n-course).\n-209\n-210#ifndef DOXYGEN\n-211\n-212 // helper struct for providing different hash combining algorithms\n-dependent on\n-213 // the size of size_t.\n-214 // hash_combiner has to be specialized for the size (in bytes) of std::\n-size_t.\n-215 // Specialized versions should provide a method\n-216 //\n-217 // template \n-218 // void operator()(typeof_size_t& seed, const T& arg) const;\n-219 //\n-220 // that will be called by the interface function hash_combine() described\n-further below.\n-221 // The redundant template parameter typeof_size_t is needed to avoid\n-warnings for the\n-222 // unused 64-bit specialization on 32-bit systems.\n-223 //\n-224 // There is no default implementation!\n-225 template\n-226 struct hash_combiner;\n-227\n-228\n-229 // hash combining for 64-bit platforms.\n-230 template<>\n-231 struct hash_combiner<8>\n-232 {\n-233\n-234 template\n-235 void operator()(typeof_size_t& seed, const T& arg) const\n-236 {\n-237 static_assert(sizeof(typeof_size_t)==8, \"hash_combiner::operator()\n-instantiated with nonmatching type and size\");\n-238\n-239 // The following algorithm for combining two 64-bit hash values is inspired\n-by a similar\n-240 // function in CityHash (http://cityhash.googlecode.com/svn-history/r2/\n-trunk/src/city.h),\n-241 // which is in turn based on ideas from the MurmurHash library. The basic\n-idea is easy to\n-242 // grasp, though: New information is XORed into the existing hash multiple\n-times at different\n-243 // places (using shift operations), and the resulting pattern is spread\n-over the complete\n-244 // range of available bits via multiplication with a \"magic\" constant. The\n-constants used\n-245 // below (47 and 0x9ddfea08eb382d69ULL) are taken from the CityHash\n-implementation.\n-246 //\n-247 // We opted not to use the mixing algorithm proposed in the C++ working\n-group defect list at\n-248 // http://www.open-std.org/JTC1/SC22/WG21/docs/papers/2005/n1756.pdf, p.\n-57f. because it\n-249 // has very bad hash distribution properties if you apply it to lists of\n-very small numbers,\n-250 // an application that is frequent in PDELab's ordering framework.\n-251\n-252 _\bD_\bu_\bn_\be_\b:_\b:_\bh_\ba_\bs_\bh_\b<_\bT_\b> hasher;\n-253 const typeof_size_t kMul = 0x9ddfea08eb382d69ULL;\n-254 typeof_size_t h = hasher(arg);\n-255 typeof_size_t a = (seed ^ h) * kMul;\n-256 a ^= (a >> 47);\n-257 typeof_size_t b = (h ^ a) * kMul;\n-258 b ^= (b >> 47);\n-259 b *= kMul;\n-260 seed = b;\n-261 }\n-262\n-263 };\n-264\n-265\n-266 // hash combining for 32-bit platforms.\n-267 template<>\n-268 struct hash_combiner<4>\n-269 {\n-270\n-271 template\n-272 void operator()(typeof_size_t& seed, const T& arg) const\n-273 {\n-274 static_assert(sizeof(typeof_size_t)==4, \"hash_combiner::operator()\n-instantiated with nonmatching type and size\");\n-275\n-276 // The default algorithm above requires a 64-bit std::size_t. The following\n-algorithm is a\n-277 // 32-bit compatible fallback, again inspired by CityHash and MurmurHash\n-278 // (http://cityhash.googlecode.com/svn-history/r2/trunk/src/city.cc).\n-279 // It uses 32-bit constants and relies on rotation instead of\n-multiplication to spread the\n-280 // mixed bits as that is apparently more efficient on IA-32. The constants\n-used below are again\n-281 // taken from CityHash, in particular from the file referenced above.\n-282\n-283 _\bD_\bu_\bn_\be_\b:_\b:_\bh_\ba_\bs_\bh_\b<_\bT_\b> hasher;\n-284 const typeof_size_t c1 = 0xcc9e2d51;\n-285 const typeof_size_t c2 = 0x1b873593;\n-286 const typeof_size_t c3 = 0xe6546b64;\n-287 typeof_size_t h = hasher(arg);\n-288 typeof_size_t a = seed * c1;\n-289 a = (a >> 17) | (a << (32 - 17));\n-290 a *= c2;\n-291 h ^= a;\n-292 h = (h >> 19) | (h << (32 - 19));\n-293 seed = h * 5 + c3;\n-294 }\n-295\n-296 };\n-297\n-298#endif // DOXYGEN\n-299\n-301\n-306 template\n-_\b3_\b0_\b7 inline void _\bh_\ba_\bs_\bh_\b__\bc_\bo_\bm_\bb_\bi_\bn_\be(std::size_t& seed, const T& arg)\n-308 {\n-309 hash_combiner()(seed,arg);\n-310 }\n-311\n-313\n-321 template\n-_\b3_\b2_\b2 inline std::size_t _\bh_\ba_\bs_\bh_\b__\br_\ba_\bn_\bg_\be(It first, It last)\n-323 {\n-324 std::size_t seed = 0;\n-325 for (; first != last; ++first)\n-326 {\n-327 _\bh_\ba_\bs_\bh_\b__\bc_\bo_\bm_\bb_\bi_\bn_\be(seed,*first);\n-328 }\n-329 return seed;\n-330 }\n-331\n-333\n-340 template\n-_\b3_\b4_\b1 inline void _\bh_\ba_\bs_\bh_\b__\br_\ba_\bn_\bg_\be(std::size_t& seed, It first, It last)\n-342 {\n-343 for (; first != last; ++first)\n-344 {\n-345 _\bh_\ba_\bs_\bh_\b__\bc_\bo_\bm_\bb_\bi_\bn_\be(seed,*first);\n-346 }\n-347 }\n-348\n-349} // end namespace Dune\n-350\n-351#endif // DUNE_COMMON_HASH_HH\n-_\bt_\by_\bp_\be_\bt_\br_\ba_\bi_\bt_\bs_\b._\bh_\bh\n-Traits for type conversions and type information.\n-_\bD_\bu_\bn_\be\n-Dune namespace.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn alignedallocator.hh:13\n-_\bD_\bu_\bn_\be_\b:_\b:_\bh_\ba_\bs_\bh_\b__\br_\ba_\bn_\bg_\be\n-std::size_t hash_range(It first, It last)\n-Hashes all elements in the range [first,last) and returns the combined hash.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn hash.hh:322\n-_\bD_\bu_\bn_\be_\b:_\b:_\bh_\ba_\bs_\bh_\b__\bc_\bo_\bm_\bb_\bi_\bn_\be\n-void hash_combine(std::size_t &seed, const T &arg)\n-Calculates the hash value of arg and combines it in-place with seed.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn hash.hh:307\n-_\bD_\bu_\bn_\be_\b:_\b:_\bh_\ba_\bs_\bh\n-Functor for hashing objects of type T.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn hash.hh:40\n-_\bD_\bu_\bn_\be_\b:_\b:_\bh_\ba_\bs_\bh_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b(_\b)\n-std::size_t operator()(const T &t) const\n-Calculates the hash of t.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn hash.hh:43\n+30#endif // DUNE_COMMON_VC_HH\n ===============================================================================\n Generated by\u00a0_\b[_\bd_\bo_\bx_\by_\bg_\be_\bn_\b] 1.9.8\n"}]}, {"source1": "./usr/share/doc/libdune-common-doc/doxygen/a00173.html", "source2": "./usr/share/doc/libdune-common-doc/doxygen/a00173.html", "unified_diff": "@@ -1,15 +1,15 @@\n \n \n \n \n \n \n \n-dune-common: interfaces.hh File Reference\n+dune-common: precision.hh File Reference\n \n \n \n \n \n \n \n@@ -72,38 +72,38 @@\n
  • dune
  • common
  • \n
    \n
    \n
    \n \n-
    interfaces.hh File Reference
    \n+
    precision.hh File Reference
    \n
    \n
    \n \n-

    Provides interfaces for detection of specific behavior. \n+

    Various precision settings for calculations with FieldMatrix and FieldVector. \n More...

    \n-\n+
    #include <stdlib.h>
    \n+
    \n

    Go to the source code of this file.

    \n \n \n-\n-\n+\n+\n \n

    \n Classes

    struct  Dune::Cloneable
     An interface class for cloneable objects. More...
    class  Dune::FMatrixPrecision< ctype >
     Precisions for calculations with FieldMatrix and FieldVector. More...
     
    \n \n \n \n \n

    \n Namespaces

    namespace  Dune
     Dune namespace.
     
    \n

    Detailed Description

    \n-

    Provides interfaces for detection of specific behavior.

    \n-
    Author
    Robert Kloefkorn
    \n+

    Various precision settings for calculations with FieldMatrix and FieldVector.

    \n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,24 +1,24 @@\n dune-common\u00a02.10\n Loading...\n Searching...\n No Matches\n * _\bd_\bu_\bn_\be\n * _\bc_\bo_\bm_\bm_\bo_\bn\n _\bC_\bl_\ba_\bs_\bs_\be_\bs | _\bN_\ba_\bm_\be_\bs_\bp_\ba_\bc_\be_\bs\n-interfaces.hh File Reference\n-Provides interfaces for detection of specific behavior. _\bM_\bo_\br_\be_\b._\b._\b.\n+precision.hh File Reference\n+Various precision settings for calculations with FieldMatrix and FieldVector.\n+_\bM_\bo_\br_\be_\b._\b._\b.\n+#include \n _\bG_\bo_\b _\bt_\bo_\b _\bt_\bh_\be_\b _\bs_\bo_\bu_\br_\bc_\be_\b _\bc_\bo_\bd_\be_\b _\bo_\bf_\b _\bt_\bh_\bi_\bs_\b _\bf_\bi_\bl_\be_\b.\n C\bCl\bla\bas\bss\bse\bes\bs\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bC_\bl_\bo_\bn_\be_\ba_\bb_\bl_\be\n-\u00a0 An interface class for cloneable objects. _\bM_\bo_\br_\be_\b._\b._\b.\n+class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bF_\bM_\ba_\bt_\br_\bi_\bx_\bP_\br_\be_\bc_\bi_\bs_\bi_\bo_\bn_\b<_\b _\bc_\bt_\by_\bp_\be_\b _\b>\n+\u00a0 Precisions for calculations with _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx and _\bF_\bi_\be_\bl_\bd_\bV_\be_\bc_\bt_\bo_\br. _\bM_\bo_\br_\be_\b._\b._\b.\n \u00a0\n N\bNa\bam\bme\bes\bsp\bpa\bac\bce\bes\bs\n namespace \u00a0 _\bD_\bu_\bn_\be\n \u00a0 _\bD_\bu_\bn_\be namespace.\n \u00a0\n *\b**\b**\b**\b**\b* D\bDe\bet\bta\bai\bil\ble\bed\bd D\bDe\bes\bsc\bcr\bri\bip\bpt\bti\bio\bon\bn *\b**\b**\b**\b**\b*\n-Provides interfaces for detection of specific behavior.\n- Author\n- Robert Kloefkorn\n+Various precision settings for calculations with FieldMatrix and FieldVector.\n ===============================================================================\n Generated by\u00a0_\b[_\bd_\bo_\bx_\by_\bg_\be_\bn_\b] 1.9.8\n"}]}, {"source1": "./usr/share/doc/libdune-common-doc/doxygen/a00173_source.html", "source2": "./usr/share/doc/libdune-common-doc/doxygen/a00173_source.html", "unified_diff": "@@ -1,15 +1,15 @@\n \n \n \n \n \n \n \n-dune-common: interfaces.hh Source File\n+dune-common: precision.hh Source File\n \n \n \n \n \n \n \n@@ -74,42 +74,62 @@\n \n
    \n \n
    \n
    \n
    \n-
    interfaces.hh
    \n+
    precision.hh
    \n
    \n
    \n Go to the documentation of this file.
    1// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
    \n
    2// vi: set et ts=4 sw=2 sts=2:
    \n
    3// SPDX-FileCopyrightInfo: Copyright \u00a9 DUNE Project contributors, see file LICENSE.md in module root
    \n
    4// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception
    \n-
    5#ifndef DUNE_INTERFACES_HH
    \n-
    6#define DUNE_INTERFACES_HH
    \n+
    5#ifndef DUNE_PRECISION_HH
    \n+
    6#define DUNE_PRECISION_HH
    \n
    7
    \n-
    13namespace Dune {
    \n-
    14
    \n-
    \n-
    16 struct Cloneable {
    \n-
    17
    \n-
    23 virtual Cloneable* clone() const = 0;
    \n-
    24
    \n-
    26 virtual ~Cloneable() = default;
    \n-
    27
    \n-
    28 };
    \n-
    \n-
    29
    \n-
    30} // end namespace Dune
    \n-
    31#endif
    \n+
    12#include <stdlib.h>
    \n+
    13
    \n+
    14namespace Dune {
    \n+
    15
    \n+
    24 template <class ctype = double>
    \n+
    \n+\n+
    26 public:
    \n+
    \n+
    28 static ctype absolute_limit ()
    \n+
    29 {
    \n+
    30 return _absolute;
    \n+
    31 }
    \n+
    \n+
    32
    \n+
    \n+
    34 static void set_absolute_limit (ctype absthres)
    \n+
    35 {
    \n+
    36 _absolute = absthres;
    \n+
    37 }
    \n+
    \n+
    38
    \n+
    39 private:
    \n+
    40 // just to demonstrate some state information
    \n+
    41 static ctype _absolute;
    \n+
    42 };
    \n+
    \n+
    43
    \n+
    44 template <class ctype>
    \n+
    45 ctype FMatrixPrecision<ctype>::_absolute = 1E-80;
    \n+
    46
    \n+
    49} // end namespace
    \n+
    50
    \n+
    51#endif
    \n
    Dune namespace.
    Definition alignedallocator.hh:13
    \n-
    An interface class for cloneable objects.
    Definition interfaces.hh:16
    \n-
    virtual ~Cloneable()=default
    Destructor.
    \n-
    virtual Cloneable * clone() const =0
    Clones the object clone needs to be redefined by an implementation class, with the return type covari...
    \n+
    Precisions for calculations with FieldMatrix and FieldVector.
    Definition precision.hh:25
    \n+
    static ctype absolute_limit()
    return threshold to declare matrix singular
    Definition precision.hh:28
    \n+
    static void set_absolute_limit(ctype absthres)
    set singular threshold
    Definition precision.hh:34
    \n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,43 +1,60 @@\n dune-common\u00a02.10\n Loading...\n Searching...\n No Matches\n * _\bd_\bu_\bn_\be\n * _\bc_\bo_\bm_\bm_\bo_\bn\n-interfaces.hh\n+precision.hh\n _\bG_\bo_\b _\bt_\bo_\b _\bt_\bh_\be_\b _\bd_\bo_\bc_\bu_\bm_\be_\bn_\bt_\ba_\bt_\bi_\bo_\bn_\b _\bo_\bf_\b _\bt_\bh_\bi_\bs_\b _\bf_\bi_\bl_\be_\b.\n 1// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-\n 2// vi: set et ts=4 sw=2 sts=2:\n 3// SPDX-FileCopyrightInfo: Copyright \u00c2\u00a9 DUNE Project contributors, see file\n LICENSE.md in module root\n 4// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception\n-5#ifndef DUNE_INTERFACES_HH\n-6#define DUNE_INTERFACES_HH\n+5#ifndef DUNE_PRECISION_HH\n+6#define DUNE_PRECISION_HH\n 7\n-13namespace _\bD_\bu_\bn_\be {\n-14\n-_\b1_\b6 struct _\bC_\bl_\bo_\bn_\be_\ba_\bb_\bl_\be {\n-17\n-_\b2_\b3 virtual _\bC_\bl_\bo_\bn_\be_\ba_\bb_\bl_\be* _\bc_\bl_\bo_\bn_\be() const = 0;\n-24\n-_\b2_\b6 virtual _\b~_\bC_\bl_\bo_\bn_\be_\ba_\bb_\bl_\be() = default;\n-27\n-28 };\n-29\n-30} // end namespace Dune\n-31#endif\n+12#include \n+13\n+14namespace _\bD_\bu_\bn_\be {\n+15\n+24 template \n+_\b2_\b5 class _\bF_\bM_\ba_\bt_\br_\bi_\bx_\bP_\br_\be_\bc_\bi_\bs_\bi_\bo_\bn {\n+26 public:\n+_\b2_\b8 static ctype _\ba_\bb_\bs_\bo_\bl_\bu_\bt_\be_\b__\bl_\bi_\bm_\bi_\bt ()\n+29 {\n+30 return _absolute;\n+31 }\n+32\n+_\b3_\b4 static void _\bs_\be_\bt_\b__\ba_\bb_\bs_\bo_\bl_\bu_\bt_\be_\b__\bl_\bi_\bm_\bi_\bt (ctype absthres)\n+35 {\n+36 _absolute = absthres;\n+37 }\n+38\n+39 private:\n+40 // just to demonstrate some state information\n+41 static ctype _absolute;\n+42 };\n+43\n+44 template \n+45 ctype FMatrixPrecision::_absolute = 1E-80;\n+46\n+49} // end namespace\n+50\n+51#endif\n _\bD_\bu_\bn_\be\n Dune namespace.\n D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn alignedallocator.hh:13\n-_\bD_\bu_\bn_\be_\b:_\b:_\bC_\bl_\bo_\bn_\be_\ba_\bb_\bl_\be\n-An interface class for cloneable objects.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn interfaces.hh:16\n-_\bD_\bu_\bn_\be_\b:_\b:_\bC_\bl_\bo_\bn_\be_\ba_\bb_\bl_\be_\b:_\b:_\b~_\bC_\bl_\bo_\bn_\be_\ba_\bb_\bl_\be\n-virtual ~Cloneable()=default\n-Destructor.\n-_\bD_\bu_\bn_\be_\b:_\b:_\bC_\bl_\bo_\bn_\be_\ba_\bb_\bl_\be_\b:_\b:_\bc_\bl_\bo_\bn_\be\n-virtual Cloneable * clone() const =0\n-Clones the object clone needs to be redefined by an implementation class, with\n-the return type covari...\n+_\bD_\bu_\bn_\be_\b:_\b:_\bF_\bM_\ba_\bt_\br_\bi_\bx_\bP_\br_\be_\bc_\bi_\bs_\bi_\bo_\bn\n+Precisions for calculations with FieldMatrix and FieldVector.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn precision.hh:25\n+_\bD_\bu_\bn_\be_\b:_\b:_\bF_\bM_\ba_\bt_\br_\bi_\bx_\bP_\br_\be_\bc_\bi_\bs_\bi_\bo_\bn_\b:_\b:_\ba_\bb_\bs_\bo_\bl_\bu_\bt_\be_\b__\bl_\bi_\bm_\bi_\bt\n+static ctype absolute_limit()\n+return threshold to declare matrix singular\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn precision.hh:28\n+_\bD_\bu_\bn_\be_\b:_\b:_\bF_\bM_\ba_\bt_\br_\bi_\bx_\bP_\br_\be_\bc_\bi_\bs_\bi_\bo_\bn_\b:_\b:_\bs_\be_\bt_\b__\ba_\bb_\bs_\bo_\bl_\bu_\bt_\be_\b__\bl_\bi_\bm_\bi_\bt\n+static void set_absolute_limit(ctype absthres)\n+set singular threshold\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn precision.hh:34\n ===============================================================================\n Generated by\u00a0_\b[_\bd_\bo_\bx_\by_\bg_\be_\bn_\b] 1.9.8\n"}]}, {"source1": "./usr/share/doc/libdune-common-doc/doxygen/a00176.html", "source2": "./usr/share/doc/libdune-common-doc/doxygen/a00176.html", "unified_diff": "@@ -1,15 +1,15 @@\n \n \n \n \n \n \n \n-dune-common: densematrix.hh File Reference\n+dune-common: quadmath.hh File Reference\n \n \n \n \n \n \n \n@@ -69,74 +69,19 @@\n \n
    \n \n
    \n \n
    \n- \n-
    densematrix.hh File Reference
    \n+
    quadmath.hh File Reference
    \n
    \n
    \n \n-

    Implements a matrix constructed from a given type representing a field and a compile-time given number of rows and columns. \n-More...

    \n-
    #include <cmath>
    \n-#include <cstddef>
    \n-#include <iostream>
    \n-#include <type_traits>
    \n-#include <utility>
    \n-#include <vector>
    \n-#include <dune/common/boundschecking.hh>
    \n-#include <dune/common/classname.hh>
    \n-#include <dune/common/exceptions.hh>
    \n-#include <dune/common/fvector.hh>
    \n-#include <dune/common/math.hh>
    \n-#include <dune/common/precision.hh>
    \n-#include <dune/common/simd/simd.hh>
    \n-#include <dune/common/typetraits.hh>
    \n-#include <dune/common/scalarvectorview.hh>
    \n-
    \n

    Go to the source code of this file.

    \n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-

    \n-Classes

    struct  Dune::FieldTraits< DenseMatrix< M > >
     
    class  Dune::FMatrixError
     Error thrown if operations of a FieldMatrix fail. More...
     
    class  Dune::DenseMatrix< MAT >
     A dense n x m matrix. More...
     
    \n-\n-\n-\n-\n-\n-\n-

    \n-Namespaces

    namespace  Dune
     Dune namespace.
     
    namespace  Dune::DenseMatrixHelp
     
    \n-\n-\n-\n-\n-\n-\n-\n-\n-\n-

    \n-Functions

    template<typename MAT , typename V1 , typename V2 >
    static void Dune::DenseMatrixHelp::multAssign (const DenseMatrix< MAT > &matrix, const DenseVector< V1 > &x, DenseVector< V2 > &ret)
     calculates ret = matrix * x
     
    template<typename MAT >
    std::ostream & Dune::operator<< (std::ostream &s, const DenseMatrix< MAT > &a)
     Sends the matrix to an output stream.
     
    \n-

    Detailed Description

    \n-

    Implements a matrix constructed from a given type representing a field and a compile-time given number of rows and columns.

    \n-
    \n+\n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,57 +1,10 @@\n dune-common\u00a02.10\n Loading...\n Searching...\n No Matches\n * _\bd_\bu_\bn_\be\n * _\bc_\bo_\bm_\bm_\bo_\bn\n-_\bC_\bl_\ba_\bs_\bs_\be_\bs | _\bN_\ba_\bm_\be_\bs_\bp_\ba_\bc_\be_\bs | _\bF_\bu_\bn_\bc_\bt_\bi_\bo_\bn_\bs\n-densematrix.hh File Reference\n-_\bC_\bo_\bm_\bm_\bo_\bn \u00bb _\bD_\be_\bn_\bs_\be_\b _\bM_\ba_\bt_\br_\bi_\bx_\b _\ba_\bn_\bd_\b _\bV_\be_\bc_\bt_\bo_\br_\b _\bT_\be_\bm_\bp_\bl_\ba_\bt_\be_\b _\bL_\bi_\bb_\br_\ba_\br_\by\n-Implements a matrix constructed from a given type representing a field and a\n-compile-time given number of rows and columns. _\bM_\bo_\br_\be_\b._\b._\b.\n-#include \n-#include \n-#include \n-#include \n-#include \n-#include \n-#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bb_\bo_\bu_\bn_\bd_\bs_\bc_\bh_\be_\bc_\bk_\bi_\bn_\bg_\b._\bh_\bh>\n-#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bc_\bl_\ba_\bs_\bs_\bn_\ba_\bm_\be_\b._\bh_\bh>\n-#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\be_\bx_\bc_\be_\bp_\bt_\bi_\bo_\bn_\bs_\b._\bh_\bh>\n-#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bf_\bv_\be_\bc_\bt_\bo_\br_\b._\bh_\bh>\n-#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bm_\ba_\bt_\bh_\b._\bh_\bh>\n-#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bp_\br_\be_\bc_\bi_\bs_\bi_\bo_\bn_\b._\bh_\bh>\n-#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bs_\bi_\bm_\bd_\b/_\bs_\bi_\bm_\bd_\b._\bh_\bh>\n-#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bt_\by_\bp_\be_\bt_\br_\ba_\bi_\bt_\bs_\b._\bh_\bh>\n-#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bs_\bc_\ba_\bl_\ba_\br_\bv_\be_\bc_\bt_\bo_\br_\bv_\bi_\be_\bw_\b._\bh_\bh>\n+quadmath.hh File Reference\n _\bG_\bo_\b _\bt_\bo_\b _\bt_\bh_\be_\b _\bs_\bo_\bu_\br_\bc_\be_\b _\bc_\bo_\bd_\be_\b _\bo_\bf_\b _\bt_\bh_\bi_\bs_\b _\bf_\bi_\bl_\be_\b.\n-C\bCl\bla\bas\bss\bse\bes\bs\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bF_\bi_\be_\bl_\bd_\bT_\br_\ba_\bi_\bt_\bs_\b<_\b _\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bM_\b _\b>_\b _\b>\n-\u00a0\n- class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bF_\bM_\ba_\bt_\br_\bi_\bx_\bE_\br_\br_\bo_\br\n-\u00a0 Error thrown if operations of a _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx fail. _\bM_\bo_\br_\be_\b._\b._\b.\n-\u00a0\n- class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bM_\bA_\bT_\b _\b>\n-\u00a0 A dense n x m matrix. _\bM_\bo_\br_\be_\b._\b._\b.\n-\u00a0\n-N\bNa\bam\bme\bes\bsp\bpa\bac\bce\bes\bs\n-namespace \u00a0 _\bD_\bu_\bn_\be\n-\u00a0 _\bD_\bu_\bn_\be namespace.\n-\u00a0\n-namespace \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\bH_\be_\bl_\bp\n-\u00a0\n-F\bFu\bun\bnc\bct\bti\bio\bon\bns\bs\n-template\n- static void\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\bH_\be_\bl_\bp_\b:_\b:_\bm_\bu_\bl_\bt_\bA_\bs_\bs_\bi_\bg_\bn (const _\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx< MAT >\n- &matrix, const _\bD_\be_\bn_\bs_\be_\bV_\be_\bc_\bt_\bo_\br< V1 > &x, _\bD_\be_\bn_\bs_\be_\bV_\be_\bc_\bt_\bo_\br< V2 > &ret)\n-\u00a0 calculates ret = matrix * x\n-\u00a0\n-template\n-std::ostream &\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b<_\b< (std::ostream &s, const _\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx< MAT > &a)\n-\u00a0 Sends the matrix to an output stream.\n-\u00a0\n-*\b**\b**\b**\b**\b* D\bDe\bet\bta\bai\bil\ble\bed\bd D\bDe\bes\bsc\bcr\bri\bip\bpt\bti\bio\bon\bn *\b**\b**\b**\b**\b*\n-Implements a matrix constructed from a given type representing a field and a\n-compile-time given number of rows and columns.\n ===============================================================================\n Generated by\u00a0_\b[_\bd_\bo_\bx_\by_\bg_\be_\bn_\b] 1.9.8\n"}]}, {"source1": "./usr/share/doc/libdune-common-doc/doxygen/a00176_source.html", "source2": "./usr/share/doc/libdune-common-doc/doxygen/a00176_source.html", "unified_diff": "@@ -1,15 +1,15 @@\n \n \n \n \n \n \n \n-dune-common: densematrix.hh Source File\n+dune-common: quadmath.hh Source File\n \n \n \n \n \n \n \n@@ -74,1304 +74,490 @@\n \n
    \n \n
    \n \n
    \n-
    densematrix.hh
    \n+
    quadmath.hh
    \n
    \n
    \n Go to the documentation of this file.
    1// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
    \n
    2// vi: set et ts=4 sw=2 sts=2:
    \n
    3// SPDX-FileCopyrightInfo: Copyright \u00a9 DUNE Project contributors, see file LICENSE.md in module root
    \n
    4// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception
    \n-
    5#ifndef DUNE_DENSEMATRIX_HH
    \n-
    6#define DUNE_DENSEMATRIX_HH
    \n+
    5#ifndef DUNE_QUADMATH_HH
    \n+
    6#define DUNE_QUADMATH_HH
    \n
    7
    \n-
    8#include <cmath>
    \n-
    9#include <cstddef>
    \n-
    10#include <iostream>
    \n-
    11#include <type_traits>
    \n-
    12#include <utility>
    \n-
    13#include <vector>
    \n-
    14
    \n-\n-\n-\n-\n-
    19#include <dune/common/math.hh>
    \n-\n-\n-\n-\n-
    24
    \n-
    25namespace Dune
    \n-
    26{
    \n-
    27
    \n-
    28 template<typename M> class DenseMatrix;
    \n+
    8#if HAVE_QUADMATH
    \n+
    9#include <quadmath.h>
    \n+
    10
    \n+
    11#include <cmath>
    \n+
    12#include <cstddef>
    \n+
    13#include <cstdint>
    \n+
    14#include <cstdlib> // abs
    \n+
    15#include <istream>
    \n+
    16#include <ostream>
    \n+
    17#include <type_traits>
    \n+
    18#include <utility>
    \n+
    19
    \n+\n+\n+
    22
    \n+
    23namespace Dune
    \n+
    24{
    \n+
    25 namespace Impl
    \n+
    26 {
    \n+
    27 // forward declaration
    \n+
    28 class Float128;
    \n
    29
    \n-
    30 template<typename M>
    \n-\n-
    36
    \n-
    37 template<class K, int N, int M> class FieldMatrix;
    \n-
    38 template<class K, int N> class FieldVector;
    \n+
    30 } // end namespace Impl
    \n+
    31
    \n+
    32 using Impl::Float128;
    \n+
    33
    \n+
    34 // The purpose of this namespace is to move the `<cmath>` function overloads
    \n+
    35 // out of namespace `Dune`, see AlignedNumber in debugalign.hh.
    \n+
    36 namespace Impl
    \n+
    37 {
    \n+
    38 using float128_t = __float128;
    \n
    39
    \n-
    58 template< class DenseMatrix, class RHS >
    \n-\n-
    60
    \n-
    61#ifndef DOXYGEN
    \n-
    62 namespace Impl
    \n-
    63 {
    \n-
    64
    \n-
    65 template< class DenseMatrix, class RHS, class = void >
    \n-\n-
    67 {};
    \n+
    41 class Float128
    \n+
    42 {
    \n+
    43 float128_t value_ = 0.0q;
    \n+
    44
    \n+
    45 public:
    \n+
    46 constexpr Float128() = default;
    \n+
    47 constexpr Float128(const float128_t& value) noexcept
    \n+
    48 : value_(value)
    \n+
    49 {}
    \n+
    50
    \n+
    51 // constructor from any floating-point or integer type
    \n+
    52 template <class T,
    \n+
    53 std::enable_if_t<std::is_arithmetic<T>::value, int> = 0>
    \n+
    54 constexpr Float128(const T& value) noexcept
    \n+
    55 : value_(value)
    \n+
    56 {}
    \n+
    57
    \n+
    58 // constructor from pointer to null-terminated byte string
    \n+
    59 explicit Float128(const char* str) noexcept
    \n+
    60 : value_(strtoflt128(str, NULL))
    \n+
    61 {}
    \n+
    62
    \n+
    63 // accessors
    \n+
    64 constexpr operator float128_t() const noexcept { return value_; }
    \n+
    65
    \n+
    66 constexpr float128_t const& value() const noexcept { return value_; }
    \n+
    67 constexpr float128_t& value() noexcept { return value_; }
    \n
    68
    \n-
    69 template< class DenseMatrix, class RHS >
    \n-
    70 class DenseMatrixAssigner< DenseMatrix, RHS, std::enable_if_t< Dune::IsNumber< RHS >::value > >
    \n-
    71 {
    \n-
    72 public:
    \n-
    73 static void apply ( DenseMatrix &denseMatrix, const RHS &rhs )
    \n-
    74 {
    \n-
    75 typedef typename DenseMatrix::field_type field_type;
    \n-
    76 std::fill( denseMatrix.begin(), denseMatrix.end(), static_cast< field_type >( rhs ) );
    \n-
    77 }
    \n-
    78 };
    \n-
    79
    \n-
    80 template< class DenseMatrix, class RHS >
    \n-
    81 class DenseMatrixAssigner< DenseMatrix, RHS, std::enable_if_t< !std::is_same< typename RHS::const_iterator, void >::value
    \n-
    82 && std::is_convertible< typename RHS::const_iterator::value_type, typename DenseMatrix::iterator::value_type >::value > >
    \n-
    83 {
    \n-
    84 public:
    \n-
    85 static void apply ( DenseMatrix &denseMatrix, const RHS &rhs )
    \n-
    86 {
    \n-
    87 DUNE_ASSERT_BOUNDS(rhs.N() == denseMatrix.N());
    \n-
    88 DUNE_ASSERT_BOUNDS(rhs.M() == denseMatrix.M());
    \n-
    89 typename DenseMatrix::iterator tIt = std::begin(denseMatrix);
    \n-
    90 typename RHS::const_iterator sIt = std::begin(rhs);
    \n-
    91 for(; sIt != std::end(rhs); ++tIt, ++sIt)
    \n-
    92 std::copy(std::begin(*sIt), std::end(*sIt), std::begin(*tIt));
    \n-
    93 }
    \n-
    94 };
    \n-
    95
    \n-
    96 } // namespace Impl
    \n+
    69 // I/O
    \n+
    70 template<class CharT, class Traits>
    \n+
    71 friend std::basic_istream<CharT, Traits>&
    \n+
    72 operator>>(std::basic_istream<CharT, Traits>& in, Float128& x)
    \n+
    73 {
    \n+
    74 std::string buf;
    \n+
    75 buf.reserve(128);
    \n+
    76 in >> buf;
    \n+
    77 x.value() = strtoflt128(buf.c_str(), NULL);
    \n+
    78 return in;
    \n+
    79 }
    \n+
    80
    \n+
    81 template<class CharT, class Traits>
    \n+
    82 friend std::basic_ostream<CharT, Traits>&
    \n+
    83 operator<<(std::basic_ostream<CharT, Traits>& out, const Float128& x)
    \n+
    84 {
    \n+
    85 const std::size_t bufSize = 128;
    \n+
    86 CharT buf[128];
    \n+
    87
    \n+
    88 std::string format = "%." + std::to_string(out.precision()) + "Q" +
    \n+
    89 ((out.flags() | std::ios_base::scientific) ? "e" : "f");
    \n+
    90 const int numChars = quadmath_snprintf(buf, bufSize, format.c_str(), x.value());
    \n+
    91 if (std::size_t(numChars) >= bufSize) {
    \n+
    92 DUNE_THROW(Dune::RangeError, "Failed to print Float128 value: buffer overflow");
    \n+
    93 }
    \n+
    94 out << buf;
    \n+
    95 return out;
    \n+
    96 }
    \n
    97
    \n-
    98
    \n-
    99
    \n-
    100 template< class DenseMatrix, class RHS >
    \n-
    101 struct DenseMatrixAssigner
    \n-
    102 : public Impl::DenseMatrixAssigner< DenseMatrix, RHS >
    \n-
    103 {};
    \n+
    98 // Increment, decrement
    \n+
    99 constexpr Float128& operator++() noexcept { ++value_; return *this; }
    \n+
    100 constexpr Float128& operator--() noexcept { --value_; return *this; }
    \n+
    101
    \n+
    102 constexpr Float128 operator++(int) noexcept { Float128 tmp{*this}; ++value_; return tmp; }
    \n+
    103 constexpr Float128 operator--(int) noexcept { Float128 tmp{*this}; --value_; return tmp; }
    \n
    104
    \n-
    105
    \n-
    106 namespace Impl
    \n-
    107 {
    \n+
    105 // unary operators
    \n+
    106 constexpr Float128 operator+() const noexcept { return Float128{+value_}; }
    \n+
    107 constexpr Float128 operator-() const noexcept { return Float128{-value_}; }
    \n
    108
    \n-
    109 template< class DenseMatrix, class RHS >
    \n-
    110 std::true_type hasDenseMatrixAssigner ( DenseMatrix &, const RHS &, decltype( Dune::DenseMatrixAssigner< DenseMatrix, RHS >::apply( std::declval< DenseMatrix & >(), std::declval< const RHS & >() ) ) * = nullptr );
    \n-
    111
    \n-
    112 std::false_type hasDenseMatrixAssigner ( ... );
    \n-
    113
    \n-
    114 } // namespace Impl
    \n-
    115
    \n-
    116 template< class DenseMatrix, class RHS >
    \n-
    117 struct HasDenseMatrixAssigner
    \n-
    118 : public decltype( Impl::hasDenseMatrixAssigner( std::declval< DenseMatrix & >(), std::declval< const RHS & >() ) )
    \n-
    119 {};
    \n+
    109 // assignment operators
    \n+
    110#define DUNE_ASSIGN_OP(OP) \\
    \n+
    111 constexpr Float128& operator OP(const Float128& u) noexcept \\
    \n+
    112 { \\
    \n+
    113 value_ OP float128_t(u); \\
    \n+
    114 return *this; \\
    \n+
    115 } \\
    \n+
    116 static_assert(true, "Require semicolon to unconfuse editors")
    \n+
    117
    \n+
    118 DUNE_ASSIGN_OP(+=);
    \n+
    119 DUNE_ASSIGN_OP(-=);
    \n
    120
    \n-
    121#endif // #ifndef DOXYGEN
    \n-
    122
    \n+
    121 DUNE_ASSIGN_OP(*=);
    \n+
    122 DUNE_ASSIGN_OP(/=);
    \n
    123
    \n-
    124
    \n-
    126 class FMatrixError : public MathError {};
    \n+
    124#undef DUNE_ASSIGN_OP
    \n+
    125
    \n+
    126 }; // end class Float128
    \n
    127
    \n-
    138 template<typename MAT>
    \n-
    \n-\n-
    140 {
    \n-\n-
    142
    \n-
    143 // Curiously recurring template pattern
    \n-
    144 constexpr MAT & asImp() { return static_cast<MAT&>(*this); }
    \n-
    145 constexpr const MAT & asImp() const { return static_cast<const MAT&>(*this); }
    \n-
    146
    \n-
    147 template <class>
    \n-
    148 friend class DenseMatrix;
    \n-
    149
    \n-
    150 public:
    \n-
    151 //===== type definitions and constants
    \n-
    152
    \n-
    154 typedef typename Traits::derived_type derived_type;
    \n-
    155
    \n-
    157 typedef typename Traits::value_type value_type;
    \n-
    158
    \n-
    160 typedef typename Traits::value_type field_type;
    \n-
    161
    \n-
    163 typedef typename Traits::value_type block_type;
    \n-
    164
    \n-
    166 typedef typename Traits::size_type size_type;
    \n+
    128 // binary operators:
    \n+
    129 // For symmetry provide overloads with arithmetic types
    \n+
    130 // in the first or second argument.
    \n+
    131#define DUNE_BINARY_OP(OP) \\
    \n+
    132 constexpr Float128 operator OP(const Float128& t, \\
    \n+
    133 const Float128& u) noexcept \\
    \n+
    134 { \\
    \n+
    135 return Float128{float128_t(t) OP float128_t(u)}; \\
    \n+
    136 } \\
    \n+
    137 constexpr Float128 operator OP(const float128_t& t, \\
    \n+
    138 const Float128& u) noexcept \\
    \n+
    139 { \\
    \n+
    140 return Float128{t OP float128_t(u)}; \\
    \n+
    141 } \\
    \n+
    142 constexpr Float128 operator OP(const Float128& t, \\
    \n+
    143 const float128_t& u) noexcept \\
    \n+
    144 { \\
    \n+
    145 return Float128{float128_t(t) OP u}; \\
    \n+
    146 } \\
    \n+
    147 template <class T, \\
    \n+
    148 std::enable_if_t<std::is_arithmetic<T>::value, int> = 0> \\
    \n+
    149 constexpr Float128 operator OP(const T& t, \\
    \n+
    150 const Float128& u) noexcept \\
    \n+
    151 { \\
    \n+
    152 return Float128{float128_t(t) OP float128_t(u)}; \\
    \n+
    153 } \\
    \n+
    154 template <class U, \\
    \n+
    155 std::enable_if_t<std::is_arithmetic<U>::value, int> = 0> \\
    \n+
    156 constexpr Float128 operator OP(const Float128& t, \\
    \n+
    157 const U& u) noexcept \\
    \n+
    158 { \\
    \n+
    159 return Float128{float128_t(t) OP float128_t(u)}; \\
    \n+
    160 } \\
    \n+
    161 static_assert(true, "Require semicolon to unconfuse editors")
    \n+
    162
    \n+\n+\n+\n+\n
    167
    \n-
    169 typedef typename Traits::row_type row_type;
    \n-
    170
    \n-
    172 typedef typename Traits::row_reference row_reference;
    \n-
    173
    \n-
    175 typedef typename Traits::const_row_reference const_row_reference;
    \n-
    176
    \n-
    178 constexpr static int blocklevel = 1;
    \n-
    179
    \n-
    180 private:
    \n-
    183 using simd_index_type = Simd::Rebind<std::size_t, value_type>;
    \n-
    184
    \n-
    185 public:
    \n-
    186 //===== access to components
    \n-
    187
    \n-
    \n-\n-
    190 {
    \n-
    191 return asImp().mat_access(i);
    \n-
    192 }
    \n-
    \n-
    193
    \n-
    \n-\n-
    195 {
    \n-
    196 return asImp().mat_access(i);
    \n-
    197 }
    \n-
    \n-
    198
    \n-
    \n-\n-
    201 {
    \n-
    202 return rows();
    \n-
    203 }
    \n-
    \n-
    204
    \n-
    205 //===== iterator interface to rows of the matrix
    \n-\n-\n-\n-
    213 typedef typename std::remove_reference<row_reference>::type::Iterator ColIterator;
    \n-
    214
    \n-
    \n-\n-
    217 {
    \n-
    218 return Iterator(*this,0);
    \n-
    219 }
    \n-
    \n-
    220
    \n-
    \n-\n-
    223 {
    \n-
    224 return Iterator(*this,rows());
    \n-
    225 }
    \n-
    \n-
    226
    \n-
    \n-\n-
    230 {
    \n-
    231 return Iterator(*this,rows()-1);
    \n-
    232 }
    \n-
    \n-
    233
    \n-
    \n-\n-
    237 {
    \n-
    238 return Iterator(*this,-1);
    \n-
    239 }
    \n-
    \n-
    240
    \n-\n-\n-\n-
    248 typedef typename std::remove_reference<const_row_reference>::type::ConstIterator ConstColIterator;
    \n-
    249
    \n-
    \n-\n-
    252 {
    \n-
    253 return ConstIterator(*this,0);
    \n-
    254 }
    \n-
    \n-
    255
    \n-
    \n-\n-
    258 {
    \n-
    259 return ConstIterator(*this,rows());
    \n-
    260 }
    \n-
    \n-
    261
    \n-
    \n-\n-
    265 {
    \n-
    266 return ConstIterator(*this,rows()-1);
    \n-
    267 }
    \n-
    \n-
    268
    \n-
    \n-\n-
    272 {
    \n-
    273 return ConstIterator(*this,-1);
    \n-
    274 }
    \n-
    \n-
    275
    \n-
    276 //===== assignment
    \n-
    277
    \n-
    278 template< class RHS, class = std::enable_if_t< HasDenseMatrixAssigner< MAT, RHS >::value > >
    \n-
    \n-
    279 derived_type &operator= ( const RHS &rhs )
    \n-
    280 {
    \n-\n-
    282 return asImp();
    \n-
    283 }
    \n-
    \n-
    284
    \n-
    285 //===== vector space arithmetic
    \n-
    286
    \n-
    288 template <class Other>
    \n-
    \n-\n-
    290 {
    \n-
    291 DUNE_ASSERT_BOUNDS(rows() == x.rows());
    \n-
    292 for (size_type i=0; i<rows(); i++)
    \n-
    293 (*this)[i] += x[i];
    \n-
    294 return asImp();
    \n-
    295 }
    \n-
    \n-
    296
    \n-
    \n-\n-
    299 {
    \n-
    300 MAT result;
    \n-
    301 using idx_type = typename decltype(result)::size_type;
    \n-
    302
    \n-
    303 for (idx_type i = 0; i < rows(); ++i)
    \n-
    304 for (idx_type j = 0; j < cols(); ++j)
    \n-
    305 result[i][j] = - asImp()[i][j];
    \n-
    306
    \n-
    307 return result;
    \n-
    308 }
    \n-
    \n-
    309
    \n-
    311 template <class Other>
    \n-
    \n-\n-
    313 {
    \n-
    314 DUNE_ASSERT_BOUNDS(rows() == x.rows());
    \n-
    315 for (size_type i=0; i<rows(); i++)
    \n-
    316 (*this)[i] -= x[i];
    \n-
    317 return asImp();
    \n-
    318 }
    \n-
    \n-
    319
    \n-
    \n-\n-
    322 {
    \n-
    323 for (size_type i=0; i<rows(); i++)
    \n-
    324 (*this)[i] *= k;
    \n-
    325 return asImp();
    \n+
    168#undef DUNE_BINARY_OP
    \n+
    169
    \n+
    170 // logical operators:
    \n+
    171 // For symmetry provide overloads with arithmetic types
    \n+
    172 // in the first or second argument.
    \n+
    173#define DUNE_BINARY_BOOL_OP(OP) \\
    \n+
    174 constexpr bool operator OP(const Float128& t, \\
    \n+
    175 const Float128& u) noexcept \\
    \n+
    176 { \\
    \n+
    177 return float128_t(t) OP float128_t(u); \\
    \n+
    178 } \\
    \n+
    179 template <class T, \\
    \n+
    180 std::enable_if_t<std::is_arithmetic<T>::value, int> = 0> \\
    \n+
    181 constexpr bool operator OP(const T& t, \\
    \n+
    182 const Float128& u) noexcept \\
    \n+
    183 { \\
    \n+
    184 return float128_t(t) OP float128_t(u); \\
    \n+
    185 } \\
    \n+
    186 template <class U, \\
    \n+
    187 std::enable_if_t<std::is_arithmetic<U>::value, int> = 0> \\
    \n+
    188 constexpr bool operator OP(const Float128& t, \\
    \n+
    189 const U& u) noexcept \\
    \n+
    190 { \\
    \n+
    191 return float128_t(t) OP float128_t(u); \\
    \n+
    192 } \\
    \n+
    193 static_assert(true, "Require semicolon to unconfuse editors")
    \n+
    194
    \n+
    195 DUNE_BINARY_BOOL_OP(==);
    \n+
    196 DUNE_BINARY_BOOL_OP(!=);
    \n+
    197 DUNE_BINARY_BOOL_OP(<);
    \n+
    198 DUNE_BINARY_BOOL_OP(>);
    \n+
    199 DUNE_BINARY_BOOL_OP(<=);
    \n+
    200 DUNE_BINARY_BOOL_OP(>=);
    \n+
    201
    \n+
    202#undef DUNE_BINARY_BOOL_OP
    \n+
    203
    \n+
    204 // Overloads for the cmath functions
    \n+
    205
    \n+
    206 // function with name `name` redirects to quadmath function `func`
    \n+
    207#define DUNE_UNARY_FUNC(name,func) \\
    \n+
    208 inline Float128 name(const Float128& u) noexcept \\
    \n+
    209 { \\
    \n+
    210 return Float128{func (float128_t(u))}; \\
    \n+
    211 } \\
    \n+
    212 static_assert(true, "Require semicolon to unconfuse editors")
    \n+
    213
    \n+
    214 // like DUNE_UNARY_FUNC but with custom return type
    \n+
    215#define DUNE_CUSTOM_UNARY_FUNC(type,name,func) \\
    \n+
    216 inline type name(const Float128& u) noexcept \\
    \n+
    217 { \\
    \n+
    218 return (type)(func (float128_t(u))); \\
    \n+
    219 } \\
    \n+
    220 static_assert(true, "Require semicolon to unconfuse editors")
    \n+
    221
    \n+
    222 // redirects to quadmath function with two arguments
    \n+
    223#define DUNE_BINARY_FUNC(name,func) \\
    \n+
    224 inline Float128 name(const Float128& t, \\
    \n+
    225 const Float128& u) noexcept \\
    \n+
    226 { \\
    \n+
    227 return Float128{func (float128_t(t), float128_t(u))}; \\
    \n+
    228 } \\
    \n+
    229 static_assert(true, "Require semicolon to unconfuse editors")
    \n+
    230
    \n+
    231 DUNE_UNARY_FUNC(abs, fabsq);
    \n+
    232 DUNE_UNARY_FUNC(acos, acosq);
    \n+
    233 DUNE_UNARY_FUNC(acosh, acoshq);
    \n+
    234 DUNE_UNARY_FUNC(asin, asinq);
    \n+
    235 DUNE_UNARY_FUNC(asinh, asinhq);
    \n+
    236 DUNE_UNARY_FUNC(atan, atanq);
    \n+
    237 DUNE_UNARY_FUNC(atanh, atanhq);
    \n+
    238 DUNE_UNARY_FUNC(cbrt, cbrtq);
    \n+
    239 DUNE_UNARY_FUNC(ceil, ceilq);
    \n+
    240 DUNE_UNARY_FUNC(cos, cosq);
    \n+
    241 DUNE_UNARY_FUNC(cosh, coshq);
    \n+
    242 DUNE_UNARY_FUNC(erf, erfq);
    \n+
    243 DUNE_UNARY_FUNC(erfc, erfcq);
    \n+
    244 DUNE_UNARY_FUNC(exp, expq);
    \n+
    245 DUNE_UNARY_FUNC(expm1, expm1q);
    \n+
    246 DUNE_UNARY_FUNC(fabs, fabsq);
    \n+
    247 DUNE_UNARY_FUNC(floor, floorq);
    \n+
    248 DUNE_CUSTOM_UNARY_FUNC(int, ilogb, ilogbq);
    \n+
    249 DUNE_UNARY_FUNC(lgamma, lgammaq);
    \n+
    250 DUNE_CUSTOM_UNARY_FUNC(long long int, llrint, llrintq);
    \n+
    251 DUNE_CUSTOM_UNARY_FUNC(long long int, llround, llroundq);
    \n+
    252 DUNE_UNARY_FUNC(log, logq);
    \n+
    253 DUNE_UNARY_FUNC(log10, log10q);
    \n+
    254 DUNE_UNARY_FUNC(log1p, log1pq);
    \n+
    255 DUNE_UNARY_FUNC(log2, log2q);
    \n+
    256 // DUNE_UNARY_FUNC(logb, logbq); // not available in gcc5
    \n+
    257 DUNE_CUSTOM_UNARY_FUNC(long int, lrint, lrintq);
    \n+
    258 DUNE_CUSTOM_UNARY_FUNC(long int, lround, lroundq);
    \n+
    259 DUNE_UNARY_FUNC(nearbyint, nearbyintq);
    \n+
    260 DUNE_BINARY_FUNC(nextafter, nextafterq);
    \n+
    261 DUNE_BINARY_FUNC(pow, powq); // overload for integer argument see below
    \n+
    262 DUNE_UNARY_FUNC(rint, rintq);
    \n+
    263 DUNE_UNARY_FUNC(round, roundq);
    \n+
    264 DUNE_UNARY_FUNC(sin, sinq);
    \n+
    265 DUNE_UNARY_FUNC(sinh, sinhq);
    \n+
    266 DUNE_UNARY_FUNC(sqrt, sqrtq);
    \n+
    267 DUNE_UNARY_FUNC(tan, tanq);
    \n+
    268 DUNE_UNARY_FUNC(tanh, tanhq);
    \n+
    269 DUNE_UNARY_FUNC(tgamma, tgammaq);
    \n+
    270 DUNE_UNARY_FUNC(trunc, truncq);
    \n+
    271
    \n+
    272 DUNE_CUSTOM_UNARY_FUNC(bool, isfinite, finiteq);
    \n+
    273 DUNE_CUSTOM_UNARY_FUNC(bool, isinf, isinfq);
    \n+
    274 DUNE_CUSTOM_UNARY_FUNC(bool, isnan, isnanq);
    \n+
    275 DUNE_CUSTOM_UNARY_FUNC(bool, signbit, signbitq);
    \n+
    276
    \n+
    277#undef DUNE_UNARY_FUNC
    \n+
    278#undef DUNE_CUSTOM_UNARY_FUNC
    \n+
    279#undef DUNE_BINARY_FUNC
    \n+
    280
    \n+
    281 // like DUNE_BINARY_FUNC but provide overloads with arithmetic
    \n+
    282 // types in the first or second argument.
    \n+
    283#define DUNE_BINARY_ARITHMETIC_FUNC(name,func) \\
    \n+
    284 inline Float128 name(const Float128& t, \\
    \n+
    285 const Float128& u) noexcept \\
    \n+
    286 { \\
    \n+
    287 return Float128{func (float128_t(t), float128_t(u))}; \\
    \n+
    288 } \\
    \n+
    289 template <class T, \\
    \n+
    290 std::enable_if_t<std::is_arithmetic<T>::value, int> = 0> \\
    \n+
    291 inline Float128 name(const T& t, \\
    \n+
    292 const Float128& u) noexcept \\
    \n+
    293 { \\
    \n+
    294 return Float128{func (float128_t(t), float128_t(u))}; \\
    \n+
    295 } \\
    \n+
    296 template <class U, \\
    \n+
    297 std::enable_if_t<std::is_arithmetic<U>::value, int> = 0> \\
    \n+
    298 inline Float128 name(const Float128& t, \\
    \n+
    299 const U& u) noexcept \\
    \n+
    300 { \\
    \n+
    301 return Float128{func (float128_t(t), float128_t(u))}; \\
    \n+
    302 } \\
    \n+
    303 static_assert(true, "Require semicolon to unconfuse editors")
    \n+
    304
    \n+
    305 DUNE_BINARY_ARITHMETIC_FUNC(atan2,atan2q);
    \n+
    306 DUNE_BINARY_ARITHMETIC_FUNC(copysign,copysignq);
    \n+
    307 DUNE_BINARY_ARITHMETIC_FUNC(fdim,fdimq);
    \n+
    308 DUNE_BINARY_ARITHMETIC_FUNC(fmax,fmaxq);
    \n+
    309 DUNE_BINARY_ARITHMETIC_FUNC(fmin,fminq);
    \n+
    310 DUNE_BINARY_ARITHMETIC_FUNC(fmod,fmodq);
    \n+
    311 DUNE_BINARY_ARITHMETIC_FUNC(hypot,hypotq);
    \n+
    312 DUNE_BINARY_ARITHMETIC_FUNC(remainder,remainderq);
    \n+
    313
    \n+
    314#undef DUNE_BINARY_ARITHMETIC_FUNC
    \n+
    315
    \n+
    316 // some more cmath functions with special signature
    \n+
    317
    \n+
    318 inline Float128 fma(const Float128& t, const Float128& u, const Float128& v)
    \n+
    319 {
    \n+
    320 return Float128{fmaq(float128_t(t),float128_t(u),float128_t(v))};
    \n+
    321 }
    \n+
    322
    \n+
    323 inline Float128 frexp(const Float128& u, int* p)
    \n+
    324 {
    \n+
    325 return Float128{frexpq(float128_t(u), p)};
    \n
    326 }
    \n-
    \n
    327
    \n-
    \n-\n-
    330 {
    \n-
    331 for (size_type i=0; i<rows(); i++)
    \n-
    332 (*this)[i] /= k;
    \n-
    333 return asImp();
    \n-
    334 }
    \n-
    \n-
    335
    \n-
    337 template <class Other>
    \n-
    \n-\n+
    328 inline Float128 ldexp(const Float128& u, int p)
    \n+
    329 {
    \n+
    330 return Float128{ldexpq(float128_t(u), p)};
    \n+
    331 }
    \n+
    332
    \n+
    333 inline Float128 remquo(const Float128& t, const Float128& u, int* quo)
    \n+
    334 {
    \n+
    335 return Float128{remquoq(float128_t(t), float128_t(u), quo)};
    \n+
    336 }
    \n+
    337
    \n+
    338 inline Float128 scalbln(const Float128& u, long int e)
    \n
    339 {
    \n-
    340 DUNE_ASSERT_BOUNDS(rows() == x.rows());
    \n-
    341 for( size_type i = 0; i < rows(); ++i )
    \n-
    342 (*this)[ i ].axpy( a, x[ i ] );
    \n-
    343 return asImp();
    \n-
    344 }
    \n-
    \n-
    345
    \n-
    347 template <class Other>
    \n-
    \n-
    348 bool operator== (const DenseMatrix<Other>& x) const
    \n-
    349 {
    \n-
    350 DUNE_ASSERT_BOUNDS(rows() == x.rows());
    \n-
    351 for (size_type i=0; i<rows(); i++)
    \n-
    352 if ((*this)[i]!=x[i])
    \n-
    353 return false;
    \n-
    354 return true;
    \n-
    355 }
    \n-
    \n-
    357 template <class Other>
    \n-
    \n-
    358 bool operator!= (const DenseMatrix<Other>& x) const
    \n-
    359 {
    \n-
    360 return !operator==(x);
    \n-
    361 }
    \n-
    \n+
    340 return Float128{scalblnq(float128_t(u), e)};
    \n+
    341 }
    \n+
    342
    \n+
    343 inline Float128 scalbn(const Float128& u, int e)
    \n+
    344 {
    \n+
    345 return Float128{scalbnq(float128_t(u), e)};
    \n+
    346 }
    \n+
    347
    \n+
    349 // NOTE: This is much faster than a pow(x, Float128(p)) call
    \n+
    350 // NOTE: This is a modified version of boost::math::cstdfloat::detail::pown
    \n+
    351 // (adapted to the type Float128) that is part of the Boost 1.65 Math toolkit 2.8.0
    \n+
    352 // and is implemented by Christopher Kormanyos, John Maddock, and Paul A. Bristow,
    \n+
    353 // distributed under the Boost Software License, Version 1.0
    \n+
    354 // (See http://www.boost.org/LICENSE_1_0.txt)
    \n+
    355 template <class Int,
    \n+
    356 std::enable_if_t<std::is_integral<Int>::value, int> = 0>
    \n+
    357 inline Float128 pow(const Float128& x, const Int p)
    \n+
    358 {
    \n+
    359 static const Float128 max_value = FLT128_MAX;
    \n+
    360 static const Float128 min_value = FLT128_MIN;
    \n+
    361 static const Float128 inf_value = float128_t{1} / float128_t{0};
    \n
    362
    \n-
    363
    \n-
    364 //===== linear maps
    \n-
    365
    \n-
    367 template<class X, class Y>
    \n-
    \n-
    368 void mv (const X& x, Y& y) const
    \n-
    369 {
    \n-
    370 auto&& xx = Impl::asVector(x);
    \n-
    371 auto&& yy = Impl::asVector(y);
    \n-
    372 DUNE_ASSERT_BOUNDS((void*)(&x) != (void*)(&y));
    \n-
    373 DUNE_ASSERT_BOUNDS(xx.N() == M());
    \n-
    374 DUNE_ASSERT_BOUNDS(yy.N() == N());
    \n-
    375
    \n-
    376 using y_field_type = typename FieldTraits<Y>::field_type;
    \n-
    377 for (size_type i=0; i<rows(); ++i)
    \n-
    378 {
    \n-
    379 yy[i] = y_field_type(0);
    \n-
    380 for (size_type j=0; j<cols(); j++)
    \n-
    381 yy[i] += (*this)[i][j] * xx[j];
    \n-
    382 }
    \n-
    383 }
    \n-
    \n-
    384
    \n-
    386 template< class X, class Y >
    \n-
    \n-
    387 void mtv ( const X &x, Y &y ) const
    \n-
    388 {
    \n-
    389 auto&& xx = Impl::asVector(x);
    \n-
    390 auto&& yy = Impl::asVector(y);
    \n-
    391 DUNE_ASSERT_BOUNDS((void*)(&x) != (void*)(&y));
    \n-
    392 DUNE_ASSERT_BOUNDS(xx.N() == N());
    \n-
    393 DUNE_ASSERT_BOUNDS(yy.N() == M());
    \n-
    394
    \n-
    395 using y_field_type = typename FieldTraits<Y>::field_type;
    \n-
    396 for(size_type i = 0; i < cols(); ++i)
    \n-
    397 {
    \n-
    398 yy[i] = y_field_type(0);
    \n-
    399 for(size_type j = 0; j < rows(); ++j)
    \n-
    400 yy[i] += (*this)[j][i] * xx[j];
    \n-
    401 }
    \n-
    402 }
    \n-
    \n-
    403
    \n-
    405 template<class X, class Y>
    \n-
    \n-
    406 void umv (const X& x, Y& y) const
    \n-
    407 {
    \n-
    408 auto&& xx = Impl::asVector(x);
    \n-
    409 auto&& yy = Impl::asVector(y);
    \n-
    410 DUNE_ASSERT_BOUNDS(xx.N() == M());
    \n-
    411 DUNE_ASSERT_BOUNDS(yy.N() == N());
    \n-
    412 for (size_type i=0; i<rows(); ++i)
    \n-
    413 for (size_type j=0; j<cols(); j++)
    \n-
    414 yy[i] += (*this)[i][j] * xx[j];
    \n-
    415 }
    \n-
    \n-
    416
    \n-
    418 template<class X, class Y>
    \n-
    \n-
    419 void umtv (const X& x, Y& y) const
    \n-
    420 {
    \n-
    421 auto&& xx = Impl::asVector(x);
    \n-
    422 auto&& yy = Impl::asVector(y);
    \n-
    423 DUNE_ASSERT_BOUNDS(xx.N() == N());
    \n-
    424 DUNE_ASSERT_BOUNDS(yy.N() == M());
    \n-
    425 for(size_type i = 0; i<rows(); ++i)
    \n-
    426 for (size_type j=0; j<cols(); j++)
    \n-
    427 yy[j] += (*this)[i][j]*xx[i];
    \n-
    428 }
    \n-
    \n-
    429
    \n-
    431 template<class X, class Y>
    \n-
    \n-
    432 void umhv (const X& x, Y& y) const
    \n-
    433 {
    \n-
    434 auto&& xx = Impl::asVector(x);
    \n-
    435 auto&& yy = Impl::asVector(y);
    \n-
    436 DUNE_ASSERT_BOUNDS(xx.N() == N());
    \n-
    437 DUNE_ASSERT_BOUNDS(yy.N() == M());
    \n-
    438 for (size_type i=0; i<rows(); i++)
    \n-
    439 for (size_type j=0; j<cols(); j++)
    \n-
    440 yy[j] += conjugateComplex((*this)[i][j])*xx[i];
    \n-
    441 }
    \n-
    \n-
    442
    \n-
    444 template<class X, class Y>
    \n-
    \n-
    445 void mmv (const X& x, Y& y) const
    \n-
    446 {
    \n-
    447 auto&& xx = Impl::asVector(x);
    \n-
    448 auto&& yy = Impl::asVector(y);
    \n-
    449 DUNE_ASSERT_BOUNDS(xx.N() == M());
    \n-
    450 DUNE_ASSERT_BOUNDS(yy.N() == N());
    \n-
    451 for (size_type i=0; i<rows(); i++)
    \n-
    452 for (size_type j=0; j<cols(); j++)
    \n-
    453 yy[i] -= (*this)[i][j] * xx[j];
    \n-
    454 }
    \n-
    \n-
    455
    \n-
    457 template<class X, class Y>
    \n-
    \n-
    458 void mmtv (const X& x, Y& y) const
    \n-
    459 {
    \n-
    460 auto&& xx = Impl::asVector(x);
    \n-
    461 auto&& yy = Impl::asVector(y);
    \n-
    462 DUNE_ASSERT_BOUNDS(xx.N() == N());
    \n-
    463 DUNE_ASSERT_BOUNDS(yy.N() == M());
    \n-
    464 for (size_type i=0; i<rows(); i++)
    \n-
    465 for (size_type j=0; j<cols(); j++)
    \n-
    466 yy[j] -= (*this)[i][j]*xx[i];
    \n-
    467 }
    \n-
    \n-
    468
    \n-
    470 template<class X, class Y>
    \n-
    \n-
    471 void mmhv (const X& x, Y& y) const
    \n-
    472 {
    \n-
    473 auto&& xx = Impl::asVector(x);
    \n-
    474 auto&& yy = Impl::asVector(y);
    \n-
    475 DUNE_ASSERT_BOUNDS(xx.N() == N());
    \n-
    476 DUNE_ASSERT_BOUNDS(yy.N() == M());
    \n-
    477 for (size_type i=0; i<rows(); i++)
    \n-
    478 for (size_type j=0; j<cols(); j++)
    \n-
    479 yy[j] -= conjugateComplex((*this)[i][j])*xx[i];
    \n-
    480 }
    \n-
    \n-
    481
    \n-
    483 template<class X, class Y>
    \n-
    \n-
    484 void usmv (const typename FieldTraits<Y>::field_type & alpha,
    \n-
    485 const X& x, Y& y) const
    \n-
    486 {
    \n-
    487 auto&& xx = Impl::asVector(x);
    \n-
    488 auto&& yy = Impl::asVector(y);
    \n-
    489 DUNE_ASSERT_BOUNDS(xx.N() == M());
    \n-
    490 DUNE_ASSERT_BOUNDS(yy.N() == N());
    \n-
    491 for (size_type i=0; i<rows(); i++)
    \n-
    492 for (size_type j=0; j<cols(); j++)
    \n-
    493 yy[i] += alpha * (*this)[i][j] * xx[j];
    \n-
    494 }
    \n-
    \n-
    495
    \n-
    497 template<class X, class Y>
    \n-
    \n-
    498 void usmtv (const typename FieldTraits<Y>::field_type & alpha,
    \n-
    499 const X& x, Y& y) const
    \n-
    500 {
    \n-
    501 auto&& xx = Impl::asVector(x);
    \n-
    502 auto&& yy = Impl::asVector(y);
    \n-
    503 DUNE_ASSERT_BOUNDS(xx.N() == N());
    \n-
    504 DUNE_ASSERT_BOUNDS(yy.N() == M());
    \n-
    505 for (size_type i=0; i<rows(); i++)
    \n-
    506 for (size_type j=0; j<cols(); j++)
    \n-
    507 yy[j] += alpha*(*this)[i][j]*xx[i];
    \n-
    508 }
    \n-
    \n-
    509
    \n-
    511 template<class X, class Y>
    \n-
    \n-
    512 void usmhv (const typename FieldTraits<Y>::field_type & alpha,
    \n-
    513 const X& x, Y& y) const
    \n-
    514 {
    \n-
    515 auto&& xx = Impl::asVector(x);
    \n-
    516 auto&& yy = Impl::asVector(y);
    \n-
    517 DUNE_ASSERT_BOUNDS(xx.N() == N());
    \n-
    518 DUNE_ASSERT_BOUNDS(yy.N() == M());
    \n-
    519 for (size_type i=0; i<rows(); i++)
    \n-
    520 for (size_type j=0; j<cols(); j++)
    \n-
    521 yy[j] +=
    \n-
    522 alpha*conjugateComplex((*this)[i][j])*xx[i];
    \n-
    523 }
    \n-
    \n-
    524
    \n-
    525 //===== norms
    \n-
    526
    \n-
    \n-\n-
    529 {
    \n-
    530 typename FieldTraits<value_type>::real_type sum=(0.0);
    \n-
    531 for (size_type i=0; i<rows(); ++i) sum += (*this)[i].two_norm2();
    \n-
    532 return fvmeta::sqrt(sum);
    \n-
    533 }
    \n-
    \n-
    534
    \n-
    \n-\n-
    537 {
    \n-
    538 typename FieldTraits<value_type>::real_type sum=(0.0);
    \n-
    539 for (size_type i=0; i<rows(); ++i) sum += (*this)[i].two_norm2();
    \n-
    540 return sum;
    \n-
    541 }
    \n-
    \n-
    542
    \n-
    544 template <typename vt = value_type,
    \n-
    545 typename std::enable_if<!HasNaN<vt>::value, int>::type = 0>
    \n-
    \n-\n-
    547 using real_type = typename FieldTraits<vt>::real_type;
    \n-
    548 using std::max;
    \n-
    549
    \n-
    550 real_type norm = 0;
    \n-
    551 for (auto const &x : *this) {
    \n-
    552 real_type const a = x.one_norm();
    \n-
    553 norm = max(a, norm);
    \n-
    554 }
    \n-
    555 return norm;
    \n-
    556 }
    \n-
    \n-
    557
    \n-
    559 template <typename vt = value_type,
    \n-
    560 typename std::enable_if<!HasNaN<vt>::value, int>::type = 0>
    \n-
    \n-\n-
    562 using real_type = typename FieldTraits<vt>::real_type;
    \n-
    563 using std::max;
    \n-
    564
    \n-
    565 real_type norm = 0;
    \n-
    566 for (auto const &x : *this) {
    \n-
    567 real_type const a = x.one_norm_real();
    \n-
    568 norm = max(a, norm);
    \n-
    569 }
    \n-
    570 return norm;
    \n-
    571 }
    \n-
    \n-
    572
    \n-
    574 template <typename vt = value_type,
    \n-
    575 typename std::enable_if<HasNaN<vt>::value, int>::type = 0>
    \n-
    \n-\n-
    577 using real_type = typename FieldTraits<vt>::real_type;
    \n-
    578 using std::max;
    \n-
    579
    \n-
    580 real_type norm = 0;
    \n-
    581 real_type isNaN = 1;
    \n-
    582 for (auto const &x : *this) {
    \n-
    583 real_type const a = x.one_norm();
    \n-
    584 norm = max(a, norm);
    \n-
    585 isNaN += a;
    \n-
    586 }
    \n-
    587 return norm * (isNaN / isNaN);
    \n-
    588 }
    \n-
    \n-
    589
    \n-
    591 template <typename vt = value_type,
    \n-
    592 typename std::enable_if<HasNaN<vt>::value, int>::type = 0>
    \n-
    \n-\n-
    594 using real_type = typename FieldTraits<vt>::real_type;
    \n-
    595 using std::max;
    \n-
    596
    \n-
    597 real_type norm = 0;
    \n-
    598 real_type isNaN = 1;
    \n-
    599 for (auto const &x : *this) {
    \n-
    600 real_type const a = x.one_norm_real();
    \n-
    601 norm = max(a, norm);
    \n-
    602 isNaN += a;
    \n-
    603 }
    \n-
    604 return norm * (isNaN / isNaN);
    \n-
    605 }
    \n-
    \n-
    606
    \n-
    607 //===== solve
    \n-
    608
    \n-
    613 template <class V1, class V2>
    \n-
    614 void solve (V1& x, const V2& b, bool doPivoting = true) const;
    \n-
    615
    \n-
    620 void invert(bool doPivoting = true);
    \n-
    621
    \n-
    623 field_type determinant (bool doPivoting = true) const;
    \n-
    624
    \n-
    626 template<typename M2>
    \n-
    \n-\n-
    628 {
    \n-
    629 DUNE_ASSERT_BOUNDS(M.rows() == M.cols());
    \n-
    630 DUNE_ASSERT_BOUNDS(M.rows() == rows());
    \n-
    631 AutonomousValue<MAT> C(asImp());
    \n-
    632
    \n-
    633 for (size_type i=0; i<rows(); i++)
    \n-
    634 for (size_type j=0; j<cols(); j++) {
    \n-
    635 (*this)[i][j] = 0;
    \n-
    636 for (size_type k=0; k<rows(); k++)
    \n-
    637 (*this)[i][j] += M[i][k]*C[k][j];
    \n-
    638 }
    \n-
    639
    \n-
    640 return asImp();
    \n-
    641 }
    \n-
    \n-
    642
    \n-
    644 template<typename M2>
    \n-
    \n-\n-
    646 {
    \n-
    647 DUNE_ASSERT_BOUNDS(M.rows() == M.cols());
    \n-
    648 DUNE_ASSERT_BOUNDS(M.cols() == cols());
    \n-
    649 AutonomousValue<MAT> C(asImp());
    \n-
    650
    \n-
    651 for (size_type i=0; i<rows(); i++)
    \n-
    652 for (size_type j=0; j<cols(); j++) {
    \n-
    653 (*this)[i][j] = 0;
    \n-
    654 for (size_type k=0; k<cols(); k++)
    \n-
    655 (*this)[i][j] += C[i][k]*M[k][j];
    \n-
    656 }
    \n-
    657 return asImp();
    \n-
    658 }
    \n-
    \n-
    659
    \n-
    660#if 0
    \n-
    662 template<int l>
    \n-
    663 DenseMatrix<K,l,cols> leftmultiplyany (const FieldMatrix<K,l,rows>& M) const
    \n-
    664 {
    \n-\n-
    666
    \n-
    667 for (size_type i=0; i<l; i++) {
    \n-
    668 for (size_type j=0; j<cols(); j++) {
    \n-
    669 C[i][j] = 0;
    \n-
    670 for (size_type k=0; k<rows(); k++)
    \n-
    671 C[i][j] += M[i][k]*(*this)[k][j];
    \n-
    672 }
    \n-
    673 }
    \n-
    674 return C;
    \n-
    675 }
    \n-
    676
    \n-
    678 template<int l>
    \n-
    679 FieldMatrix<K,rows,l> rightmultiplyany (const FieldMatrix<K,cols,l>& M) const
    \n-
    680 {
    \n-
    681 FieldMatrix<K,rows,l> C;
    \n-
    682
    \n-
    683 for (size_type i=0; i<rows(); i++) {
    \n-
    684 for (size_type j=0; j<l; j++) {
    \n-
    685 C[i][j] = 0;
    \n-
    686 for (size_type k=0; k<cols(); k++)
    \n-
    687 C[i][j] += (*this)[i][k]*M[k][j];
    \n-
    688 }
    \n-
    689 }
    \n-
    690 return C;
    \n-
    691 }
    \n-
    692#endif
    \n-
    693
    \n-
    694 //===== sizes
    \n-
    695
    \n-
    \n-
    697 constexpr size_type N () const
    \n-
    698 {
    \n-
    699 return rows();
    \n-
    700 }
    \n-
    \n-
    701
    \n-
    \n-
    703 constexpr size_type M () const
    \n-
    704 {
    \n-
    705 return cols();
    \n-
    706 }
    \n-
    \n-
    707
    \n-
    \n-
    709 constexpr size_type rows() const
    \n-
    710 {
    \n-
    711 return asImp().mat_rows();
    \n-
    712 }
    \n-
    \n-
    713
    \n-
    \n-
    715 constexpr size_type cols() const
    \n-
    716 {
    \n-
    717 return asImp().mat_cols();
    \n-
    718 }
    \n-
    \n-
    719
    \n-
    720 //===== query
    \n-
    721
    \n-
    \n-
    723 bool exists ([[maybe_unused]] size_type i, [[maybe_unused]] size_type j) const
    \n-
    724 {
    \n-
    725 DUNE_ASSERT_BOUNDS(i >= 0 && i < rows());
    \n-
    726 DUNE_ASSERT_BOUNDS(j >= 0 && j < cols());
    \n-
    727 return true;
    \n-
    728 }
    \n-
    \n-
    729
    \n-
    730 protected:
    \n-
    731
    \n-
    732#ifndef DOXYGEN
    \n-
    733 struct ElimPivot
    \n-
    734 {
    \n-
    735 ElimPivot(std::vector<simd_index_type> & pivot);
    \n-
    736
    \n-
    737 void swap(std::size_t i, simd_index_type j);
    \n-
    738
    \n-
    739 template<typename T>
    \n-
    740 void operator()(const T&, int, int)
    \n-
    741 {}
    \n-
    742
    \n-
    743 std::vector<simd_index_type> & pivot_;
    \n-
    744 };
    \n-
    745
    \n-
    746 template<typename V>
    \n-
    747 struct Elim
    \n-
    748 {
    \n-
    749 Elim(V& rhs);
    \n-
    750
    \n-
    751 void swap(std::size_t i, simd_index_type j);
    \n-
    752
    \n-
    753 void operator()(const typename V::field_type& factor, int k, int i);
    \n-
    754
    \n-
    755 V* rhs_;
    \n-
    756 };
    \n-
    757
    \n-
    758 struct ElimDet
    \n-
    759 {
    \n-
    760 ElimDet(field_type& sign) : sign_(sign)
    \n-
    761 { sign_ = 1; }
    \n-
    762
    \n-
    763 void swap(std::size_t i, simd_index_type j)
    \n-
    764 {
    \n-
    765 sign_ *=
    \n-
    766 Simd::cond(simd_index_type(i) == j, field_type(1), field_type(-1));
    \n-
    767 }
    \n-
    768
    \n-
    769 void operator()(const field_type&, int, int)
    \n-
    770 {}
    \n-
    771
    \n-
    772 field_type& sign_;
    \n-
    773 };
    \n-
    774#endif // DOXYGEN
    \n-
    775
    \n-
    777
    \n-
    815 template<class Func, class Mask>
    \n-
    816 static void luDecomposition(DenseMatrix<MAT>& A, Func func,
    \n-
    817 Mask &nonsingularLanes, bool throwEarly, bool doPivoting);
    \n-
    818 };
    \n-
    \n-
    819
    \n-
    820#ifndef DOXYGEN
    \n-
    821 template<typename MAT>
    \n-
    822 DenseMatrix<MAT>::ElimPivot::ElimPivot(std::vector<simd_index_type> & pivot)
    \n-
    823 : pivot_(pivot)
    \n-
    824 {
    \n-
    825 typedef typename std::vector<size_type>::size_type size_type;
    \n-
    826 for(size_type i=0; i < pivot_.size(); ++i) pivot_[i]=i;
    \n-
    827 }
    \n-
    828
    \n-
    829 template<typename MAT>
    \n-
    830 void DenseMatrix<MAT>::ElimPivot::swap(std::size_t i, simd_index_type j)
    \n-
    831 {
    \n-
    832 pivot_[i] =
    \n-
    833 Simd::cond(Simd::Scalar<simd_index_type>(i) == j, pivot_[i], j);
    \n-
    834 }
    \n-
    835
    \n-
    836 template<typename MAT>
    \n-
    837 template<typename V>
    \n-
    838 DenseMatrix<MAT>::Elim<V>::Elim(V& rhs)
    \n-
    839 : rhs_(&rhs)
    \n-
    840 {}
    \n-
    841
    \n-
    842 template<typename MAT>
    \n-
    843 template<typename V>
    \n-
    844 void DenseMatrix<MAT>::Elim<V>::swap(std::size_t i, simd_index_type j)
    \n-
    845 {
    \n-
    846 using std::swap;
    \n-
    847
    \n-
    848 // see the comment in luDecomposition()
    \n-
    849 for(std::size_t l = 0; l < Simd::lanes(j); ++l)
    \n-
    850 swap(Simd::lane(l, (*rhs_)[ i ]),
    \n-
    851 Simd::lane(l, (*rhs_)[Simd::lane(l, j)]));
    \n-
    852 }
    \n-
    853
    \n-
    854 template<typename MAT>
    \n-
    855 template<typename V>
    \n-
    856 void DenseMatrix<MAT>::
    \n-
    857 Elim<V>::operator()(const typename V::field_type& factor, int k, int i)
    \n-
    858 {
    \n-
    859 (*rhs_)[k] -= factor*(*rhs_)[i];
    \n-
    860 }
    \n-
    861
    \n-
    862 template<typename MAT>
    \n-
    863 template<typename Func, class Mask>
    \n-
    864 inline void DenseMatrix<MAT>::
    \n-
    865 luDecomposition(DenseMatrix<MAT>& A, Func func, Mask &nonsingularLanes,
    \n-
    866 bool throwEarly, bool doPivoting)
    \n-
    867 {
    \n-
    868 using std::max;
    \n-
    869 using std::swap;
    \n-
    870
    \n-
    871 typedef typename FieldTraits<value_type>::real_type real_type;
    \n-
    872
    \n-
    873 // LU decomposition of A in A
    \n-
    874 for (size_type i=0; i<A.rows(); i++) // loop over all rows
    \n-
    875 {
    \n-
    876 real_type pivmax = fvmeta::absreal(A[i][i]);
    \n-
    877
    \n-
    878 if (doPivoting)
    \n-
    879 {
    \n-
    880 // compute maximum of column
    \n-
    881 simd_index_type imax=i;
    \n-
    882 for (size_type k=i+1; k<A.rows(); k++)
    \n-
    883 {
    \n-
    884 auto abs = fvmeta::absreal(A[k][i]);
    \n-
    885 auto mask = abs > pivmax;
    \n-
    886 pivmax = Simd::cond(mask, abs, pivmax);
    \n-
    887 imax = Simd::cond(mask, simd_index_type(k), imax);
    \n-
    888 }
    \n-
    889 // swap rows
    \n-
    890 for (size_type j=0; j<A.rows(); j++)
    \n-
    891 {
    \n-
    892 // This is a swap operation where the second operand is scattered,
    \n-
    893 // and on top of that is also extracted from deep within a
    \n-
    894 // moderately complicated data structure (a DenseMatrix), where we
    \n-
    895 // can't assume much on the memory layout. On intel processors,
    \n-
    896 // the only instruction that might help us here is vgather, but it
    \n-
    897 // is unclear whether that is even faster than a software
    \n-
    898 // implementation, and we would also need vscatter which does not
    \n-
    899 // exist. So break vectorization here and do it manually.
    \n-
    900 for(std::size_t l = 0; l < Simd::lanes(A[i][j]); ++l)
    \n-
    901 swap(Simd::lane(l, A[i][j]),
    \n-
    902 Simd::lane(l, A[Simd::lane(l, imax)][j]));
    \n-
    903 }
    \n-
    904 func.swap(i, imax); // swap the pivot or rhs
    \n-
    905 }
    \n-
    906
    \n-
    907 // singular ?
    \n-
    908 nonsingularLanes = nonsingularLanes && (pivmax != real_type(0));
    \n-
    909 if (throwEarly) {
    \n-
    910 if(!Simd::allTrue(nonsingularLanes))
    \n-
    911 DUNE_THROW(FMatrixError, "matrix is singular");
    \n-
    912 }
    \n-
    913 else { // !throwEarly
    \n-
    914 if(!Simd::anyTrue(nonsingularLanes))
    \n-
    915 return;
    \n-
    916 }
    \n-
    917
    \n-
    918 // eliminate
    \n-
    919 for (size_type k=i+1; k<A.rows(); k++)
    \n-
    920 {
    \n-
    921 // in the simd case, A[i][i] may be close to zero in some lanes. Pray
    \n-
    922 // that the result is no worse than a quiet NaN.
    \n-
    923 field_type factor = A[k][i]/A[i][i];
    \n-
    924 A[k][i] = factor;
    \n-
    925 for (size_type j=i+1; j<A.rows(); j++)
    \n-
    926 A[k][j] -= factor*A[i][j];
    \n-
    927 func(factor, k, i);
    \n-
    928 }
    \n-
    929 }
    \n-
    930 }
    \n-
    931
    \n-
    932 template<typename MAT>
    \n-
    933 template <class V1, class V2>
    \n-
    934 inline void DenseMatrix<MAT>::solve(V1& x, const V2& b, bool doPivoting) const
    \n-
    935 {
    \n-
    936 using real_type = typename FieldTraits<value_type>::real_type;
    \n-
    937 // never mind those ifs, because they get optimized away
    \n-
    938 if (rows()!=cols())
    \n-
    939 DUNE_THROW(FMatrixError, "Can't solve for a " << rows() << "x" << cols() << " matrix!");
    \n-
    940
    \n-
    941 if (rows()==1) {
    \n-
    942
    \n-
    943#ifdef DUNE_FMatrix_WITH_CHECKING
    \n-
    944 if (Simd::anyTrue(fvmeta::absreal((*this)[0][0])
    \n-\n-
    946 DUNE_THROW(FMatrixError,"matrix is singular");
    \n-
    947#endif
    \n-
    948 x[0] = b[0]/(*this)[0][0];
    \n-
    949
    \n-
    950 }
    \n-
    951 else if (rows()==2) {
    \n-
    952
    \n-
    953 field_type detinv = (*this)[0][0]*(*this)[1][1]-(*this)[0][1]*(*this)[1][0];
    \n-
    954#ifdef DUNE_FMatrix_WITH_CHECKING
    \n-
    955 if (Simd::anyTrue(fvmeta::absreal(detinv)
    \n-\n-
    957 DUNE_THROW(FMatrixError,"matrix is singular");
    \n-
    958#endif
    \n-
    959 detinv = real_type(1.0)/detinv;
    \n-
    960
    \n-
    961 x[0] = detinv*((*this)[1][1]*b[0]-(*this)[0][1]*b[1]);
    \n-
    962 x[1] = detinv*((*this)[0][0]*b[1]-(*this)[1][0]*b[0]);
    \n-
    963
    \n-
    964 }
    \n-
    965 else if (rows()==3) {
    \n-
    966
    \n-
    967 field_type d = determinant(doPivoting);
    \n-
    968#ifdef DUNE_FMatrix_WITH_CHECKING
    \n-
    969 if (Simd::anyTrue(fvmeta::absreal(d)
    \n-\n-
    971 DUNE_THROW(FMatrixError,"matrix is singular");
    \n-
    972#endif
    \n-
    973
    \n-
    974 x[0] = (b[0]*(*this)[1][1]*(*this)[2][2] - b[0]*(*this)[2][1]*(*this)[1][2]
    \n-
    975 - b[1] *(*this)[0][1]*(*this)[2][2] + b[1]*(*this)[2][1]*(*this)[0][2]
    \n-
    976 + b[2] *(*this)[0][1]*(*this)[1][2] - b[2]*(*this)[1][1]*(*this)[0][2]) / d;
    \n-
    977
    \n-
    978 x[1] = ((*this)[0][0]*b[1]*(*this)[2][2] - (*this)[0][0]*b[2]*(*this)[1][2]
    \n-
    979 - (*this)[1][0] *b[0]*(*this)[2][2] + (*this)[1][0]*b[2]*(*this)[0][2]
    \n-
    980 + (*this)[2][0] *b[0]*(*this)[1][2] - (*this)[2][0]*b[1]*(*this)[0][2]) / d;
    \n-
    981
    \n-
    982 x[2] = ((*this)[0][0]*(*this)[1][1]*b[2] - (*this)[0][0]*(*this)[2][1]*b[1]
    \n-
    983 - (*this)[1][0] *(*this)[0][1]*b[2] + (*this)[1][0]*(*this)[2][1]*b[0]
    \n-
    984 + (*this)[2][0] *(*this)[0][1]*b[1] - (*this)[2][0]*(*this)[1][1]*b[0]) / d;
    \n-
    985
    \n-
    986 }
    \n-
    987 else {
    \n-
    988
    \n-
    989 V1& rhs = x; // use x to store rhs
    \n-
    990 rhs = b; // copy data
    \n-
    991 Elim<V1> elim(rhs);
    \n-
    992 AutonomousValue<MAT> A(asImp());
    \n-
    993 Simd::Mask<typename FieldTraits<value_type>::real_type>
    \n-
    994 nonsingularLanes(true);
    \n-
    995
    \n-
    996 AutonomousValue<MAT>::luDecomposition(A, elim, nonsingularLanes, true, doPivoting);
    \n-
    997
    \n-
    998 // backsolve
    \n-
    999 for(int i=rows()-1; i>=0; i--) {
    \n-
    1000 for (size_type j=i+1; j<rows(); j++)
    \n-
    1001 rhs[i] -= A[i][j]*x[j];
    \n-
    1002 x[i] = rhs[i]/A[i][i];
    \n-
    1003 }
    \n-
    1004 }
    \n-
    1005 }
    \n-
    1006
    \n-
    1007 template<typename MAT>
    \n-
    1008 inline void DenseMatrix<MAT>::invert(bool doPivoting)
    \n-
    1009 {
    \n-
    1010 using real_type = typename FieldTraits<MAT>::real_type;
    \n-
    1011 using std::swap;
    \n-
    1012
    \n-
    1013 // never mind those ifs, because they get optimized away
    \n-
    1014 if (rows()!=cols())
    \n-
    1015 DUNE_THROW(FMatrixError, "Can't invert a " << rows() << "x" << cols() << " matrix!");
    \n-
    1016
    \n-
    1017 if (rows()==1) {
    \n-
    1018
    \n-
    1019#ifdef DUNE_FMatrix_WITH_CHECKING
    \n-
    1020 if (Simd::anyTrue(fvmeta::absreal((*this)[0][0])
    \n-\n-
    1022 DUNE_THROW(FMatrixError,"matrix is singular");
    \n-
    1023#endif
    \n-
    1024 (*this)[0][0] = real_type( 1 ) / (*this)[0][0];
    \n-
    1025
    \n-
    1026 }
    \n-
    1027 else if (rows()==2) {
    \n-
    1028
    \n-
    1029 field_type detinv = (*this)[0][0]*(*this)[1][1]-(*this)[0][1]*(*this)[1][0];
    \n-
    1030#ifdef DUNE_FMatrix_WITH_CHECKING
    \n-
    1031 if (Simd::anyTrue(fvmeta::absreal(detinv)
    \n-\n-
    1033 DUNE_THROW(FMatrixError,"matrix is singular");
    \n-
    1034#endif
    \n-
    1035 detinv = real_type( 1 ) / detinv;
    \n-
    1036
    \n-
    1037 field_type temp=(*this)[0][0];
    \n-
    1038 (*this)[0][0] = (*this)[1][1]*detinv;
    \n-
    1039 (*this)[0][1] = -(*this)[0][1]*detinv;
    \n-
    1040 (*this)[1][0] = -(*this)[1][0]*detinv;
    \n-
    1041 (*this)[1][1] = temp*detinv;
    \n-
    1042
    \n-
    1043 }
    \n-
    1044 else if (rows()==3)
    \n-
    1045 {
    \n-
    1046 using K = field_type;
    \n-
    1047 // code generated by maple
    \n-
    1048 K t4 = (*this)[0][0] * (*this)[1][1];
    \n-
    1049 K t6 = (*this)[0][0] * (*this)[1][2];
    \n-
    1050 K t8 = (*this)[0][1] * (*this)[1][0];
    \n-
    1051 K t10 = (*this)[0][2] * (*this)[1][0];
    \n-
    1052 K t12 = (*this)[0][1] * (*this)[2][0];
    \n-
    1053 K t14 = (*this)[0][2] * (*this)[2][0];
    \n-
    1054
    \n-
    1055 K det = (t4*(*this)[2][2]-t6*(*this)[2][1]-t8*(*this)[2][2]+
    \n-
    1056 t10*(*this)[2][1]+t12*(*this)[1][2]-t14*(*this)[1][1]);
    \n-
    1057 K t17 = K(1.0)/det;
    \n-
    1058
    \n-
    1059 K matrix01 = (*this)[0][1];
    \n-
    1060 K matrix00 = (*this)[0][0];
    \n-
    1061 K matrix10 = (*this)[1][0];
    \n-
    1062 K matrix11 = (*this)[1][1];
    \n-
    1063
    \n-
    1064 (*this)[0][0] = ((*this)[1][1] * (*this)[2][2] - (*this)[1][2] * (*this)[2][1])*t17;
    \n-
    1065 (*this)[0][1] = -((*this)[0][1] * (*this)[2][2] - (*this)[0][2] * (*this)[2][1])*t17;
    \n-
    1066 (*this)[0][2] = (matrix01 * (*this)[1][2] - (*this)[0][2] * (*this)[1][1])*t17;
    \n-
    1067 (*this)[1][0] = -((*this)[1][0] * (*this)[2][2] - (*this)[1][2] * (*this)[2][0])*t17;
    \n-
    1068 (*this)[1][1] = (matrix00 * (*this)[2][2] - t14) * t17;
    \n-
    1069 (*this)[1][2] = -(t6-t10) * t17;
    \n-
    1070 (*this)[2][0] = (matrix10 * (*this)[2][1] - matrix11 * (*this)[2][0]) * t17;
    \n-
    1071 (*this)[2][1] = -(matrix00 * (*this)[2][1] - t12) * t17;
    \n-
    1072 (*this)[2][2] = (t4-t8) * t17;
    \n-
    1073 }
    \n-
    1074 else {
    \n-
    1075 using std::swap;
    \n-
    1076
    \n-
    1077 AutonomousValue<MAT> A(asImp());
    \n-
    1078 std::vector<simd_index_type> pivot(rows());
    \n-
    1079 Simd::Mask<typename FieldTraits<value_type>::real_type>
    \n-
    1080 nonsingularLanes(true);
    \n-
    1081 AutonomousValue<MAT>::luDecomposition(A, ElimPivot(pivot), nonsingularLanes, true, doPivoting);
    \n-
    1082 auto& L=A;
    \n-
    1083 auto& U=A;
    \n-
    1084
    \n-
    1085 // initialize inverse
    \n-
    1086 *this=field_type();
    \n-
    1087
    \n-
    1088 for(size_type i=0; i<rows(); ++i)
    \n-
    1089 (*this)[i][i]=1;
    \n-
    1090
    \n-
    1091 // L Y = I; multiple right hand sides
    \n-
    1092 for (size_type i=0; i<rows(); i++)
    \n-
    1093 for (size_type j=0; j<i; j++)
    \n-
    1094 for (size_type k=0; k<rows(); k++)
    \n-
    1095 (*this)[i][k] -= L[i][j]*(*this)[j][k];
    \n-
    1096
    \n-
    1097 // U A^{-1} = Y
    \n-
    1098 for (size_type i=rows(); i>0;) {
    \n-
    1099 --i;
    \n-
    1100 for (size_type k=0; k<rows(); k++) {
    \n-
    1101 for (size_type j=i+1; j<rows(); j++)
    \n-
    1102 (*this)[i][k] -= U[i][j]*(*this)[j][k];
    \n-
    1103 (*this)[i][k] /= U[i][i];
    \n-
    1104 }
    \n-
    1105 }
    \n-
    1106
    \n-
    1107 for(size_type i=rows(); i>0; ) {
    \n-
    1108 --i;
    \n-
    1109 for(std::size_t l = 0; l < Simd::lanes((*this)[0][0]); ++l)
    \n-
    1110 {
    \n-
    1111 std::size_t pi = Simd::lane(l, pivot[i]);
    \n-
    1112 if(i!=pi)
    \n-
    1113 for(size_type j=0; j<rows(); ++j)
    \n-
    1114 swap(Simd::lane(l, (*this)[j][pi]),
    \n-
    1115 Simd::lane(l, (*this)[j][ i]));
    \n-
    1116 }
    \n-
    1117 }
    \n-
    1118 }
    \n-
    1119 }
    \n-
    1120
    \n-
    1121 // implementation of the determinant
    \n-
    1122 template<typename MAT>
    \n-
    1123 inline typename DenseMatrix<MAT>::field_type
    \n-
    1124 DenseMatrix<MAT>::determinant(bool doPivoting) const
    \n-
    1125 {
    \n-
    1126 // never mind those ifs, because they get optimized away
    \n-
    1127 if (rows()!=cols())
    \n-
    1128 DUNE_THROW(FMatrixError, "There is no determinant for a " << rows() << "x" << cols() << " matrix!");
    \n-
    1129
    \n-
    1130 if (rows()==1)
    \n-
    1131 return (*this)[0][0];
    \n-
    1132
    \n-
    1133 if (rows()==2)
    \n-
    1134 return (*this)[0][0]*(*this)[1][1] - (*this)[0][1]*(*this)[1][0];
    \n-
    1135
    \n-
    1136 if (rows()==3) {
    \n-
    1137 // code generated by maple
    \n-
    1138 field_type t4 = (*this)[0][0] * (*this)[1][1];
    \n-
    1139 field_type t6 = (*this)[0][0] * (*this)[1][2];
    \n-
    1140 field_type t8 = (*this)[0][1] * (*this)[1][0];
    \n-
    1141 field_type t10 = (*this)[0][2] * (*this)[1][0];
    \n-
    1142 field_type t12 = (*this)[0][1] * (*this)[2][0];
    \n-
    1143 field_type t14 = (*this)[0][2] * (*this)[2][0];
    \n-
    1144
    \n-
    1145 return (t4*(*this)[2][2]-t6*(*this)[2][1]-t8*(*this)[2][2]+
    \n-
    1146 t10*(*this)[2][1]+t12*(*this)[1][2]-t14*(*this)[1][1]);
    \n-
    1147
    \n-
    1148 }
    \n-
    1149
    \n-
    1150 AutonomousValue<MAT> A(asImp());
    \n-
    1151 field_type det;
    \n-
    1152 Simd::Mask<typename FieldTraits<value_type>::real_type>
    \n-
    1153 nonsingularLanes(true);
    \n-
    1154
    \n-
    1155 AutonomousValue<MAT>::luDecomposition(A, ElimDet(det), nonsingularLanes, false, doPivoting);
    \n-
    1156 det = Simd::cond(nonsingularLanes, det, field_type(0));
    \n-
    1157
    \n-
    1158 for (size_type i = 0; i < rows(); ++i)
    \n-
    1159 det *= A[i][i];
    \n-
    1160 return det;
    \n-
    1161 }
    \n-
    1162
    \n-
    1163#endif // DOXYGEN
    \n-
    1164
    \n-
    \n-
    1165 namespace DenseMatrixHelp {
    \n-
    1166
    \n-
    1168 template <typename MAT, typename V1, typename V2>
    \n-
    \n-
    1169 static inline void multAssign(const DenseMatrix<MAT> &matrix, const DenseVector<V1> & x, DenseVector<V2> & ret)
    \n-
    1170 {
    \n-
    1171 DUNE_ASSERT_BOUNDS(x.size() == matrix.cols());
    \n-
    1172 DUNE_ASSERT_BOUNDS(ret.size() == matrix.rows());
    \n-
    1173 typedef typename DenseMatrix<MAT>::size_type size_type;
    \n-
    1174
    \n-
    1175 for(size_type i=0; i<matrix.rows(); ++i)
    \n-
    1176 {
    \n-
    1177 ret[i] = 0.0;
    \n-
    1178 for(size_type j=0; j<matrix.cols(); ++j)
    \n-
    1179 {
    \n-
    1180 ret[i] += matrix[i][j]*x[j];
    \n-
    1181 }
    \n-
    1182 }
    \n-
    1183 }
    \n-
    \n-
    1184
    \n-
    1185#if 0
    \n-
    1187 template <typename K, int rows, int cols>
    \n-
    1188 static inline void multAssignTransposed( const FieldMatrix<K,rows,cols> &matrix, const FieldVector<K,rows> & x, FieldVector<K,cols> & ret)
    \n-
    1189 {
    \n-
    1190 typedef typename FieldMatrix<K,rows,cols>::size_type size_type;
    \n-
    1191
    \n-
    1192 for(size_type i=0; i<cols(); ++i)
    \n-
    1193 {
    \n-
    1194 ret[i] = 0.0;
    \n-
    1195 for(size_type j=0; j<rows(); ++j)
    \n-
    1196 ret[i] += matrix[j][i]*x[j];
    \n-
    1197 }
    \n-
    1198 }
    \n-
    1199
    \n-
    1201 template <typename K, int rows, int cols>
    \n-
    1202 static inline FieldVector<K,rows> mult(const FieldMatrix<K,rows,cols> &matrix, const FieldVector<K,cols> & x)
    \n-
    1203 {
    \n-
    1204 FieldVector<K,rows> ret;
    \n-
    1205 multAssign(matrix,x,ret);
    \n-
    1206 return ret;
    \n-
    1207 }
    \n-
    1208
    \n-
    1210 template <typename K, int rows, int cols>
    \n-
    1211 static inline FieldVector<K,cols> multTransposed(const FieldMatrix<K,rows,cols> &matrix, const FieldVector<K,rows> & x)
    \n-
    1212 {
    \n-
    1213 FieldVector<K,cols> ret;
    \n-
    1214 multAssignTransposed( matrix, x, ret );
    \n-
    1215 return ret;
    \n-
    1216 }
    \n-
    1217#endif
    \n-
    1218
    \n-
    1219 } // end namespace DenseMatrixHelp
    \n-
    \n-
    1220
    \n-
    1222 template<typename MAT>
    \n-
    \n-
    1223 std::ostream& operator<< (std::ostream& s, const DenseMatrix<MAT>& a)
    \n-
    1224 {
    \n-
    1225 for (typename DenseMatrix<MAT>::size_type i=0; i<a.rows(); i++)
    \n-
    1226 s << a[i] << std::endl;
    \n-
    1227 return s;
    \n-
    1228 }
    \n-
    \n-
    1229
    \n-
    1232} // end namespace Dune
    \n-
    1233
    \n-
    1234#endif
    \n-
    Some useful basic math stuff.
    \n-
    A free function to provide the demangled class name of a given object or type as a string.
    \n-
    Various precision settings for calculations with FieldMatrix and FieldVector.
    \n-
    Implements a scalar vector view wrapper around an existing scalar.
    \n-
    Traits for type conversions and type information.
    \n-
    Macro for wrapping boundary checks.
    \n-
    Implements a vector constructed from a given type representing a field and a compile-time given size.
    \n-
    A few common exception classes.
    \n-
    #define DUNE_ASSERT_BOUNDS(cond)
    If DUNE_CHECK_BOUNDS is defined: check if condition cond holds; otherwise, do nothing.
    Definition boundschecking.hh:30
    \n-
    typename AutonomousValueType< T >::type AutonomousValue
    Type free of internal references that T can be converted to.
    Definition typetraits.hh:588
    \n+
    363 const bool isneg = (x < 0);
    \n+
    364 const bool isnan = (x != x);
    \n+
    365 const bool isinf = (isneg ? bool(-x > max_value) : bool(+x > max_value));
    \n+
    366
    \n+
    367 if (isnan) { return x; }
    \n+
    368 if (isinf) { return Float128{nanq("")}; }
    \n+
    369
    \n+
    370 const Float128 abs_x = (isneg ? -x : x);
    \n+
    371 if (p < Int(0)) {
    \n+
    372 if (abs_x < min_value)
    \n+
    373 return (isneg ? -inf_value : +inf_value);
    \n+
    374 else
    \n+
    375 return Float128(1) / pow(x, Int(-p));
    \n+
    376 }
    \n+
    377
    \n+
    378 if (p == Int(0)) { return Float128(1); }
    \n+
    379 if (p == Int(1)) { return x; }
    \n+
    380 if (abs_x > max_value)
    \n+
    381 return (isneg ? -inf_value : +inf_value);
    \n+
    382
    \n+
    383 if (p == Int(2)) { return (x * x); }
    \n+
    384 if (p == Int(3)) { return ((x * x) * x); }
    \n+
    385 if (p == Int(4)) { const Float128 x2 = (x * x); return (x2 * x2); }
    \n+
    386
    \n+
    387 Float128 result = ((p % Int(2)) != Int(0)) ? x : Float128(1);
    \n+
    388 Float128 xn = x; // binary powers of x
    \n+
    389
    \n+
    390 Int p2 = p;
    \n+
    391 while (Int(p2 /= 2) != Int(0)) {
    \n+
    392 xn *= xn; // Square xn for each binary power
    \n+
    393
    \n+
    394 const bool has_binary_power = (Int(p2 % Int(2)) != Int(0));
    \n+
    395 if (has_binary_power)
    \n+
    396 result *= xn;
    \n+
    397 }
    \n+
    398
    \n+
    399 return result;
    \n+
    400 }
    \n+
    401
    \n+
    402
    \n+
    403 } // end namespace Impl
    \n+
    404
    \n+
    405 template <>
    \n+
    406 struct IsNumber<Impl::Float128>
    \n+
    407 : public std::true_type {};
    \n+
    408
    \n+
    409} // end namespace Dune
    \n+
    410
    \n+
    411namespace std
    \n+
    412{
    \n+
    413#ifndef NO_STD_NUMERIC_LIMITS_SPECIALIZATION
    \n+
    414 template <>
    \n+
    415 class numeric_limits<Dune::Impl::Float128>
    \n+
    416 {
    \n+
    417 using Float128 = Dune::Impl::Float128;
    \n+
    418 using float128_t = Dune::Impl::float128_t;
    \n+
    419
    \n+
    420 public:
    \n+
    421 static constexpr bool is_specialized = true;
    \n+
    422 static constexpr Float128 min() noexcept { return FLT128_MIN; }
    \n+
    423 static constexpr Float128 max() noexcept { return FLT128_MAX; }
    \n+
    424 static constexpr Float128 lowest() noexcept { return -FLT128_MAX; }
    \n+
    425 static constexpr int digits = FLT128_MANT_DIG;
    \n+
    426 static constexpr int digits10 = 34;
    \n+
    427 static constexpr int max_digits10 = 36;
    \n+
    428 static constexpr bool is_signed = true;
    \n+
    429 static constexpr bool is_integer = false;
    \n+
    430 static constexpr bool is_exact = false;
    \n+
    431 static constexpr int radix = 2;
    \n+
    432 static constexpr Float128 epsilon() noexcept { return FLT128_EPSILON; }
    \n+
    433 static constexpr Float128 round_error() noexcept { return float128_t{0.5}; }
    \n+
    434 static constexpr int min_exponent = FLT128_MIN_EXP;
    \n+
    435 static constexpr int min_exponent10 = FLT128_MIN_10_EXP;
    \n+
    436 static constexpr int max_exponent = FLT128_MAX_EXP;
    \n+
    437 static constexpr int max_exponent10 = FLT128_MAX_10_EXP;
    \n+
    438 static constexpr bool has_infinity = true;
    \n+
    439 static constexpr bool has_quiet_NaN = true;
    \n+
    440 static constexpr bool has_signaling_NaN = false;
    \n+
    441 static constexpr float_denorm_style has_denorm = denorm_present;
    \n+
    442 static constexpr bool has_denorm_loss = false;
    \n+
    443 static constexpr Float128 infinity() noexcept { return float128_t{1}/float128_t{0}; }
    \n+
    444 static Float128 quiet_NaN() noexcept { return nanq(""); }
    \n+
    445 static constexpr Float128 signaling_NaN() noexcept { return float128_t{}; }
    \n+
    446 static constexpr Float128 denorm_min() noexcept { return FLT128_DENORM_MIN; }
    \n+
    447 static constexpr bool is_iec559 = true;
    \n+
    448 static constexpr bool is_bounded = false;
    \n+
    449 static constexpr bool is_modulo = false;
    \n+
    450 static constexpr bool traps = false;
    \n+
    451 static constexpr bool tinyness_before = false;
    \n+
    452 static constexpr float_round_style round_style = round_to_nearest;
    \n+
    453 };
    \n+
    454#endif
    \n+
    455} // end namespace std
    \n+
    456
    \n+
    457#endif // HAVE_QUADMATH
    \n+
    458#endif // DUNE_QUADMATH_HH
    \n+
    Traits for type conversions and type information.
    \n+
    A few common exception classes.
    \n+
    #define DUNE_BINARY_OP(OP)
    Definition debugalign.hh:261
    \n+
    #define DUNE_UNARY_FUNC(name)
    \n+
    #define DUNE_ASSIGN_OP(OP)
    Definition debugalign.hh:220
    \n+
    Stream & operator>>(Stream &stream, std::tuple< Ts... > &t)
    Read a std::tuple.
    Definition streamoperators.hh:43
    \n+
    constexpr auto max
    Function object that returns the greater of the given values.
    Definition hybridutilities.hh:484
    \n+
    constexpr auto min
    Function object that returns the smaller of the given values.
    Definition hybridutilities.hh:506
    \n
    std::ostream & operator<<(std::ostream &s, const bigunsignedint< k > &x)
    Definition bigunsignedint.hh:278
    \n+
    bigunsignedint< k > operator-(const bigunsignedint< k > &x, std::uintmax_t y)
    Definition bigunsignedint.hh:542
    \n+
    bigunsignedint< k > operator+(const bigunsignedint< k > &x, std::uintmax_t y)
    Definition bigunsignedint.hh:535
    \n
    #define DUNE_THROW(E, m)
    Definition exceptions.hh:218
    \n-
    bool anyTrue(const Mask &mask)
    Whether any entry is true
    Definition simd/interface.hh:429
    \n-
    V cond(M &&mask, const V &ifTrue, const V &ifFalse)
    Like the ?: operator.
    Definition simd/interface.hh:386
    \n-
    bool allTrue(const Mask &mask)
    Whether all entries are true
    Definition simd/interface.hh:439
    \n-
    typename Overloads::RebindType< std::decay_t< S >, std::decay_t< V > >::type Rebind
    Construct SIMD type with different scalar type.
    Definition simd/interface.hh:253
    \n-
    constexpr std::size_t lanes()
    Number of lanes in a SIMD type.
    Definition simd/interface.hh:305
    \n-
    decltype(auto) lane(std::size_t l, V &&v)
    Extract an element of a SIMD type.
    Definition simd/interface.hh:324
    \n-
    Mask< V > mask(ADLTag< 0, std::is_same< V, Mask< V > >::value >, const V &v)
    implements Simd::mask()
    Definition defaults.hh:153
    \n
    STL namespace.
    \n
    Dune namespace.
    Definition alignedallocator.hh:13
    \n-
    void swap(T &v1, T &v2, bool mask)
    Definition simd.hh:472
    \n-
    int sign(const T &val)
    Return the sign of the value.
    Definition math.hh:180
    \n-
    K conjugateComplex(const K &x)
    compute conjugate complex of x
    Definition math.hh:164
    \n-
    static void multAssign(const DenseMatrix< MAT > &matrix, const DenseVector< V1 > &x, DenseVector< V2 > &ret)
    calculates ret = matrix * x
    Definition densematrix.hh:1169
    \n-
    A dense n x m matrix.
    Definition densematrix.hh:140
    \n-
    ConstIterator const_iterator
    typedef for stl compliant access
    Definition densematrix.hh:244
    \n-
    derived_type operator-() const
    Matrix negation.
    Definition densematrix.hh:298
    \n-
    void solve(V1 &x, const V2 &b, bool doPivoting=true) const
    Solve system A x = b.
    \n-
    void mv(const X &x, Y &y) const
    y = A x
    Definition densematrix.hh:368
    \n-
    Traits::value_type field_type
    export the type representing the field
    Definition densematrix.hh:160
    \n-
    derived_type & axpy(const field_type &a, const DenseMatrix< Other > &x)
    vector space axpy operation (*this += a x)
    Definition densematrix.hh:338
    \n-
    ConstIterator beforeEnd() const
    Definition densematrix.hh:264
    \n-
    derived_type & operator=(const RHS &rhs)
    Definition densematrix.hh:279
    \n-
    void mmtv(const X &x, Y &y) const
    y -= A^T x
    Definition densematrix.hh:458
    \n-
    FieldTraits< vt >::real_type infinity_norm_real() const
    simplified infinity norm (uses Manhattan norm for complex values)
    Definition densematrix.hh:561
    \n-
    std::remove_reference< const_row_reference >::type::ConstIterator ConstColIterator
    rename the iterators for easier access
    Definition densematrix.hh:248
    \n-
    ConstIterator beforeBegin() const
    Definition densematrix.hh:271
    \n-
    void invert(bool doPivoting=true)
    Compute inverse.
    \n-
    static void luDecomposition(DenseMatrix< MAT > &A, Func func, Mask &nonsingularLanes, bool throwEarly, bool doPivoting)
    do an LU-Decomposition on matrix A
    \n-
    Traits::value_type block_type
    export the type representing the components
    Definition densematrix.hh:163
    \n-
    void mtv(const X &x, Y &y) const
    y = A^T x
    Definition densematrix.hh:387
    \n-
    constexpr size_type cols() const
    number of columns
    Definition densematrix.hh:715
    \n-
    size_type size() const
    size method (number of rows)
    Definition densematrix.hh:200
    \n-
    constexpr size_type M() const
    number of columns
    Definition densematrix.hh:703
    \n-
    MAT & rightmultiply(const DenseMatrix< M2 > &M)
    Multiplies M from the right to this matrix.
    Definition densematrix.hh:645
    \n-
    Iterator end()
    end iterator
    Definition densematrix.hh:222
    \n-
    Iterator beforeBegin()
    Definition densematrix.hh:236
    \n-
    derived_type & operator/=(const field_type &k)
    vector space division by scalar
    Definition densematrix.hh:329
    \n-
    derived_type & operator*=(const field_type &k)
    vector space multiplication with scalar
    Definition densematrix.hh:321
    \n-
    Iterator beforeEnd()
    Definition densematrix.hh:229
    \n-
    Traits::value_type value_type
    export the type representing the field
    Definition densematrix.hh:157
    \n-
    void usmv(const typename FieldTraits< Y >::field_type &alpha, const X &x, Y &y) const
    y += alpha A x
    Definition densematrix.hh:484
    \n-
    void usmhv(const typename FieldTraits< Y >::field_type &alpha, const X &x, Y &y) const
    y += alpha A^H x
    Definition densematrix.hh:512
    \n-
    void mmv(const X &x, Y &y) const
    y -= A x
    Definition densematrix.hh:445
    \n-
    constexpr size_type rows() const
    number of rows
    Definition densematrix.hh:709
    \n-
    MAT & leftmultiply(const DenseMatrix< M2 > &M)
    Multiplies M from the left to this matrix.
    Definition densematrix.hh:627
    \n-
    void usmtv(const typename FieldTraits< Y >::field_type &alpha, const X &x, Y &y) const
    y += alpha A^T x
    Definition densematrix.hh:498
    \n-
    derived_type & operator-=(const DenseMatrix< Other > &x)
    vector space subtraction
    Definition densematrix.hh:312
    \n-
    bool operator!=(const DenseMatrix< Other > &x) const
    Binary matrix incomparison.
    Definition densematrix.hh:358
    \n-
    void mmhv(const X &x, Y &y) const
    y -= A^H x
    Definition densematrix.hh:471
    \n-
    Traits::derived_type derived_type
    type of derived matrix class
    Definition densematrix.hh:154
    \n-
    row_reference operator[](size_type i)
    random access
    Definition densematrix.hh:189
    \n-
    bool exists(size_type i, size_type j) const
    return true when (i,j) is in pattern
    Definition densematrix.hh:723
    \n-
    Iterator RowIterator
    rename the iterators for easier access
    Definition densematrix.hh:211
    \n-
    static constexpr int blocklevel
    The number of block levels we contain. This is the leaf, that is, 1.
    Definition densematrix.hh:178
    \n-
    FieldTraits< value_type >::real_type frobenius_norm() const
    frobenius norm: sqrt(sum over squared values of entries)
    Definition densematrix.hh:528
    \n-
    void umv(const X &x, Y &y) const
    y += A x
    Definition densematrix.hh:406
    \n-
    DenseIterator< const DenseMatrix, const row_type, const_row_reference > ConstIterator
    Iterator class for sequential access.
    Definition densematrix.hh:242
    \n-
    FieldTraits< vt >::real_type infinity_norm() const
    infinity norm (row sum norm, how to generalize for blocks?)
    Definition densematrix.hh:546
    \n-
    Traits::row_type row_type
    The type used to represent a row (must fulfill the Dune::DenseVector interface)
    Definition densematrix.hh:169
    \n-
    constexpr size_type N() const
    number of rows
    Definition densematrix.hh:697
    \n-
    Traits::size_type size_type
    The type used for the index access and size operation.
    Definition densematrix.hh:166
    \n-
    Traits::const_row_reference const_row_reference
    The type used to represent a reference to a constant row (usually const row_type &)
    Definition densematrix.hh:175
    \n-
    FieldTraits< value_type >::real_type frobenius_norm2() const
    square of frobenius norm, need for block recursion
    Definition densematrix.hh:536
    \n-
    std::remove_reference< row_reference >::type::Iterator ColIterator
    rename the iterators for easier access
    Definition densematrix.hh:213
    \n-
    Traits::row_reference row_reference
    The type used to represent a reference to a row (usually row_type &)
    Definition densematrix.hh:172
    \n-
    bool operator==(const DenseMatrix< Other > &x) const
    Binary matrix comparison.
    Definition densematrix.hh:348
    \n-
    Iterator iterator
    typedef for stl compliant access
    Definition densematrix.hh:209
    \n-
    ConstIterator ConstRowIterator
    rename the iterators for easier access
    Definition densematrix.hh:246
    \n-
    DenseIterator< DenseMatrix, row_type, row_reference > Iterator
    Iterator class for sequential access.
    Definition densematrix.hh:207
    \n-
    void umtv(const X &x, Y &y) const
    y += A^T x
    Definition densematrix.hh:419
    \n-
    ConstIterator begin() const
    begin iterator
    Definition densematrix.hh:251
    \n-
    field_type determinant(bool doPivoting=true) const
    calculates the determinant of this matrix
    \n-
    Iterator begin()
    begin iterator
    Definition densematrix.hh:216
    \n-
    void umhv(const X &x, Y &y) const
    y += A^H x
    Definition densematrix.hh:432
    \n-
    derived_type & operator+=(const DenseMatrix< Other > &x)
    vector space addition
    Definition densematrix.hh:289
    \n-
    ConstIterator end() const
    end iterator
    Definition densematrix.hh:257
    \n-
    const FieldTraits< typenameDenseMatVecTraits< M >::value_type >::real_type real_type
    Definition densematrix.hh:34
    \n-
    const FieldTraits< typenameDenseMatVecTraits< M >::value_type >::field_type field_type
    Definition densematrix.hh:33
    \n-
    A dense n x m matrix.
    Definition fmatrix.hh:117
    \n-
    Base::size_type size_type
    Definition fmatrix.hh:127
    \n-
    vector space out of a tensor product of fields.
    Definition fvector.hh:91
    \n-
    you have to specialize this structure for any type that should be assignable to a DenseMatrix
    Definition densematrix.hh:59
    \n-
    Error thrown if operations of a FieldMatrix fail.
    Definition densematrix.hh:126
    \n-
    Interface for a class of dense vectors over a given field.
    Definition densevector.hh:229
    \n-
    size_type size() const
    size method
    Definition densevector.hh:336
    \n-
    Generic iterator class for dense vector and matrix implementations.
    Definition densevector.hh:131
    \n-
    Default exception class for mathematical errors.
    Definition exceptions.hh:241
    \n-
    Definition ftraits.hh:26
    \n-
    T field_type
    export the type representing the field
    Definition ftraits.hh:28
    \n-
    T real_type
    export the type representing the real type of the field
    Definition ftraits.hh:30
    \n-
    Definition matvectraits.hh:31
    \n-
    static ctype absolute_limit()
    return threshold to declare matrix singular
    Definition precision.hh:28
    \n-
    Include file for users of the SIMD abstraction layer.
    \n+
    T max_value(const AlignedNumber< T, align > &val)
    Definition debugalign.hh:494
    \n+
    T min_value(const AlignedNumber< T, align > &val)
    Definition debugalign.hh:500
    \n+
    Default exception class for range errors.
    Definition exceptions.hh:254
    \n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,1521 +1,527 @@\n dune-common\u00a02.10\n Loading...\n Searching...\n No Matches\n * _\bd_\bu_\bn_\be\n * _\bc_\bo_\bm_\bm_\bo_\bn\n-densematrix.hh\n+quadmath.hh\n _\bG_\bo_\b _\bt_\bo_\b _\bt_\bh_\be_\b _\bd_\bo_\bc_\bu_\bm_\be_\bn_\bt_\ba_\bt_\bi_\bo_\bn_\b _\bo_\bf_\b _\bt_\bh_\bi_\bs_\b _\bf_\bi_\bl_\be_\b.\n 1// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-\n 2// vi: set et ts=4 sw=2 sts=2:\n 3// SPDX-FileCopyrightInfo: Copyright \u00c2\u00a9 DUNE Project contributors, see file\n LICENSE.md in module root\n 4// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception\n-5#ifndef DUNE_DENSEMATRIX_HH\n-6#define DUNE_DENSEMATRIX_HH\n+5#ifndef DUNE_QUADMATH_HH\n+6#define DUNE_QUADMATH_HH\n 7\n-8#include \n-9#include \n-10#include \n-11#include \n-12#include \n-13#include \n-14\n-15#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bb_\bo_\bu_\bn_\bd_\bs_\bc_\bh_\be_\bc_\bk_\bi_\bn_\bg_\b._\bh_\bh>\n-16#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bc_\bl_\ba_\bs_\bs_\bn_\ba_\bm_\be_\b._\bh_\bh>\n-17#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\be_\bx_\bc_\be_\bp_\bt_\bi_\bo_\bn_\bs_\b._\bh_\bh>\n-18#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bf_\bv_\be_\bc_\bt_\bo_\br_\b._\bh_\bh>\n-19#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bm_\ba_\bt_\bh_\b._\bh_\bh>\n-20#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bp_\br_\be_\bc_\bi_\bs_\bi_\bo_\bn_\b._\bh_\bh>\n-21#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bs_\bi_\bm_\bd_\b/_\bs_\bi_\bm_\bd_\b._\bh_\bh>\n-22#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bt_\by_\bp_\be_\bt_\br_\ba_\bi_\bt_\bs_\b._\bh_\bh>\n-23#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bs_\bc_\ba_\bl_\ba_\br_\bv_\be_\bc_\bt_\bo_\br_\bv_\bi_\be_\bw_\b._\bh_\bh>\n-24\n-25namespace _\bD_\bu_\bn_\be\n-26{\n-27\n-28 template class DenseMatrix;\n+8#if HAVE_QUADMATH\n+9#include \n+10\n+11#include \n+12#include \n+13#include \n+14#include // abs\n+15#include \n+16#include \n+17#include \n+18#include \n+19\n+20#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\be_\bx_\bc_\be_\bp_\bt_\bi_\bo_\bn_\bs_\b._\bh_\bh>\n+21#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bt_\by_\bp_\be_\bt_\br_\ba_\bi_\bt_\bs_\b._\bh_\bh>\n+22\n+23namespace _\bD_\bu_\bn_\be\n+24{\n+25 namespace Impl\n+26 {\n+27 // forward declaration\n+28 class Float128;\n 29\n-30 template\n-_\b3_\b1 struct _\bF_\bi_\be_\bl_\bd_\bT_\br_\ba_\bi_\bt_\bs< _\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx >\n-32 {\n-_\b3_\b3 typedef const typename _\bF_\bi_\be_\bl_\bd_\bT_\br_\ba_\bi_\bt_\bs_\b<_\b _\bt_\by_\bp_\be_\bn_\ba_\bm_\be_\b _\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\bV_\be_\bc_\bT_\br_\ba_\bi_\bt_\bs_\b<_\bM_\b>_\b:_\b:\n-_\bv_\ba_\bl_\bu_\be_\b__\bt_\by_\bp_\be >_\b:_\b:_\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be _\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be;\n-_\b3_\b4 typedef const typename _\bF_\bi_\be_\bl_\bd_\bT_\br_\ba_\bi_\bt_\bs_\b<_\b _\bt_\by_\bp_\be_\bn_\ba_\bm_\be_\b _\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\bV_\be_\bc_\bT_\br_\ba_\bi_\bt_\bs_\b<_\bM_\b>_\b:_\b:\n-_\bv_\ba_\bl_\bu_\be_\b__\bt_\by_\bp_\be >_\b:_\b:_\br_\be_\ba_\bl_\b__\bt_\by_\bp_\be _\br_\be_\ba_\bl_\b__\bt_\by_\bp_\be;\n-35 };\n-36\n-37 template class _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx;\n-38 template class _\bF_\bi_\be_\bl_\bd_\bV_\be_\bc_\bt_\bo_\br;\n+30 } // end namespace Impl\n+31\n+32 using Impl::Float128;\n+33\n+34 // The purpose of this namespace is to move the `` function overloads\n+35 // out of namespace `Dune`, see AlignedNumber in debugalign.hh.\n+36 namespace Impl\n+37 {\n+38 using float128_t = __float128;\n 39\n-58 template< class DenseMatrix, class RHS >\n-_\b5_\b9 struct _\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\bA_\bs_\bs_\bi_\bg_\bn_\be_\br;\n-60\n-61#ifndef DOXYGEN\n-62 namespace Impl\n-63 {\n-64\n-65 template< class DenseMatrix, class RHS, class = void >\n-66 class _\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\bA_\bs_\bs_\bi_\bg_\bn_\be_\br\n-67 {};\n+41 class Float128\n+42 {\n+43 float128_t value_ = 0.0q;\n+44\n+45 public:\n+46 constexpr Float128() = default;\n+47 constexpr Float128(const float128_t& value) noexcept\n+48 : value_(value)\n+49 {}\n+50\n+51 // constructor from any floating-point or integer type\n+52 template ::value, int> = 0>\n+54 constexpr Float128(const T& value) noexcept\n+55 : value_(value)\n+56 {}\n+57\n+58 // constructor from pointer to null-terminated byte string\n+59 explicit Float128(const char* str) noexcept\n+60 : value_(strtoflt128(str, NULL))\n+61 {}\n+62\n+63 // accessors\n+64 constexpr operator float128_t() const noexcept { return value_; }\n+65\n+66 constexpr float128_t const& value() const noexcept { return value_; }\n+67 constexpr float128_t& value() noexcept { return value_; }\n 68\n-69 template< class DenseMatrix, class RHS >\n-70 class _\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\bA_\bs_\bs_\bi_\bg_\bn_\be_\br< _\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx, RHS, _\bs_\bt_\bd::enable_if_t< Dune::\n-IsNumber< RHS >::value > >\n-71 {\n-72 public:\n-73 static void apply ( _\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx &denseMatrix, const RHS &rhs )\n-74 {\n-75 typedef typename _\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be field_type;\n-76 std::fill( denseMatrix._\bb_\be_\bg_\bi_\bn(), denseMatrix._\be_\bn_\bd(), static_cast< field_type >\n-( rhs ) );\n-77 }\n-78 };\n-79\n-80 template< class DenseMatrix, class RHS >\n-81 class DenseMatrixAssigner< DenseMatrix, RHS, _\bs_\bt_\bd::enable_if_t< !std::\n-is_same< typename RHS::const_iterator, void >::value\n-82 && std::is_convertible< typename RHS::const_iterator::value_type, typename\n-DenseMatrix::iterator::value_type >::value > >\n-83 {\n-84 public:\n-85 static void apply ( DenseMatrix &denseMatrix, const RHS &rhs )\n-86 {\n-87 _\bD_\bU_\bN_\bE_\b__\bA_\bS_\bS_\bE_\bR_\bT_\b__\bB_\bO_\bU_\bN_\bD_\bS(rhs.N() == denseMatrix.N());\n-88 _\bD_\bU_\bN_\bE_\b__\bA_\bS_\bS_\bE_\bR_\bT_\b__\bB_\bO_\bU_\bN_\bD_\bS(rhs.M() == denseMatrix.M());\n-89 typename DenseMatrix::iterator tIt = std::begin(denseMatrix);\n-90 typename RHS::const_iterator sIt = std::begin(rhs);\n-91 for(; sIt != std::end(rhs); ++tIt, ++sIt)\n-92 std::copy(std::begin(*sIt), std::end(*sIt), std::begin(*tIt));\n+69 // I/O\n+70 template\n+71 friend std::basic_istream&\n+72 _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b>_\b>(std::basic_istream& in, Float128& x)\n+73 {\n+74 std::string buf;\n+75 buf.reserve(128);\n+76 in >> buf;\n+77 x.value() = strtoflt128(buf.c_str(), NULL);\n+78 return in;\n+79 }\n+80\n+81 template\n+82 friend std::basic_ostream&\n+83 _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b<_\b<(std::basic_ostream& out, const Float128& x)\n+84 {\n+85 const std::size_t bufSize = 128;\n+86 CharT buf[128];\n+87\n+88 std::string format = \"%.\" + std::to_string(out.precision()) + \"Q\" +\n+89 ((out.flags() | std::ios_base::scientific) ? \"e\" : \"f\");\n+90 const int numChars = quadmath_snprintf(buf, bufSize, format.c_str(), x.value\n+());\n+91 if (std::size_t(numChars) >= bufSize) {\n+92 _\bD_\bU_\bN_\bE_\b__\bT_\bH_\bR_\bO_\bW(_\bD_\bu_\bn_\be_\b:_\b:_\bR_\ba_\bn_\bg_\be_\bE_\br_\br_\bo_\br, \"Failed to print Float128 value: buffer\n+overflow\");\n 93 }\n-94 };\n-95\n-96 } // namespace Impl\n+94 out << buf;\n+95 return out;\n+96 }\n 97\n-98\n-99\n-100 template< class DenseMatrix, class RHS >\n-101 struct DenseMatrixAssigner\n-102 : public Impl::DenseMatrixAssigner< DenseMatrix, RHS >\n-103 {};\n+98 // Increment, decrement\n+99 constexpr Float128& operator++() noexcept { ++value_; return *this; }\n+100 constexpr Float128& operator--() noexcept { --value_; return *this; }\n+101\n+102 constexpr Float128 operator++(int) noexcept { Float128 tmp{*this};\n+++value_; return tmp; }\n+103 constexpr Float128 operator--(int) noexcept { Float128 tmp{*this}; --\n+value_; return tmp; }\n 104\n-105\n-106 namespace Impl\n-107 {\n+105 // unary operators\n+106 constexpr Float128 _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b+() const noexcept { return Float128{+value_}; }\n+107 constexpr Float128 _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b-() const noexcept { return Float128{-value_}; }\n 108\n-109 template< class DenseMatrix, class RHS >\n-110 std::true_type hasDenseMatrixAssigner ( DenseMatrix &, const RHS &,\n-decltype( _\bD_\bu_\bn_\be_\b:_\b:_\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\bA_\bs_\bs_\bi_\bg_\bn_\be_\br_\b<_\b _\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\b,_\b _\bR_\bH_\bS_\b _\b>_\b:_\b:_\ba_\bp_\bp_\bl_\by( std::declval<\n-DenseMatrix & >(), std::declval< const RHS & >() ) ) * = nullptr );\n-111\n-112 std::false_type hasDenseMatrixAssigner ( ... );\n-113\n-114 } // namespace Impl\n-115\n-116 template< class DenseMatrix, class RHS >\n-117 struct HasDenseMatrixAssigner\n-118 : public decltype( Impl::hasDenseMatrixAssigner( std::declval< DenseMatrix\n-& >(), std::declval< const RHS & >() ) )\n-119 {};\n+109 // assignment operators\n+110#define DUNE_ASSIGN_OP(OP) \\\n+111 constexpr Float128& operator OP(const Float128& u) noexcept \\\n+112 { \\\n+113 value_ OP float128_t(u); \\\n+114 return *this; \\\n+115 } \\\n+116 static_assert(true, \"Require semicolon to unconfuse editors\")\n+117\n+118 _\bD_\bU_\bN_\bE_\b__\bA_\bS_\bS_\bI_\bG_\bN_\b__\bO_\bP(+=);\n+119 _\bD_\bU_\bN_\bE_\b__\bA_\bS_\bS_\bI_\bG_\bN_\b__\bO_\bP(-=);\n 120\n-121#endif // #ifndef DOXYGEN\n-122\n+121 _\bD_\bU_\bN_\bE_\b__\bA_\bS_\bS_\bI_\bG_\bN_\b__\bO_\bP(*=);\n+122 _\bD_\bU_\bN_\bE_\b__\bA_\bS_\bS_\bI_\bG_\bN_\b__\bO_\bP(/=);\n 123\n-124\n-_\b1_\b2_\b6 class _\bF_\bM_\ba_\bt_\br_\bi_\bx_\bE_\br_\br_\bo_\br : public _\bM_\ba_\bt_\bh_\bE_\br_\br_\bo_\br {};\n+124#undef DUNE_ASSIGN_OP\n+125\n+126 }; // end class Float128\n 127\n-138 template\n-_\b1_\b3_\b9 class _\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx\n-140 {\n-141 typedef _\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\bV_\be_\bc_\bT_\br_\ba_\bi_\bt_\bs_\b<_\bM_\bA_\bT_\b> _\bT_\br_\ba_\bi_\bt_\bs;\n-142\n-143 // Curiously recurring template pattern\n-144 constexpr MAT & asImp() { return static_cast(*this); }\n-145 constexpr const MAT & asImp() const { return static_cast\n-(*this); }\n-146\n-147 template \n-_\b1_\b4_\b8 friend class _\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx;\n-149\n-150 public:\n-151 //===== type definitions and constants\n-152\n-_\b1_\b5_\b4 typedef typename Traits::derived_type _\bd_\be_\br_\bi_\bv_\be_\bd_\b__\bt_\by_\bp_\be;\n-155\n-_\b1_\b5_\b7 typedef typename Traits::value_type _\bv_\ba_\bl_\bu_\be_\b__\bt_\by_\bp_\be;\n-158\n-_\b1_\b6_\b0 typedef typename Traits::value_type _\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be;\n-161\n-_\b1_\b6_\b3 typedef typename Traits::value_type _\bb_\bl_\bo_\bc_\bk_\b__\bt_\by_\bp_\be;\n-164\n-_\b1_\b6_\b6 typedef typename Traits::size_type _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be;\n+128 // binary operators:\n+129 // For symmetry provide overloads with arithmetic types\n+130 // in the first or second argument.\n+131#define DUNE_BINARY_OP(OP) \\\n+132 constexpr Float128 operator OP(const Float128& t, \\\n+133 const Float128& u) noexcept \\\n+134 { \\\n+135 return Float128{float128_t(t) OP float128_t(u)}; \\\n+136 } \\\n+137 constexpr Float128 operator OP(const float128_t& t, \\\n+138 const Float128& u) noexcept \\\n+139 { \\\n+140 return Float128{t OP float128_t(u)}; \\\n+141 } \\\n+142 constexpr Float128 operator OP(const Float128& t, \\\n+143 const float128_t& u) noexcept \\\n+144 { \\\n+145 return Float128{float128_t(t) OP u}; \\\n+146 } \\\n+147 template ::value, int> = 0> \\\n+149 constexpr Float128 operator OP(const T& t, \\\n+150 const Float128& u) noexcept \\\n+151 { \\\n+152 return Float128{float128_t(t) OP float128_t(u)}; \\\n+153 } \\\n+154 template ::value, int> = 0> \\\n+156 constexpr Float128 operator OP(const Float128& t, \\\n+157 const U& u) noexcept \\\n+158 { \\\n+159 return Float128{float128_t(t) OP float128_t(u)}; \\\n+160 } \\\n+161 static_assert(true, \"Require semicolon to unconfuse editors\")\n+162\n+163 _\bD_\bU_\bN_\bE_\b__\bB_\bI_\bN_\bA_\bR_\bY_\b__\bO_\bP(+);\n+164 _\bD_\bU_\bN_\bE_\b__\bB_\bI_\bN_\bA_\bR_\bY_\b__\bO_\bP(-);\n+165 _\bD_\bU_\bN_\bE_\b__\bB_\bI_\bN_\bA_\bR_\bY_\b__\bO_\bP(*);\n+166 _\bD_\bU_\bN_\bE_\b__\bB_\bI_\bN_\bA_\bR_\bY_\b__\bO_\bP(/);\n 167\n-_\b1_\b6_\b9 typedef typename Traits::row_type _\br_\bo_\bw_\b__\bt_\by_\bp_\be;\n-170\n-_\b1_\b7_\b2 typedef typename Traits::row_reference _\br_\bo_\bw_\b__\br_\be_\bf_\be_\br_\be_\bn_\bc_\be;\n-173\n-_\b1_\b7_\b5 typedef typename Traits::const_row_reference _\bc_\bo_\bn_\bs_\bt_\b__\br_\bo_\bw_\b__\br_\be_\bf_\be_\br_\be_\bn_\bc_\be;\n-176\n-_\b1_\b7_\b8 constexpr static int _\bb_\bl_\bo_\bc_\bk_\bl_\be_\bv_\be_\bl = 1;\n-179\n-180 private:\n-183 using simd_index_type = _\bS_\bi_\bm_\bd_\b:_\b:_\bR_\be_\bb_\bi_\bn_\bd_\b<_\bs_\bt_\bd_\b:_\b:_\bs_\bi_\bz_\be_\b__\bt_\b,_\b _\bv_\ba_\bl_\bu_\be_\b__\bt_\by_\bp_\be_\b>;\n-184\n-185 public:\n-186 //===== access to components\n-187\n-_\b1_\b8_\b9 _\br_\bo_\bw_\b__\br_\be_\bf_\be_\br_\be_\bn_\bc_\be _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b[_\b]_\b ( _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be i )\n-190 {\n-191 return asImp().mat_access(i);\n-192 }\n-193\n-_\b1_\b9_\b4 _\bc_\bo_\bn_\bs_\bt_\b__\br_\bo_\bw_\b__\br_\be_\bf_\be_\br_\be_\bn_\bc_\be _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b[_\b]_\b ( _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be i ) const\n-195 {\n-196 return asImp().mat_access(i);\n-197 }\n-198\n-_\b2_\b0_\b0 _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be _\bs_\bi_\bz_\be() const\n-201 {\n-202 return _\br_\bo_\bw_\bs();\n-203 }\n-204\n-205 //===== iterator interface to rows of the matrix\n-_\b2_\b0_\b7 typedef _\bD_\be_\bn_\bs_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b<_\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\b,_\br_\bo_\bw_\b__\bt_\by_\bp_\be_\b,_\br_\bo_\bw_\b__\br_\be_\bf_\be_\br_\be_\bn_\bc_\be_\b> _\bI_\bt_\be_\br_\ba_\bt_\bo_\br;\n-_\b2_\b0_\b9 typedef _\bI_\bt_\be_\br_\ba_\bt_\bo_\br _\bi_\bt_\be_\br_\ba_\bt_\bo_\br;\n-_\b2_\b1_\b1 typedef _\bI_\bt_\be_\br_\ba_\bt_\bo_\br _\bR_\bo_\bw_\bI_\bt_\be_\br_\ba_\bt_\bo_\br;\n-_\b2_\b1_\b3 typedef typename std::remove_reference::type::Iterator\n-_\bC_\bo_\bl_\bI_\bt_\be_\br_\ba_\bt_\bo_\br;\n-214\n-_\b2_\b1_\b6 _\bI_\bt_\be_\br_\ba_\bt_\bo_\br _\bb_\be_\bg_\bi_\bn ()\n-217 {\n-218 return _\bI_\bt_\be_\br_\ba_\bt_\bo_\br(*this,0);\n-219 }\n-220\n-_\b2_\b2_\b2 _\bI_\bt_\be_\br_\ba_\bt_\bo_\br _\be_\bn_\bd ()\n-223 {\n-224 return _\bI_\bt_\be_\br_\ba_\bt_\bo_\br(*this,_\br_\bo_\bw_\bs());\n-225 }\n-226\n-_\b2_\b2_\b9 _\bI_\bt_\be_\br_\ba_\bt_\bo_\br _\bb_\be_\bf_\bo_\br_\be_\bE_\bn_\bd ()\n-230 {\n-231 return _\bI_\bt_\be_\br_\ba_\bt_\bo_\br(*this,_\br_\bo_\bw_\bs()-1);\n-232 }\n-233\n-_\b2_\b3_\b6 _\bI_\bt_\be_\br_\ba_\bt_\bo_\br _\bb_\be_\bf_\bo_\br_\be_\bB_\be_\bg_\bi_\bn ()\n-237 {\n-238 return _\bI_\bt_\be_\br_\ba_\bt_\bo_\br(*this,-1);\n-239 }\n-240\n-_\b2_\b4_\b2 typedef _\bD_\be_\bn_\bs_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b<_\bc_\bo_\bn_\bs_\bt_\b _\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\b,_\bc_\bo_\bn_\bs_\bt_\b _\br_\bo_\bw_\b__\bt_\by_\bp_\be_\b,_\bc_\bo_\bn_\bs_\bt_\b__\br_\bo_\bw_\b__\br_\be_\bf_\be_\br_\be_\bn_\bc_\be_\b>\n-_\bC_\bo_\bn_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br;\n-_\b2_\b4_\b4 typedef _\bC_\bo_\bn_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br _\bc_\bo_\bn_\bs_\bt_\b__\bi_\bt_\be_\br_\ba_\bt_\bo_\br;\n-_\b2_\b4_\b6 typedef _\bC_\bo_\bn_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br _\bC_\bo_\bn_\bs_\bt_\bR_\bo_\bw_\bI_\bt_\be_\br_\ba_\bt_\bo_\br;\n-_\b2_\b4_\b8 typedef typename std::remove_reference::type::\n-ConstIterator _\bC_\bo_\bn_\bs_\bt_\bC_\bo_\bl_\bI_\bt_\be_\br_\ba_\bt_\bo_\br;\n-249\n-_\b2_\b5_\b1 _\bC_\bo_\bn_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br _\bb_\be_\bg_\bi_\bn () const\n-252 {\n-253 return _\bC_\bo_\bn_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br(*this,0);\n-254 }\n-255\n-_\b2_\b5_\b7 _\bC_\bo_\bn_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br _\be_\bn_\bd () const\n-258 {\n-259 return _\bC_\bo_\bn_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br(*this,_\br_\bo_\bw_\bs());\n-260 }\n-261\n-_\b2_\b6_\b4 _\bC_\bo_\bn_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br _\bb_\be_\bf_\bo_\br_\be_\bE_\bn_\bd () const\n-265 {\n-266 return _\bC_\bo_\bn_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br(*this,_\br_\bo_\bw_\bs()-1);\n-267 }\n-268\n-_\b2_\b7_\b1 _\bC_\bo_\bn_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br _\bb_\be_\bf_\bo_\br_\be_\bB_\be_\bg_\bi_\bn () const\n-272 {\n-273 return _\bC_\bo_\bn_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br(*this,-1);\n-274 }\n-275\n-276 //===== assignment\n-277\n-278 template< class RHS, class = std::enable_if_t< HasDenseMatrixAssigner< MAT,\n-RHS >::value > >\n-_\b2_\b7_\b9 _\bd_\be_\br_\bi_\bv_\be_\bd_\b__\bt_\by_\bp_\be &_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b=_\b ( const RHS &rhs )\n-280 {\n-281 _\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\bA_\bs_\bs_\bi_\bg_\bn_\be_\br_\b<_\b _\bM_\bA_\bT_\b,_\b _\bR_\bH_\bS_\b _\b>_\b:_\b:_\ba_\bp_\bp_\bl_\by( asImp(), rhs );\n-282 return asImp();\n-283 }\n-284\n-285 //===== vector space arithmetic\n-286\n-288 template \n-_\b2_\b8_\b9 _\bd_\be_\br_\bi_\bv_\be_\bd_\b__\bt_\by_\bp_\be &_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b+_\b=_\b (const _\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bO_\bt_\bh_\be_\br_\b>& x)\n-290 {\n-291 _\bD_\bU_\bN_\bE_\b__\bA_\bS_\bS_\bE_\bR_\bT_\b__\bB_\bO_\bU_\bN_\bD_\bS(_\br_\bo_\bw_\bs() == x._\br_\bo_\bw_\bs());\n-292 for (_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be i=0; i<_\br_\bo_\bw_\bs(); i++)\n-293 (*this)[i] += x[i];\n-294 return asImp();\n-295 }\n-296\n-_\b2_\b9_\b8 _\bd_\be_\br_\bi_\bv_\be_\bd_\b__\bt_\by_\bp_\be _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b-_\b () const\n-299 {\n-300 MAT result;\n-301 using idx_type = typename decltype(result)_\b:_\b:_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be;\n-302\n-303 for (idx_type i = 0; i < _\br_\bo_\bw_\bs(); ++i)\n-304 for (idx_type j = 0; j < _\bc_\bo_\bl_\bs(); ++j)\n-305 result[i][j] = - asImp()[i][j];\n-306\n-307 return result;\n-308 }\n-309\n-311 template \n-_\b3_\b1_\b2 _\bd_\be_\br_\bi_\bv_\be_\bd_\b__\bt_\by_\bp_\be &_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b-_\b=_\b (const _\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bO_\bt_\bh_\be_\br_\b>& x)\n-313 {\n-314 _\bD_\bU_\bN_\bE_\b__\bA_\bS_\bS_\bE_\bR_\bT_\b__\bB_\bO_\bU_\bN_\bD_\bS(_\br_\bo_\bw_\bs() == x._\br_\bo_\bw_\bs());\n-315 for (_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be i=0; i<_\br_\bo_\bw_\bs(); i++)\n-316 (*this)[i] -= x[i];\n-317 return asImp();\n-318 }\n-319\n-_\b3_\b2_\b1 _\bd_\be_\br_\bi_\bv_\be_\bd_\b__\bt_\by_\bp_\be &_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b*_\b=_\b (const _\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be& k)\n-322 {\n-323 for (_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be i=0; i<_\br_\bo_\bw_\bs(); i++)\n-324 (*this)[i] *= k;\n-325 return asImp();\n+168#undef DUNE_BINARY_OP\n+169\n+170 // logical operators:\n+171 // For symmetry provide overloads with arithmetic types\n+172 // in the first or second argument.\n+173#define DUNE_BINARY_BOOL_OP(OP) \\\n+174 constexpr bool operator OP(const Float128& t, \\\n+175 const Float128& u) noexcept \\\n+176 { \\\n+177 return float128_t(t) OP float128_t(u); \\\n+178 } \\\n+179 template ::value, int> = 0> \\\n+181 constexpr bool operator OP(const T& t, \\\n+182 const Float128& u) noexcept \\\n+183 { \\\n+184 return float128_t(t) OP float128_t(u); \\\n+185 } \\\n+186 template ::value, int> = 0> \\\n+188 constexpr bool operator OP(const Float128& t, \\\n+189 const U& u) noexcept \\\n+190 { \\\n+191 return float128_t(t) OP float128_t(u); \\\n+192 } \\\n+193 static_assert(true, \"Require semicolon to unconfuse editors\")\n+194\n+195 DUNE_BINARY_BOOL_OP(==);\n+196 DUNE_BINARY_BOOL_OP(!=);\n+197 DUNE_BINARY_BOOL_OP(<);\n+198 DUNE_BINARY_BOOL_OP(>);\n+199 DUNE_BINARY_BOOL_OP(<=);\n+200 DUNE_BINARY_BOOL_OP(>=);\n+201\n+202#undef DUNE_BINARY_BOOL_OP\n+203\n+204 // Overloads for the cmath functions\n+205\n+206 // function with name `name` redirects to quadmath function `func`\n+207#define DUNE_UNARY_FUNC(name,func) \\\n+208 inline Float128 name(const Float128& u) noexcept \\\n+209 { \\\n+210 return Float128{func (float128_t(u))}; \\\n+211 } \\\n+212 static_assert(true, \"Require semicolon to unconfuse editors\")\n+213\n+214 // like DUNE_UNARY_FUNC but with custom return type\n+215#define DUNE_CUSTOM_UNARY_FUNC(type,name,func) \\\n+216 inline type name(const Float128& u) noexcept \\\n+217 { \\\n+218 return (type)(func (float128_t(u))); \\\n+219 } \\\n+220 static_assert(true, \"Require semicolon to unconfuse editors\")\n+221\n+222 // redirects to quadmath function with two arguments\n+223#define DUNE_BINARY_FUNC(name,func) \\\n+224 inline Float128 name(const Float128& t, \\\n+225 const Float128& u) noexcept \\\n+226 { \\\n+227 return Float128{func (float128_t(t), float128_t(u))}; \\\n+228 } \\\n+229 static_assert(true, \"Require semicolon to unconfuse editors\")\n+230\n+231 _\bD_\bU_\bN_\bE_\b__\bU_\bN_\bA_\bR_\bY_\b__\bF_\bU_\bN_\bC(abs, fabsq);\n+232 _\bD_\bU_\bN_\bE_\b__\bU_\bN_\bA_\bR_\bY_\b__\bF_\bU_\bN_\bC(acos, acosq);\n+233 _\bD_\bU_\bN_\bE_\b__\bU_\bN_\bA_\bR_\bY_\b__\bF_\bU_\bN_\bC(acosh, acoshq);\n+234 _\bD_\bU_\bN_\bE_\b__\bU_\bN_\bA_\bR_\bY_\b__\bF_\bU_\bN_\bC(asin, asinq);\n+235 _\bD_\bU_\bN_\bE_\b__\bU_\bN_\bA_\bR_\bY_\b__\bF_\bU_\bN_\bC(asinh, asinhq);\n+236 _\bD_\bU_\bN_\bE_\b__\bU_\bN_\bA_\bR_\bY_\b__\bF_\bU_\bN_\bC(atan, atanq);\n+237 _\bD_\bU_\bN_\bE_\b__\bU_\bN_\bA_\bR_\bY_\b__\bF_\bU_\bN_\bC(atanh, atanhq);\n+238 _\bD_\bU_\bN_\bE_\b__\bU_\bN_\bA_\bR_\bY_\b__\bF_\bU_\bN_\bC(cbrt, cbrtq);\n+239 _\bD_\bU_\bN_\bE_\b__\bU_\bN_\bA_\bR_\bY_\b__\bF_\bU_\bN_\bC(ceil, ceilq);\n+240 _\bD_\bU_\bN_\bE_\b__\bU_\bN_\bA_\bR_\bY_\b__\bF_\bU_\bN_\bC(cos, cosq);\n+241 _\bD_\bU_\bN_\bE_\b__\bU_\bN_\bA_\bR_\bY_\b__\bF_\bU_\bN_\bC(cosh, coshq);\n+242 _\bD_\bU_\bN_\bE_\b__\bU_\bN_\bA_\bR_\bY_\b__\bF_\bU_\bN_\bC(erf, erfq);\n+243 _\bD_\bU_\bN_\bE_\b__\bU_\bN_\bA_\bR_\bY_\b__\bF_\bU_\bN_\bC(erfc, erfcq);\n+244 _\bD_\bU_\bN_\bE_\b__\bU_\bN_\bA_\bR_\bY_\b__\bF_\bU_\bN_\bC(exp, expq);\n+245 _\bD_\bU_\bN_\bE_\b__\bU_\bN_\bA_\bR_\bY_\b__\bF_\bU_\bN_\bC(expm1, expm1q);\n+246 _\bD_\bU_\bN_\bE_\b__\bU_\bN_\bA_\bR_\bY_\b__\bF_\bU_\bN_\bC(fabs, fabsq);\n+247 _\bD_\bU_\bN_\bE_\b__\bU_\bN_\bA_\bR_\bY_\b__\bF_\bU_\bN_\bC(floor, floorq);\n+248 DUNE_CUSTOM_UNARY_FUNC(int, ilogb, ilogbq);\n+249 _\bD_\bU_\bN_\bE_\b__\bU_\bN_\bA_\bR_\bY_\b__\bF_\bU_\bN_\bC(lgamma, lgammaq);\n+250 DUNE_CUSTOM_UNARY_FUNC(long long int, llrint, llrintq);\n+251 DUNE_CUSTOM_UNARY_FUNC(long long int, llround, llroundq);\n+252 _\bD_\bU_\bN_\bE_\b__\bU_\bN_\bA_\bR_\bY_\b__\bF_\bU_\bN_\bC(log, logq);\n+253 _\bD_\bU_\bN_\bE_\b__\bU_\bN_\bA_\bR_\bY_\b__\bF_\bU_\bN_\bC(log10, log10q);\n+254 _\bD_\bU_\bN_\bE_\b__\bU_\bN_\bA_\bR_\bY_\b__\bF_\bU_\bN_\bC(log1p, log1pq);\n+255 _\bD_\bU_\bN_\bE_\b__\bU_\bN_\bA_\bR_\bY_\b__\bF_\bU_\bN_\bC(log2, log2q);\n+256 // DUNE_UNARY_FUNC(logb, logbq); // not available in gcc5\n+257 DUNE_CUSTOM_UNARY_FUNC(long int, lrint, lrintq);\n+258 DUNE_CUSTOM_UNARY_FUNC(long int, lround, lroundq);\n+259 _\bD_\bU_\bN_\bE_\b__\bU_\bN_\bA_\bR_\bY_\b__\bF_\bU_\bN_\bC(nearbyint, nearbyintq);\n+260 DUNE_BINARY_FUNC(nextafter, nextafterq);\n+261 DUNE_BINARY_FUNC(pow, powq); // overload for integer argument see below\n+262 _\bD_\bU_\bN_\bE_\b__\bU_\bN_\bA_\bR_\bY_\b__\bF_\bU_\bN_\bC(rint, rintq);\n+263 _\bD_\bU_\bN_\bE_\b__\bU_\bN_\bA_\bR_\bY_\b__\bF_\bU_\bN_\bC(round, roundq);\n+264 _\bD_\bU_\bN_\bE_\b__\bU_\bN_\bA_\bR_\bY_\b__\bF_\bU_\bN_\bC(sin, sinq);\n+265 _\bD_\bU_\bN_\bE_\b__\bU_\bN_\bA_\bR_\bY_\b__\bF_\bU_\bN_\bC(sinh, sinhq);\n+266 _\bD_\bU_\bN_\bE_\b__\bU_\bN_\bA_\bR_\bY_\b__\bF_\bU_\bN_\bC(sqrt, sqrtq);\n+267 _\bD_\bU_\bN_\bE_\b__\bU_\bN_\bA_\bR_\bY_\b__\bF_\bU_\bN_\bC(tan, tanq);\n+268 _\bD_\bU_\bN_\bE_\b__\bU_\bN_\bA_\bR_\bY_\b__\bF_\bU_\bN_\bC(tanh, tanhq);\n+269 _\bD_\bU_\bN_\bE_\b__\bU_\bN_\bA_\bR_\bY_\b__\bF_\bU_\bN_\bC(tgamma, tgammaq);\n+270 _\bD_\bU_\bN_\bE_\b__\bU_\bN_\bA_\bR_\bY_\b__\bF_\bU_\bN_\bC(trunc, truncq);\n+271\n+272 DUNE_CUSTOM_UNARY_FUNC(bool, isfinite, finiteq);\n+273 DUNE_CUSTOM_UNARY_FUNC(bool, isinf, isinfq);\n+274 DUNE_CUSTOM_UNARY_FUNC(bool, isnan, isnanq);\n+275 DUNE_CUSTOM_UNARY_FUNC(bool, signbit, signbitq);\n+276\n+277#undef DUNE_UNARY_FUNC\n+278#undef DUNE_CUSTOM_UNARY_FUNC\n+279#undef DUNE_BINARY_FUNC\n+280\n+281 // like DUNE_BINARY_FUNC but provide overloads with arithmetic\n+282 // types in the first or second argument.\n+283#define DUNE_BINARY_ARITHMETIC_FUNC(name,func) \\\n+284 inline Float128 name(const Float128& t, \\\n+285 const Float128& u) noexcept \\\n+286 { \\\n+287 return Float128{func (float128_t(t), float128_t(u))}; \\\n+288 } \\\n+289 template ::value, int> = 0> \\\n+291 inline Float128 name(const T& t, \\\n+292 const Float128& u) noexcept \\\n+293 { \\\n+294 return Float128{func (float128_t(t), float128_t(u))}; \\\n+295 } \\\n+296 template ::value, int> = 0> \\\n+298 inline Float128 name(const Float128& t, \\\n+299 const U& u) noexcept \\\n+300 { \\\n+301 return Float128{func (float128_t(t), float128_t(u))}; \\\n+302 } \\\n+303 static_assert(true, \"Require semicolon to unconfuse editors\")\n+304\n+305 DUNE_BINARY_ARITHMETIC_FUNC(atan2,atan2q);\n+306 DUNE_BINARY_ARITHMETIC_FUNC(copysign,copysignq);\n+307 DUNE_BINARY_ARITHMETIC_FUNC(fdim,fdimq);\n+308 DUNE_BINARY_ARITHMETIC_FUNC(fmax,fmaxq);\n+309 DUNE_BINARY_ARITHMETIC_FUNC(fmin,fminq);\n+310 DUNE_BINARY_ARITHMETIC_FUNC(fmod,fmodq);\n+311 DUNE_BINARY_ARITHMETIC_FUNC(hypot,hypotq);\n+312 DUNE_BINARY_ARITHMETIC_FUNC(remainder,remainderq);\n+313\n+314#undef DUNE_BINARY_ARITHMETIC_FUNC\n+315\n+316 // some more cmath functions with special signature\n+317\n+318 inline Float128 fma(const Float128& t, const Float128& u, const Float128&\n+v)\n+319 {\n+320 return Float128{fmaq(float128_t(t),float128_t(u),float128_t(v))};\n+321 }\n+322\n+323 inline Float128 frexp(const Float128& u, int* p)\n+324 {\n+325 return Float128{frexpq(float128_t(u), p)};\n 326 }\n 327\n-_\b3_\b2_\b9 _\bd_\be_\br_\bi_\bv_\be_\bd_\b__\bt_\by_\bp_\be &_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b/_\b=_\b (const _\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be& k)\n-330 {\n-331 for (_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be i=0; i<_\br_\bo_\bw_\bs(); i++)\n-332 (*this)[i] /= k;\n-333 return asImp();\n-334 }\n-335\n-337 template \n-_\b3_\b3_\b8 _\bd_\be_\br_\bi_\bv_\be_\bd_\b__\bt_\by_\bp_\be &_\ba_\bx_\bp_\by (const _\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be &a, const _\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bO_\bt_\bh_\be_\br_\b> &x )\n+328 inline Float128 ldexp(const Float128& u, int p)\n+329 {\n+330 return Float128{ldexpq(float128_t(u), p)};\n+331 }\n+332\n+333 inline Float128 remquo(const Float128& t, const Float128& u, int* quo)\n+334 {\n+335 return Float128{remquoq(float128_t(t), float128_t(u), quo)};\n+336 }\n+337\n+338 inline Float128 scalbln(const Float128& u, long int e)\n 339 {\n-340 _\bD_\bU_\bN_\bE_\b__\bA_\bS_\bS_\bE_\bR_\bT_\b__\bB_\bO_\bU_\bN_\bD_\bS(_\br_\bo_\bw_\bs() == x._\br_\bo_\bw_\bs());\n-341 for( _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be i = 0; i < _\br_\bo_\bw_\bs(); ++i )\n-342 (*this)[ i ].axpy( a, x[ i ] );\n-343 return asImp();\n-344 }\n-345\n-347 template \n-_\b3_\b4_\b8 bool _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b=_\b=_\b (const _\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bO_\bt_\bh_\be_\br_\b>& x) const\n-349 {\n-350 _\bD_\bU_\bN_\bE_\b__\bA_\bS_\bS_\bE_\bR_\bT_\b__\bB_\bO_\bU_\bN_\bD_\bS(_\br_\bo_\bw_\bs() == x._\br_\bo_\bw_\bs());\n-351 for (_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be i=0; i<_\br_\bo_\bw_\bs(); i++)\n-352 if ((*this)[i]!=x[i])\n-353 return false;\n-354 return true;\n-355 }\n-357 template \n-_\b3_\b5_\b8 bool _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b!_\b=_\b (const _\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bO_\bt_\bh_\be_\br_\b>& x) const\n-359 {\n-360 return !_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b=_\b=(x);\n-361 }\n+340 return Float128{scalblnq(float128_t(u), e)};\n+341 }\n+342\n+343 inline Float128 scalbn(const Float128& u, int e)\n+344 {\n+345 return Float128{scalbnq(float128_t(u), e)};\n+346 }\n+347\n+349 // NOTE: This is much faster than a pow(x, Float128(p)) call\n+350 // NOTE: This is a modified version of boost::math::cstdfloat::detail::pown\n+351 // (adapted to the type Float128) that is part of the Boost 1.65 Math\n+toolkit 2.8.0\n+352 // and is implemented by Christopher Kormanyos, John Maddock, and Paul A.\n+Bristow,\n+353 // distributed under the Boost Software License, Version 1.0\n+354 // (See http://www.boost.org/LICENSE_1_0.txt)\n+355 template ::value, int> = 0>\n+357 inline Float128 pow(const Float128& x, const Int p)\n+358 {\n+359 static const Float128 _\bm_\ba_\bx_\b__\bv_\ba_\bl_\bu_\be = FLT128_MAX;\n+360 static const Float128 _\bm_\bi_\bn_\b__\bv_\ba_\bl_\bu_\be = FLT128_MIN;\n+361 static const Float128 inf_value = float128_t{1} / float128_t{0};\n 362\n-363\n-364 //===== linear maps\n-365\n-367 template\n-_\b3_\b6_\b8 void _\bm_\bv (const X& x, Y& y) const\n-369 {\n-370 auto&& xx = Impl::asVector(x);\n-371 auto&& yy = Impl::asVector(y);\n-372 _\bD_\bU_\bN_\bE_\b__\bA_\bS_\bS_\bE_\bR_\bT_\b__\bB_\bO_\bU_\bN_\bD_\bS((void*)(&x) != (void*)(&y));\n-373 _\bD_\bU_\bN_\bE_\b__\bA_\bS_\bS_\bE_\bR_\bT_\b__\bB_\bO_\bU_\bN_\bD_\bS(xx.N() == _\bM());\n-374 _\bD_\bU_\bN_\bE_\b__\bA_\bS_\bS_\bE_\bR_\bT_\b__\bB_\bO_\bU_\bN_\bD_\bS(yy.N() == _\bN());\n-375\n-376 using y_field_type = typename _\bF_\bi_\be_\bl_\bd_\bT_\br_\ba_\bi_\bt_\bs_\b<_\bY_\b>_\b:_\b:_\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be;\n-377 for (_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be i=0; i<_\br_\bo_\bw_\bs(); ++i)\n-378 {\n-379 yy[i] = y_field_type(0);\n-380 for (_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be j=0; j<_\bc_\bo_\bl_\bs(); j++)\n-381 yy[i] += (*this)[i][j] * xx[j];\n-382 }\n-383 }\n-384\n-386 template< class X, class Y >\n-_\b3_\b8_\b7 void _\bm_\bt_\bv ( const X &x, Y &y ) const\n-388 {\n-389 auto&& xx = Impl::asVector(x);\n-390 auto&& yy = Impl::asVector(y);\n-391 _\bD_\bU_\bN_\bE_\b__\bA_\bS_\bS_\bE_\bR_\bT_\b__\bB_\bO_\bU_\bN_\bD_\bS((void*)(&x) != (void*)(&y));\n-392 _\bD_\bU_\bN_\bE_\b__\bA_\bS_\bS_\bE_\bR_\bT_\b__\bB_\bO_\bU_\bN_\bD_\bS(xx.N() == _\bN());\n-393 _\bD_\bU_\bN_\bE_\b__\bA_\bS_\bS_\bE_\bR_\bT_\b__\bB_\bO_\bU_\bN_\bD_\bS(yy.N() == _\bM());\n-394\n-395 using y_field_type = typename _\bF_\bi_\be_\bl_\bd_\bT_\br_\ba_\bi_\bt_\bs_\b<_\bY_\b>_\b:_\b:_\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be;\n-396 for(_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be i = 0; i < _\bc_\bo_\bl_\bs(); ++i)\n-397 {\n-398 yy[i] = y_field_type(0);\n-399 for(_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be j = 0; j < _\br_\bo_\bw_\bs(); ++j)\n-400 yy[i] += (*this)[j][i] * xx[j];\n-401 }\n-402 }\n-403\n-405 template\n-_\b4_\b0_\b6 void _\bu_\bm_\bv (const X& x, Y& y) const\n-407 {\n-408 auto&& xx = Impl::asVector(x);\n-409 auto&& yy = Impl::asVector(y);\n-410 _\bD_\bU_\bN_\bE_\b__\bA_\bS_\bS_\bE_\bR_\bT_\b__\bB_\bO_\bU_\bN_\bD_\bS(xx.N() == _\bM());\n-411 _\bD_\bU_\bN_\bE_\b__\bA_\bS_\bS_\bE_\bR_\bT_\b__\bB_\bO_\bU_\bN_\bD_\bS(yy.N() == _\bN());\n-412 for (_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be i=0; i<_\br_\bo_\bw_\bs(); ++i)\n-413 for (_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be j=0; j<_\bc_\bo_\bl_\bs(); j++)\n-414 yy[i] += (*this)[i][j] * xx[j];\n-415 }\n-416\n-418 template\n-_\b4_\b1_\b9 void _\bu_\bm_\bt_\bv (const X& x, Y& y) const\n-420 {\n-421 auto&& xx = Impl::asVector(x);\n-422 auto&& yy = Impl::asVector(y);\n-423 _\bD_\bU_\bN_\bE_\b__\bA_\bS_\bS_\bE_\bR_\bT_\b__\bB_\bO_\bU_\bN_\bD_\bS(xx.N() == _\bN());\n-424 _\bD_\bU_\bN_\bE_\b__\bA_\bS_\bS_\bE_\bR_\bT_\b__\bB_\bO_\bU_\bN_\bD_\bS(yy.N() == _\bM());\n-425 for(_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be i = 0; i<_\br_\bo_\bw_\bs(); ++i)\n-426 for (_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be j=0; j<_\bc_\bo_\bl_\bs(); j++)\n-427 yy[j] += (*this)[i][j]*xx[i];\n-428 }\n-429\n-431 template\n-_\b4_\b3_\b2 void _\bu_\bm_\bh_\bv (const X& x, Y& y) const\n-433 {\n-434 auto&& xx = Impl::asVector(x);\n-435 auto&& yy = Impl::asVector(y);\n-436 _\bD_\bU_\bN_\bE_\b__\bA_\bS_\bS_\bE_\bR_\bT_\b__\bB_\bO_\bU_\bN_\bD_\bS(xx.N() == _\bN());\n-437 _\bD_\bU_\bN_\bE_\b__\bA_\bS_\bS_\bE_\bR_\bT_\b__\bB_\bO_\bU_\bN_\bD_\bS(yy.N() == _\bM());\n-438 for (_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be i=0; i<_\br_\bo_\bw_\bs(); i++)\n-439 for (_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be j=0; j<_\bc_\bo_\bl_\bs(); j++)\n-440 yy[j] += _\bc_\bo_\bn_\bj_\bu_\bg_\ba_\bt_\be_\bC_\bo_\bm_\bp_\bl_\be_\bx((*this)[i][j])*xx[i];\n-441 }\n-442\n-444 template\n-_\b4_\b4_\b5 void _\bm_\bm_\bv (const X& x, Y& y) const\n-446 {\n-447 auto&& xx = Impl::asVector(x);\n-448 auto&& yy = Impl::asVector(y);\n-449 _\bD_\bU_\bN_\bE_\b__\bA_\bS_\bS_\bE_\bR_\bT_\b__\bB_\bO_\bU_\bN_\bD_\bS(xx.N() == _\bM());\n-450 _\bD_\bU_\bN_\bE_\b__\bA_\bS_\bS_\bE_\bR_\bT_\b__\bB_\bO_\bU_\bN_\bD_\bS(yy.N() == _\bN());\n-451 for (_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be i=0; i<_\br_\bo_\bw_\bs(); i++)\n-452 for (_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be j=0; j<_\bc_\bo_\bl_\bs(); j++)\n-453 yy[i] -= (*this)[i][j] * xx[j];\n-454 }\n-455\n-457 template\n-_\b4_\b5_\b8 void _\bm_\bm_\bt_\bv (const X& x, Y& y) const\n-459 {\n-460 auto&& xx = Impl::asVector(x);\n-461 auto&& yy = Impl::asVector(y);\n-462 _\bD_\bU_\bN_\bE_\b__\bA_\bS_\bS_\bE_\bR_\bT_\b__\bB_\bO_\bU_\bN_\bD_\bS(xx.N() == _\bN());\n-463 _\bD_\bU_\bN_\bE_\b__\bA_\bS_\bS_\bE_\bR_\bT_\b__\bB_\bO_\bU_\bN_\bD_\bS(yy.N() == _\bM());\n-464 for (_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be i=0; i<_\br_\bo_\bw_\bs(); i++)\n-465 for (_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be j=0; j<_\bc_\bo_\bl_\bs(); j++)\n-466 yy[j] -= (*this)[i][j]*xx[i];\n-467 }\n-468\n-470 template\n-_\b4_\b7_\b1 void _\bm_\bm_\bh_\bv (const X& x, Y& y) const\n-472 {\n-473 auto&& xx = Impl::asVector(x);\n-474 auto&& yy = Impl::asVector(y);\n-475 _\bD_\bU_\bN_\bE_\b__\bA_\bS_\bS_\bE_\bR_\bT_\b__\bB_\bO_\bU_\bN_\bD_\bS(xx.N() == _\bN());\n-476 _\bD_\bU_\bN_\bE_\b__\bA_\bS_\bS_\bE_\bR_\bT_\b__\bB_\bO_\bU_\bN_\bD_\bS(yy.N() == _\bM());\n-477 for (_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be i=0; i<_\br_\bo_\bw_\bs(); i++)\n-478 for (_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be j=0; j<_\bc_\bo_\bl_\bs(); j++)\n-479 yy[j] -= _\bc_\bo_\bn_\bj_\bu_\bg_\ba_\bt_\be_\bC_\bo_\bm_\bp_\bl_\be_\bx((*this)[i][j])*xx[i];\n-480 }\n-481\n-483 template\n-_\b4_\b8_\b4 void _\bu_\bs_\bm_\bv (const typename _\bF_\bi_\be_\bl_\bd_\bT_\br_\ba_\bi_\bt_\bs_\b<_\bY_\b>_\b:_\b:_\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be & alpha,\n-485 const X& x, Y& y) const\n-486 {\n-487 auto&& xx = Impl::asVector(x);\n-488 auto&& yy = Impl::asVector(y);\n-489 _\bD_\bU_\bN_\bE_\b__\bA_\bS_\bS_\bE_\bR_\bT_\b__\bB_\bO_\bU_\bN_\bD_\bS(xx.N() == _\bM());\n-490 _\bD_\bU_\bN_\bE_\b__\bA_\bS_\bS_\bE_\bR_\bT_\b__\bB_\bO_\bU_\bN_\bD_\bS(yy.N() == _\bN());\n-491 for (_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be i=0; i<_\br_\bo_\bw_\bs(); i++)\n-492 for (_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be j=0; j<_\bc_\bo_\bl_\bs(); j++)\n-493 yy[i] += alpha * (*this)[i][j] * xx[j];\n-494 }\n-495\n-497 template\n-_\b4_\b9_\b8 void _\bu_\bs_\bm_\bt_\bv (const typename _\bF_\bi_\be_\bl_\bd_\bT_\br_\ba_\bi_\bt_\bs_\b<_\bY_\b>_\b:_\b:_\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be & alpha,\n-499 const X& x, Y& y) const\n-500 {\n-501 auto&& xx = Impl::asVector(x);\n-502 auto&& yy = Impl::asVector(y);\n-503 _\bD_\bU_\bN_\bE_\b__\bA_\bS_\bS_\bE_\bR_\bT_\b__\bB_\bO_\bU_\bN_\bD_\bS(xx.N() == _\bN());\n-504 _\bD_\bU_\bN_\bE_\b__\bA_\bS_\bS_\bE_\bR_\bT_\b__\bB_\bO_\bU_\bN_\bD_\bS(yy.N() == _\bM());\n-505 for (_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be i=0; i<_\br_\bo_\bw_\bs(); i++)\n-506 for (_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be j=0; j<_\bc_\bo_\bl_\bs(); j++)\n-507 yy[j] += alpha*(*this)[i][j]*xx[i];\n-508 }\n-509\n-511 template\n-_\b5_\b1_\b2 void _\bu_\bs_\bm_\bh_\bv (const typename _\bF_\bi_\be_\bl_\bd_\bT_\br_\ba_\bi_\bt_\bs_\b<_\bY_\b>_\b:_\b:_\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be & alpha,\n-513 const X& x, Y& y) const\n-514 {\n-515 auto&& xx = Impl::asVector(x);\n-516 auto&& yy = Impl::asVector(y);\n-517 _\bD_\bU_\bN_\bE_\b__\bA_\bS_\bS_\bE_\bR_\bT_\b__\bB_\bO_\bU_\bN_\bD_\bS(xx.N() == _\bN());\n-518 _\bD_\bU_\bN_\bE_\b__\bA_\bS_\bS_\bE_\bR_\bT_\b__\bB_\bO_\bU_\bN_\bD_\bS(yy.N() == _\bM());\n-519 for (_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be i=0; i<_\br_\bo_\bw_\bs(); i++)\n-520 for (_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be j=0; j<_\bc_\bo_\bl_\bs(); j++)\n-521 yy[j] +=\n-522 alpha*_\bc_\bo_\bn_\bj_\bu_\bg_\ba_\bt_\be_\bC_\bo_\bm_\bp_\bl_\be_\bx((*this)[i][j])*xx[i];\n-523 }\n-524\n-525 //===== norms\n-526\n-_\b5_\b2_\b8 typename _\bF_\bi_\be_\bl_\bd_\bT_\br_\ba_\bi_\bt_\bs_\b<_\bv_\ba_\bl_\bu_\be_\b__\bt_\by_\bp_\be_\b>_\b:_\b:_\br_\be_\ba_\bl_\b__\bt_\by_\bp_\be _\bf_\br_\bo_\bb_\be_\bn_\bi_\bu_\bs_\b__\bn_\bo_\br_\bm () const\n-529 {\n-530 typename _\bF_\bi_\be_\bl_\bd_\bT_\br_\ba_\bi_\bt_\bs_\b<_\bv_\ba_\bl_\bu_\be_\b__\bt_\by_\bp_\be_\b>_\b:_\b:_\br_\be_\ba_\bl_\b__\bt_\by_\bp_\be sum=(0.0);\n-531 for (_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be i=0; i<_\br_\bo_\bw_\bs(); ++i) sum += (*this)[i].two_norm2();\n-532 return fvmeta::sqrt(sum);\n-533 }\n-534\n-_\b5_\b3_\b6 typename _\bF_\bi_\be_\bl_\bd_\bT_\br_\ba_\bi_\bt_\bs_\b<_\bv_\ba_\bl_\bu_\be_\b__\bt_\by_\bp_\be_\b>_\b:_\b:_\br_\be_\ba_\bl_\b__\bt_\by_\bp_\be _\bf_\br_\bo_\bb_\be_\bn_\bi_\bu_\bs_\b__\bn_\bo_\br_\bm_\b2 () const\n-537 {\n-538 typename _\bF_\bi_\be_\bl_\bd_\bT_\br_\ba_\bi_\bt_\bs_\b<_\bv_\ba_\bl_\bu_\be_\b__\bt_\by_\bp_\be_\b>_\b:_\b:_\br_\be_\ba_\bl_\b__\bt_\by_\bp_\be sum=(0.0);\n-539 for (_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be i=0; i<_\br_\bo_\bw_\bs(); ++i) sum += (*this)[i].two_norm2();\n-540 return sum;\n-541 }\n-542\n-544 template ::value, int>::type = 0>\n-_\b5_\b4_\b6 typename _\bF_\bi_\be_\bl_\bd_\bT_\br_\ba_\bi_\bt_\bs_\b<_\bv_\bt_\b>_\b:_\b:_\br_\be_\ba_\bl_\b__\bt_\by_\bp_\be _\bi_\bn_\bf_\bi_\bn_\bi_\bt_\by_\b__\bn_\bo_\br_\bm() const {\n-547 using real_type = typename _\bF_\bi_\be_\bl_\bd_\bT_\br_\ba_\bi_\bt_\bs_\b<_\bv_\bt_\b>_\b:_\b:_\br_\be_\ba_\bl_\b__\bt_\by_\bp_\be;\n-548 using std::max;\n-549\n-550 real_type norm = 0;\n-551 for (auto const &x : *this) {\n-552 real_type const a = x.one_norm();\n-553 norm = max(a, norm);\n-554 }\n-555 return norm;\n-556 }\n-557\n-559 template ::value, int>::type = 0>\n-_\b5_\b6_\b1 typename _\bF_\bi_\be_\bl_\bd_\bT_\br_\ba_\bi_\bt_\bs_\b<_\bv_\bt_\b>_\b:_\b:_\br_\be_\ba_\bl_\b__\bt_\by_\bp_\be _\bi_\bn_\bf_\bi_\bn_\bi_\bt_\by_\b__\bn_\bo_\br_\bm_\b__\br_\be_\ba_\bl() const {\n-562 using real_type = typename _\bF_\bi_\be_\bl_\bd_\bT_\br_\ba_\bi_\bt_\bs_\b<_\bv_\bt_\b>_\b:_\b:_\br_\be_\ba_\bl_\b__\bt_\by_\bp_\be;\n-563 using std::max;\n-564\n-565 real_type norm = 0;\n-566 for (auto const &x : *this) {\n-567 real_type const a = x.one_norm_real();\n-568 norm = max(a, norm);\n-569 }\n-570 return norm;\n-571 }\n-572\n-574 template ::value, int>::type = 0>\n-_\b5_\b7_\b6 typename _\bF_\bi_\be_\bl_\bd_\bT_\br_\ba_\bi_\bt_\bs_\b<_\bv_\bt_\b>_\b:_\b:_\br_\be_\ba_\bl_\b__\bt_\by_\bp_\be _\bi_\bn_\bf_\bi_\bn_\bi_\bt_\by_\b__\bn_\bo_\br_\bm() const {\n-577 using real_type = typename _\bF_\bi_\be_\bl_\bd_\bT_\br_\ba_\bi_\bt_\bs_\b<_\bv_\bt_\b>_\b:_\b:_\br_\be_\ba_\bl_\b__\bt_\by_\bp_\be;\n-578 using std::max;\n-579\n-580 real_type norm = 0;\n-581 real_type isNaN = 1;\n-582 for (auto const &x : *this) {\n-583 real_type const a = x.one_norm();\n-584 norm = max(a, norm);\n-585 isNaN += a;\n-586 }\n-587 return norm * (isNaN / isNaN);\n-588 }\n-589\n-591 template ::value, int>::type = 0>\n-_\b5_\b9_\b3 typename _\bF_\bi_\be_\bl_\bd_\bT_\br_\ba_\bi_\bt_\bs_\b<_\bv_\bt_\b>_\b:_\b:_\br_\be_\ba_\bl_\b__\bt_\by_\bp_\be _\bi_\bn_\bf_\bi_\bn_\bi_\bt_\by_\b__\bn_\bo_\br_\bm_\b__\br_\be_\ba_\bl() const {\n-594 using real_type = typename _\bF_\bi_\be_\bl_\bd_\bT_\br_\ba_\bi_\bt_\bs_\b<_\bv_\bt_\b>_\b:_\b:_\br_\be_\ba_\bl_\b__\bt_\by_\bp_\be;\n-595 using std::max;\n-596\n-597 real_type norm = 0;\n-598 real_type isNaN = 1;\n-599 for (auto const &x : *this) {\n-600 real_type const a = x.one_norm_real();\n-601 norm = max(a, norm);\n-602 isNaN += a;\n-603 }\n-604 return norm * (isNaN / isNaN);\n-605 }\n-606\n-607 //===== solve\n-608\n-613 template \n-_\b6_\b1_\b4 void _\bs_\bo_\bl_\bv_\be (V1& x, const V2& b, bool doPivoting = true) const;\n-615\n-_\b6_\b2_\b0 void _\bi_\bn_\bv_\be_\br_\bt(bool doPivoting = true);\n-621\n-_\b6_\b2_\b3 _\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be _\bd_\be_\bt_\be_\br_\bm_\bi_\bn_\ba_\bn_\bt (bool doPivoting = true) const;\n-624\n-626 template\n-_\b6_\b2_\b7 MAT& _\bl_\be_\bf_\bt_\bm_\bu_\bl_\bt_\bi_\bp_\bl_\by (const _\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bM_\b2_\b>& _\bM)\n-628 {\n-629 _\bD_\bU_\bN_\bE_\b__\bA_\bS_\bS_\bE_\bR_\bT_\b__\bB_\bO_\bU_\bN_\bD_\bS(_\bM.rows() == _\bM.cols());\n-630 _\bD_\bU_\bN_\bE_\b__\bA_\bS_\bS_\bE_\bR_\bT_\b__\bB_\bO_\bU_\bN_\bD_\bS(_\bM.rows() == _\br_\bo_\bw_\bs());\n-631 _\bA_\bu_\bt_\bo_\bn_\bo_\bm_\bo_\bu_\bs_\bV_\ba_\bl_\bu_\be_\b<_\bM_\bA_\bT_\b> C(asImp());\n-632\n-633 for (_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be i=0; i<_\br_\bo_\bw_\bs(); i++)\n-634 for (_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be j=0; j<_\bc_\bo_\bl_\bs(); j++) {\n-635 (*this)[i][j] = 0;\n-636 for (_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be k=0; k<_\br_\bo_\bw_\bs(); k++)\n-637 (*this)[i][j] += _\bM[i][k]*C[k][j];\n-638 }\n-639\n-640 return asImp();\n-641 }\n-642\n-644 template\n-_\b6_\b4_\b5 MAT& _\br_\bi_\bg_\bh_\bt_\bm_\bu_\bl_\bt_\bi_\bp_\bl_\by (const _\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bM_\b2_\b>& _\bM)\n-646 {\n-647 _\bD_\bU_\bN_\bE_\b__\bA_\bS_\bS_\bE_\bR_\bT_\b__\bB_\bO_\bU_\bN_\bD_\bS(_\bM.rows() == _\bM.cols());\n-648 _\bD_\bU_\bN_\bE_\b__\bA_\bS_\bS_\bE_\bR_\bT_\b__\bB_\bO_\bU_\bN_\bD_\bS(_\bM.cols() == _\bc_\bo_\bl_\bs());\n-649 _\bA_\bu_\bt_\bo_\bn_\bo_\bm_\bo_\bu_\bs_\bV_\ba_\bl_\bu_\be_\b<_\bM_\bA_\bT_\b> C(asImp());\n-650\n-651 for (_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be i=0; i<_\br_\bo_\bw_\bs(); i++)\n-652 for (_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be j=0; j<_\bc_\bo_\bl_\bs(); j++) {\n-653 (*this)[i][j] = 0;\n-654 for (_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be k=0; k<_\bc_\bo_\bl_\bs(); k++)\n-655 (*this)[i][j] += C[i][k]*_\bM[k][j];\n-656 }\n-657 return asImp();\n-658 }\n-659\n-660#if 0\n-662 template\n-663 _\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bK_\b,_\bl_\b,_\bc_\bo_\bl_\bs_\b> leftmultiplyany (const _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bK_\b,_\bl_\b,_\br_\bo_\bw_\bs_\b>& _\bM)\n-const\n-664 {\n-665 _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bK_\b,_\bl_\b,_\bc_\bo_\bl_\bs_\b> C;\n-666\n-667 for (_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be i=0; i\n-679 FieldMatrix rightmultiplyany (const FieldMatrix& _\bM)\n-const\n-680 {\n-681 FieldMatrix C;\n-682\n-683 for (_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be i=0; i<_\br_\bo_\bw_\bs(); i++) {\n-684 for (_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be j=0; j= 0 && i < _\br_\bo_\bw_\bs());\n-726 _\bD_\bU_\bN_\bE_\b__\bA_\bS_\bS_\bE_\bR_\bT_\b__\bB_\bO_\bU_\bN_\bD_\bS(j >= 0 && j < _\bc_\bo_\bl_\bs());\n-727 return true;\n-728 }\n-729\n-730 protected:\n-731\n-732#ifndef DOXYGEN\n-733 struct ElimPivot\n-734 {\n-735 ElimPivot(std::vector & pivot);\n-736\n-737 void _\bs_\bw_\ba_\bp(std::size_t i, simd_index_type j);\n-738\n-739 template\n-740 void operator()(const T&, int, int)\n-741 {}\n-742\n-743 std::vector & pivot_;\n-744 };\n-745\n-746 template\n-747 struct Elim\n-748 {\n-749 Elim(V& rhs);\n-750\n-751 void _\bs_\bw_\ba_\bp(std::size_t i, simd_index_type j);\n-752\n-753 void operator()(const typename V::field_type& factor, int k, int i);\n-754\n-755 V* rhs_;\n-756 };\n-757\n-758 struct ElimDet\n-759 {\n-760 ElimDet(field_type& sign) : sign_(_\bs_\bi_\bg_\bn)\n-761 { sign_ = 1; }\n-762\n-763 void _\bs_\bw_\ba_\bp(std::size_t i, simd_index_type j)\n-764 {\n-765 sign_ *=\n-766 Simd::cond(simd_index_type(i) == j, field_type(1), field_type(-1));\n-767 }\n-768\n-769 void operator()(const field_type&, int, int)\n-770 {}\n-771\n-772 field_type& sign_;\n-773 };\n-774#endif // DOXYGEN\n-775\n-777\n-815 template\n-_\b8_\b1_\b6 static void _\bl_\bu_\bD_\be_\bc_\bo_\bm_\bp_\bo_\bs_\bi_\bt_\bi_\bo_\bn(_\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bM_\bA_\bT_\b>& A, Func func,\n-817 Mask &nonsingularLanes, bool throwEarly, bool doPivoting);\n-818 };\n-819\n-820#ifndef DOXYGEN\n-821 template\n-822 _\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bM_\bA_\bT_\b>_\b:_\b:_\bE_\bl_\bi_\bm_\bP_\bi_\bv_\bo_\bt_\b:_\b:_\bE_\bl_\bi_\bm_\bP_\bi_\bv_\bo_\bt(std::vector &\n-pivot)\n-823 : pivot_(pivot)\n-824 {\n-825 typedef typename std::vector::size_type _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be;\n-826 for(_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be i=0; i < pivot_.size(); ++i) pivot_[i]=i;\n-827 }\n-828\n-829 template\n-830 void DenseMatrix::ElimPivot::swap(std::size_t i, simd_index_type j)\n-831 {\n-832 pivot_[i] =\n-833 _\bS_\bi_\bm_\bd_\b:_\b:_\bc_\bo_\bn_\bd(Simd::Scalar(i) == j, pivot_[i], j);\n-834 }\n-835\n-836 template\n-837 template\n-838 DenseMatrix::Elim::Elim(V& rhs)\n-839 : rhs_(&rhs)\n-840 {}\n-841\n-842 template\n-843 template\n-844 void DenseMatrix::Elim::swap(std::size_t i, simd_index_type j)\n-845 {\n-846 using std::swap;\n-847\n-848 // see the comment in luDecomposition()\n-849 for(std::size_t l = 0; l < _\bS_\bi_\bm_\bd_\b:_\b:_\bl_\ba_\bn_\be_\bs(j); ++l)\n-850 _\bs_\bw_\ba_\bp(_\bS_\bi_\bm_\bd_\b:_\b:_\bl_\ba_\bn_\be(l, (*rhs_)[ i ]),\n-851 _\bS_\bi_\bm_\bd_\b:_\b:_\bl_\ba_\bn_\be(l, (*rhs_)[_\bS_\bi_\bm_\bd_\b:_\b:_\bl_\ba_\bn_\be(l, j)]));\n-852 }\n-853\n-854 template\n-855 template\n-856 void DenseMatrix::\n-857 Elim::operator()(const typename V::field_type& factor, int k, int i)\n-858 {\n-859 (*rhs_)[k] -= factor*(*rhs_)[i];\n-860 }\n-861\n-862 template\n-863 template\n-864 inline void _\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bM_\bA_\bT_\b>_\b:_\b:\n-865_\b _\bl_\bu_\bD_\be_\bc_\bo_\bm_\bp_\bo_\bs_\bi_\bt_\bi_\bo_\bn(DenseMatrix& A, Func func, Mask &nonsingularLanes,\n-866 bool throwEarly, bool doPivoting)\n-867 {\n-868 using std::max;\n-869 using std::swap;\n-870\n-871 typedef typename _\bF_\bi_\be_\bl_\bd_\bT_\br_\ba_\bi_\bt_\bs_\b<_\bv_\ba_\bl_\bu_\be_\b__\bt_\by_\bp_\be_\b>_\b:_\b:_\br_\be_\ba_\bl_\b__\bt_\by_\bp_\be real_type;\n-872\n-873 // LU decomposition of A in A\n-874 for (size_type i=0; i pivmax;\n-886 pivmax = _\bS_\bi_\bm_\bd_\b:_\b:_\bc_\bo_\bn_\bd(mask, abs, pivmax);\n-887 imax = _\bS_\bi_\bm_\bd_\b:_\b:_\bc_\bo_\bn_\bd(mask, simd_index_type(k), imax);\n-888 }\n-889 // swap rows\n-890 for (size_type j=0; j\n-933 template \n-934 inline void _\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bM_\bA_\bT_\b>_\b:_\b:_\bs_\bo_\bl_\bv_\be(V1& x, const V2& b, bool doPivoting)\n-const\n-935 {\n-936 using real_type = typename _\bF_\bi_\be_\bl_\bd_\bT_\br_\ba_\bi_\bt_\bs_\b<_\bv_\ba_\bl_\bu_\be_\b__\bt_\by_\bp_\be_\b>_\b:_\b:_\br_\be_\ba_\bl_\b__\bt_\by_\bp_\be;\n-937 // never mind those ifs, because they get optimized away\n-938 if (rows()!=cols())\n-939 _\bD_\bU_\bN_\bE_\b__\bT_\bH_\bR_\bO_\bW(FMatrixError, \"Can't solve for a \" << rows() << \"x\" << cols() <<\n-\" matrix!\");\n-940\n-941 if (rows()==1) {\n-942\n-943#ifdef DUNE_FMatrix_WITH_CHECKING\n-944 if (_\bS_\bi_\bm_\bd_\b:_\b:_\ba_\bn_\by_\bT_\br_\bu_\be(fvmeta::absreal((*this)[0][0])\n-945 < _\bF_\bM_\ba_\bt_\br_\bi_\bx_\bP_\br_\be_\bc_\bi_\bs_\bi_\bo_\bn_\b<_\b>_\b:_\b:_\ba_\bb_\bs_\bo_\bl_\bu_\bt_\be_\b__\bl_\bi_\bm_\bi_\bt()))\n-946 _\bD_\bU_\bN_\bE_\b__\bT_\bH_\bR_\bO_\bW(FMatrixError,\"matrix is singular\");\n-947#endif\n-948 x[0] = b[0]/(*this)[0][0];\n-949\n-950 }\n-951 else if (rows()==2) {\n-952\n-953 field_type detinv = (*this)[0][0]*(*this)[1][1]-(*this)[0][1]*(*this)[1]\n-[0];\n-954#ifdef DUNE_FMatrix_WITH_CHECKING\n-955 if (_\bS_\bi_\bm_\bd_\b:_\b:_\ba_\bn_\by_\bT_\br_\bu_\be(fvmeta::absreal(detinv)\n-956 < _\bF_\bM_\ba_\bt_\br_\bi_\bx_\bP_\br_\be_\bc_\bi_\bs_\bi_\bo_\bn_\b<_\b>_\b:_\b:_\ba_\bb_\bs_\bo_\bl_\bu_\bt_\be_\b__\bl_\bi_\bm_\bi_\bt()))\n-957 _\bD_\bU_\bN_\bE_\b__\bT_\bH_\bR_\bO_\bW(FMatrixError,\"matrix is singular\");\n-958#endif\n-959 detinv = real_type(1.0)/detinv;\n-960\n-961 x[0] = detinv*((*this)[1][1]*b[0]-(*this)[0][1]*b[1]);\n-962 x[1] = detinv*((*this)[0][0]*b[1]-(*this)[1][0]*b[0]);\n-963\n-964 }\n-965 else if (rows()==3) {\n-966\n-967 field_type d = determinant(doPivoting);\n-968#ifdef DUNE_FMatrix_WITH_CHECKING\n-969 if (_\bS_\bi_\bm_\bd_\b:_\b:_\ba_\bn_\by_\bT_\br_\bu_\be(fvmeta::absreal(d)\n-970 < _\bF_\bM_\ba_\bt_\br_\bi_\bx_\bP_\br_\be_\bc_\bi_\bs_\bi_\bo_\bn_\b<_\b>_\b:_\b:_\ba_\bb_\bs_\bo_\bl_\bu_\bt_\be_\b__\bl_\bi_\bm_\bi_\bt()))\n-971 _\bD_\bU_\bN_\bE_\b__\bT_\bH_\bR_\bO_\bW(FMatrixError,\"matrix is singular\");\n-972#endif\n-973\n-974 x[0] = (b[0]*(*this)[1][1]*(*this)[2][2] - b[0]*(*this)[2][1]*(*this)[1][2]\n-975 - b[1] *(*this)[0][1]*(*this)[2][2] + b[1]*(*this)[2][1]*(*this)[0][2]\n-976 + b[2] *(*this)[0][1]*(*this)[1][2] - b[2]*(*this)[1][1]*(*this)[0][2]) /\n-d;\n-977\n-978 x[1] = ((*this)[0][0]*b[1]*(*this)[2][2] - (*this)[0][0]*b[2]*(*this)[1][2]\n-979 - (*this)[1][0] *b[0]*(*this)[2][2] + (*this)[1][0]*b[2]*(*this)[0][2]\n-980 + (*this)[2][0] *b[0]*(*this)[1][2] - (*this)[2][0]*b[1]*(*this)[0][2]) /\n-d;\n-981\n-982 x[2] = ((*this)[0][0]*(*this)[1][1]*b[2] - (*this)[0][0]*(*this)[2][1]*b[1]\n-983 - (*this)[1][0] *(*this)[0][1]*b[2] + (*this)[1][0]*(*this)[2][1]*b[0]\n-984 + (*this)[2][0] *(*this)[0][1]*b[1] - (*this)[2][0]*(*this)[1][1]*b[0]) /\n-d;\n-985\n-986 }\n-987 else {\n-988\n-989 V1& rhs = x; // use x to store rhs\n-990 rhs = b; // copy data\n-991 Elim elim(rhs);\n-992 AutonomousValue A(asImp());\n-993 Simd::Mask::real_type>\n-994 nonsingularLanes(true);\n-995\n-996 AutonomousValue::luDecomposition(A, elim, nonsingularLanes, true,\n-doPivoting);\n-997\n-998 // backsolve\n-999 for(int i=rows()-1; i>=0; i--) {\n-1000 for (size_type j=i+1; j\n-1008 inline void _\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bM_\bA_\bT_\b>_\b:_\b:_\bi_\bn_\bv_\be_\br_\bt(bool doPivoting)\n-1009 {\n-1010 using real_type = typename _\bF_\bi_\be_\bl_\bd_\bT_\br_\ba_\bi_\bt_\bs_\b<_\bM_\bA_\bT_\b>_\b:_\b:_\br_\be_\ba_\bl_\b__\bt_\by_\bp_\be;\n-1011 using std::swap;\n-1012\n-1013 // never mind those ifs, because they get optimized away\n-1014 if (rows()!=cols())\n-1015 _\bD_\bU_\bN_\bE_\b__\bT_\bH_\bR_\bO_\bW(FMatrixError, \"Can't invert a \" << rows() << \"x\" << cols() << \"\n-matrix!\");\n-1016\n-1017 if (rows()==1) {\n-1018\n-1019#ifdef DUNE_FMatrix_WITH_CHECKING\n-1020 if (_\bS_\bi_\bm_\bd_\b:_\b:_\ba_\bn_\by_\bT_\br_\bu_\be(fvmeta::absreal((*this)[0][0])\n-1021 < _\bF_\bM_\ba_\bt_\br_\bi_\bx_\bP_\br_\be_\bc_\bi_\bs_\bi_\bo_\bn_\b<_\b>_\b:_\b:_\ba_\bb_\bs_\bo_\bl_\bu_\bt_\be_\b__\bl_\bi_\bm_\bi_\bt()))\n-1022 _\bD_\bU_\bN_\bE_\b__\bT_\bH_\bR_\bO_\bW(FMatrixError,\"matrix is singular\");\n-1023#endif\n-1024 (*this)[0][0] = real_type( 1 ) / (*this)[0][0];\n-1025\n-1026 }\n-1027 else if (rows()==2) {\n-1028\n-1029 field_type detinv = (*this)[0][0]*(*this)[1][1]-(*this)[0][1]*(*this)[1]\n-[0];\n-1030#ifdef DUNE_FMatrix_WITH_CHECKING\n-1031 if (_\bS_\bi_\bm_\bd_\b:_\b:_\ba_\bn_\by_\bT_\br_\bu_\be(fvmeta::absreal(detinv)\n-1032 < _\bF_\bM_\ba_\bt_\br_\bi_\bx_\bP_\br_\be_\bc_\bi_\bs_\bi_\bo_\bn_\b<_\b>_\b:_\b:_\ba_\bb_\bs_\bo_\bl_\bu_\bt_\be_\b__\bl_\bi_\bm_\bi_\bt()))\n-1033 _\bD_\bU_\bN_\bE_\b__\bT_\bH_\bR_\bO_\bW(FMatrixError,\"matrix is singular\");\n-1034#endif\n-1035 detinv = real_type( 1 ) / detinv;\n-1036\n-1037 field_type temp=(*this)[0][0];\n-1038 (*this)[0][0] = (*this)[1][1]*detinv;\n-1039 (*this)[0][1] = -(*this)[0][1]*detinv;\n-1040 (*this)[1][0] = -(*this)[1][0]*detinv;\n-1041 (*this)[1][1] = temp*detinv;\n-1042\n-1043 }\n-1044 else if (rows()==3)\n-1045 {\n-1046 using K = field_type;\n-1047 // code generated by maple\n-1048 K t4 = (*this)[0][0] * (*this)[1][1];\n-1049 K t6 = (*this)[0][0] * (*this)[1][2];\n-1050 K t8 = (*this)[0][1] * (*this)[1][0];\n-1051 K t10 = (*this)[0][2] * (*this)[1][0];\n-1052 K t12 = (*this)[0][1] * (*this)[2][0];\n-1053 K t14 = (*this)[0][2] * (*this)[2][0];\n-1054\n-1055 K det = (t4*(*this)[2][2]-t6*(*this)[2][1]-t8*(*this)[2][2]+\n-1056 t10*(*this)[2][1]+t12*(*this)[1][2]-t14*(*this)[1][1]);\n-1057 K t17 = K(1.0)/det;\n-1058\n-1059 K matrix01 = (*this)[0][1];\n-1060 K matrix00 = (*this)[0][0];\n-1061 K matrix10 = (*this)[1][0];\n-1062 K matrix11 = (*this)[1][1];\n-1063\n-1064 (*this)[0][0] = ((*this)[1][1] * (*this)[2][2] - (*this)[1][2] * (*this)\n-[2][1])*t17;\n-1065 (*this)[0][1] = -((*this)[0][1] * (*this)[2][2] - (*this)[0][2] * (*this)\n-[2][1])*t17;\n-1066 (*this)[0][2] = (matrix01 * (*this)[1][2] - (*this)[0][2] * (*this)[1]\n-[1])*t17;\n-1067 (*this)[1][0] = -((*this)[1][0] * (*this)[2][2] - (*this)[1][2] * (*this)\n-[2][0])*t17;\n-1068 (*this)[1][1] = (matrix00 * (*this)[2][2] - t14) * t17;\n-1069 (*this)[1][2] = -(t6-t10) * t17;\n-1070 (*this)[2][0] = (matrix10 * (*this)[2][1] - matrix11 * (*this)[2][0]) *\n-t17;\n-1071 (*this)[2][1] = -(matrix00 * (*this)[2][1] - t12) * t17;\n-1072 (*this)[2][2] = (t4-t8) * t17;\n-1073 }\n-1074 else {\n-1075 using std::swap;\n-1076\n-1077 AutonomousValue A(asImp());\n-1078 std::vector pivot(rows());\n-1079 Simd::Mask::real_type>\n-1080 nonsingularLanes(true);\n-1081 AutonomousValue::luDecomposition(A, ElimPivot(pivot),\n-nonsingularLanes, true, doPivoting);\n-1082 auto& L=A;\n-1083 auto& U=A;\n-1084\n-1085 // initialize inverse\n-1086 *this=field_type();\n-1087\n-1088 for(size_type i=0; i0;) {\n-1099 --i;\n-1100 for (size_type k=0; k0; ) {\n-1108 --i;\n-1109 for(std::size_t l = 0; l < _\bS_\bi_\bm_\bd_\b:_\b:_\bl_\ba_\bn_\be_\bs((*this)[0][0]); ++l)\n-1110 {\n-1111 std::size_t pi = _\bS_\bi_\bm_\bd_\b:_\b:_\bl_\ba_\bn_\be(l, pivot[i]);\n-1112 if(i!=pi)\n-1113 for(size_type j=0; j\n-1123 inline typename _\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bM_\bA_\bT_\b>_\b:_\b:_\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be\n-1124 _\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bM_\bA_\bT_\b>_\b:_\b:_\bd_\be_\bt_\be_\br_\bm_\bi_\bn_\ba_\bn_\bt(bool doPivoting) const\n-1125 {\n-1126 // never mind those ifs, because they get optimized away\n-1127 if (rows()!=cols())\n-1128 _\bD_\bU_\bN_\bE_\b__\bT_\bH_\bR_\bO_\bW(FMatrixError, \"There is no determinant for a \" << rows() << \"x\"\n-<< cols() << \" matrix!\");\n-1129\n-1130 if (rows()==1)\n-1131 return (*this)[0][0];\n-1132\n-1133 if (rows()==2)\n-1134 return (*this)[0][0]*(*this)[1][1] - (*this)[0][1]*(*this)[1][0];\n-1135\n-1136 if (rows()==3) {\n-1137 // code generated by maple\n-1138 field_type t4 = (*this)[0][0] * (*this)[1][1];\n-1139 field_type t6 = (*this)[0][0] * (*this)[1][2];\n-1140 field_type t8 = (*this)[0][1] * (*this)[1][0];\n-1141 field_type t10 = (*this)[0][2] * (*this)[1][0];\n-1142 field_type t12 = (*this)[0][1] * (*this)[2][0];\n-1143 field_type t14 = (*this)[0][2] * (*this)[2][0];\n-1144\n-1145 return (t4*(*this)[2][2]-t6*(*this)[2][1]-t8*(*this)[2][2]+\n-1146 t10*(*this)[2][1]+t12*(*this)[1][2]-t14*(*this)[1][1]);\n-1147\n-1148 }\n-1149\n-1150 AutonomousValue A(asImp());\n-1151 field_type det;\n-1152 Simd::Mask::real_type>\n-1153 nonsingularLanes(true);\n-1154\n-1155 AutonomousValue::luDecomposition(A, ElimDet(det), nonsingularLanes,\n-false, doPivoting);\n-1156 det = _\bS_\bi_\bm_\bd_\b:_\b:_\bc_\bo_\bn_\bd(nonsingularLanes, det, field_type(0));\n-1157\n-1158 for (size_type i = 0; i < rows(); ++i)\n-1159 det *= A[i][i];\n-1160 return det;\n-1161 }\n-1162\n-1163#endif // DOXYGEN\n-1164\n-_\b1_\b1_\b6_\b5 namespace DenseMatrixHelp {\n-1166\n-1168 template \n-_\b1_\b1_\b6_\b9 static inline void _\bm_\bu_\bl_\bt_\bA_\bs_\bs_\bi_\bg_\bn(const _\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bM_\bA_\bT_\b> &matrix, const\n-_\bD_\be_\bn_\bs_\be_\bV_\be_\bc_\bt_\bo_\br_\b<_\bV_\b1_\b> & x, _\bD_\be_\bn_\bs_\be_\bV_\be_\bc_\bt_\bo_\br_\b<_\bV_\b2_\b> & ret)\n-1170 {\n-1171 _\bD_\bU_\bN_\bE_\b__\bA_\bS_\bS_\bE_\bR_\bT_\b__\bB_\bO_\bU_\bN_\bD_\bS(x._\bs_\bi_\bz_\be() == matrix._\bc_\bo_\bl_\bs());\n-1172 _\bD_\bU_\bN_\bE_\b__\bA_\bS_\bS_\bE_\bR_\bT_\b__\bB_\bO_\bU_\bN_\bD_\bS(ret._\bs_\bi_\bz_\be() == matrix._\br_\bo_\bw_\bs());\n-1173 typedef typename _\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bM_\bA_\bT_\b>_\b:_\b:_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be size_type;\n-1174\n-1175 for(size_type i=0; i\n-1188 static inline void multAssignTransposed( const _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bK_\b,_\br_\bo_\bw_\bs_\b,_\bc_\bo_\bl_\bs_\b>\n-&matrix, const _\bF_\bi_\be_\bl_\bd_\bV_\be_\bc_\bt_\bo_\br_\b<_\bK_\b,_\br_\bo_\bw_\bs_\b> & x, _\bF_\bi_\be_\bl_\bd_\bV_\be_\bc_\bt_\bo_\br_\b<_\bK_\b,_\bc_\bo_\bl_\bs_\b> & ret)\n-1189 {\n-1190 typedef typename _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bK_\b,_\br_\bo_\bw_\bs_\b,_\bc_\bo_\bl_\bs_\b>_\b:_\b:_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be size_type;\n-1191\n-1192 for(size_type i=0; i\n-1202 static inline FieldVector mult(const FieldMatrix\n-&matrix, const FieldVector & x)\n-1203 {\n-1204 FieldVector ret;\n-1205 _\bm_\bu_\bl_\bt_\bA_\bs_\bs_\bi_\bg_\bn(matrix,x,ret);\n-1206 return ret;\n-1207 }\n-1208\n-1210 template \n-1211 static inline FieldVector multTransposed(const\n-FieldMatrix &matrix, const FieldVector & x)\n-1212 {\n-1213 FieldVector ret;\n-1214 multAssignTransposed( matrix, x, ret );\n-1215 return ret;\n-1216 }\n-1217#endif\n-1218\n-1219 } // end namespace DenseMatrixHelp\n-1220\n-1222 template\n-_\b1_\b2_\b2_\b3 std::ostream& _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b<_\b<_\b (std::ostream& s, const _\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bM_\bA_\bT_\b>& a)\n-1224 {\n-1225 for (typename _\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bM_\bA_\bT_\b>_\b:_\b:_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be i=0; i _\bm_\ba_\bx_\b__\bv_\ba_\bl_\bu_\be) : bool(+x > _\bm_\ba_\bx_\b__\bv_\ba_\bl_\bu_\be));\n+366\n+367 if (isnan) { return x; }\n+368 if (isinf) { return Float128{nanq(\"\")}; }\n+369\n+370 const Float128 abs_x = (isneg ? -x : x);\n+371 if (p < Int(0)) {\n+372 if (abs_x < _\bm_\bi_\bn_\b__\bv_\ba_\bl_\bu_\be)\n+373 return (isneg ? -inf_value : +inf_value);\n+374 else\n+375 return Float128(1) / pow(x, Int(-p));\n+376 }\n+377\n+378 if (p == Int(0)) { return Float128(1); }\n+379 if (p == Int(1)) { return x; }\n+380 if (abs_x > _\bm_\ba_\bx_\b__\bv_\ba_\bl_\bu_\be)\n+381 return (isneg ? -inf_value : +inf_value);\n+382\n+383 if (p == Int(2)) { return (x * x); }\n+384 if (p == Int(3)) { return ((x * x) * x); }\n+385 if (p == Int(4)) { const Float128 x2 = (x * x); return (x2 * x2); }\n+386\n+387 Float128 result = ((p % Int(2)) != Int(0)) ? x : Float128(1);\n+388 Float128 xn = x; // binary powers of x\n+389\n+390 Int p2 = p;\n+391 while (Int(p2 /= 2) != Int(0)) {\n+392 xn *= xn; // Square xn for each binary power\n+393\n+394 const bool has_binary_power = (Int(p2 % Int(2)) != Int(0));\n+395 if (has_binary_power)\n+396 result *= xn;\n+397 }\n+398\n+399 return result;\n+400 }\n+401\n+402\n+403 } // end namespace Impl\n+404\n+405 template <>\n+406 struct IsNumber\n+407 : public std::true_type {};\n+408\n+409} // end namespace Dune\n+410\n+411namespace _\bs_\bt_\bd\n+412{\n+413#ifndef NO_STD_NUMERIC_LIMITS_SPECIALIZATION\n+414 template <>\n+415 class numeric_limits<_\bD_\bu_\bn_\be::Impl::Float128>\n+416 {\n+417 using Float128 = Dune::Impl::Float128;\n+418 using float128_t = Dune::Impl::float128_t;\n+419\n+420 public:\n+421 static constexpr bool is_specialized = true;\n+422 static constexpr Float128 _\bm_\bi_\bn() noexcept { return FLT128_MIN; }\n+423 static constexpr Float128 _\bm_\ba_\bx() noexcept { return FLT128_MAX; }\n+424 static constexpr Float128 lowest() noexcept { return -FLT128_MAX; }\n+425 static constexpr int digits = FLT128_MANT_DIG;\n+426 static constexpr int digits10 = 34;\n+427 static constexpr int max_digits10 = 36;\n+428 static constexpr bool is_signed = true;\n+429 static constexpr bool is_integer = false;\n+430 static constexpr bool is_exact = false;\n+431 static constexpr int radix = 2;\n+432 static constexpr Float128 epsilon() noexcept { return FLT128_EPSILON; }\n+433 static constexpr Float128 round_error() noexcept { return float128_t{0.5};\n+}\n+434 static constexpr int min_exponent = FLT128_MIN_EXP;\n+435 static constexpr int min_exponent10 = FLT128_MIN_10_EXP;\n+436 static constexpr int max_exponent = FLT128_MAX_EXP;\n+437 static constexpr int max_exponent10 = FLT128_MAX_10_EXP;\n+438 static constexpr bool has_infinity = true;\n+439 static constexpr bool has_quiet_NaN = true;\n+440 static constexpr bool has_signaling_NaN = false;\n+441 static constexpr float_denorm_style has_denorm = denorm_present;\n+442 static constexpr bool has_denorm_loss = false;\n+443 static constexpr Float128 infinity() noexcept { return float128_t{1}/\n+float128_t{0}; }\n+444 static Float128 quiet_NaN() noexcept { return nanq(\"\"); }\n+445 static constexpr Float128 signaling_NaN() noexcept { return float128_t{}; }\n+446 static constexpr Float128 denorm_min() noexcept { return FLT128_DENORM_MIN;\n+}\n+447 static constexpr bool is_iec559 = true;\n+448 static constexpr bool is_bounded = false;\n+449 static constexpr bool is_modulo = false;\n+450 static constexpr bool traps = false;\n+451 static constexpr bool tinyness_before = false;\n+452 static constexpr float_round_style round_style = round_to_nearest;\n+453 };\n+454#endif\n+455} // end namespace std\n+456\n+457#endif // HAVE_QUADMATH\n+458#endif // DUNE_QUADMATH_HH\n _\bt_\by_\bp_\be_\bt_\br_\ba_\bi_\bt_\bs_\b._\bh_\bh\n Traits for type conversions and type information.\n-_\bb_\bo_\bu_\bn_\bd_\bs_\bc_\bh_\be_\bc_\bk_\bi_\bn_\bg_\b._\bh_\bh\n-Macro for wrapping boundary checks.\n-_\bf_\bv_\be_\bc_\bt_\bo_\br_\b._\bh_\bh\n-Implements a vector constructed from a given type representing a field and a\n-compile-time given size.\n _\be_\bx_\bc_\be_\bp_\bt_\bi_\bo_\bn_\bs_\b._\bh_\bh\n A few common exception classes.\n-_\bD_\bU_\bN_\bE_\b__\bA_\bS_\bS_\bE_\bR_\bT_\b__\bB_\bO_\bU_\bN_\bD_\bS\n-#define DUNE_ASSERT_BOUNDS(cond)\n-If DUNE_CHECK_BOUNDS is defined: check if condition cond holds; otherwise, do\n-nothing.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn boundschecking.hh:30\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bu_\bt_\bo_\bn_\bo_\bm_\bo_\bu_\bs_\bV_\ba_\bl_\bu_\be\n-typename AutonomousValueType< T >::type AutonomousValue\n-Type free of internal references that T can be converted to.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn typetraits.hh:588\n+_\bD_\bU_\bN_\bE_\b__\bB_\bI_\bN_\bA_\bR_\bY_\b__\bO_\bP\n+#define DUNE_BINARY_OP(OP)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn debugalign.hh:261\n+_\bD_\bU_\bN_\bE_\b__\bU_\bN_\bA_\bR_\bY_\b__\bF_\bU_\bN_\bC\n+#define DUNE_UNARY_FUNC(name)\n+_\bD_\bU_\bN_\bE_\b__\bA_\bS_\bS_\bI_\bG_\bN_\b__\bO_\bP\n+#define DUNE_ASSIGN_OP(OP)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn debugalign.hh:220\n+_\bD_\bu_\bn_\be_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b>_\b>\n+Stream & operator>>(Stream &stream, std::tuple< Ts... > &t)\n+Read a std::tuple.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn streamoperators.hh:43\n+_\bD_\bu_\bn_\be_\b:_\b:_\bH_\by_\bb_\br_\bi_\bd_\b:_\b:_\bm_\ba_\bx\n+constexpr auto max\n+Function object that returns the greater of the given values.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn hybridutilities.hh:484\n+_\bD_\bu_\bn_\be_\b:_\b:_\bH_\by_\bb_\br_\bi_\bd_\b:_\b:_\bm_\bi_\bn\n+constexpr auto min\n+Function object that returns the smaller of the given values.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn hybridutilities.hh:506\n _\bD_\bu_\bn_\be_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b<_\b<\n std::ostream & operator<<(std::ostream &s, const bigunsignedint< k > &x)\n D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bigunsignedint.hh:278\n+_\bD_\bu_\bn_\be_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b-\n+bigunsignedint< k > operator-(const bigunsignedint< k > &x, std::uintmax_t y)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bigunsignedint.hh:542\n+_\bD_\bu_\bn_\be_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b+\n+bigunsignedint< k > operator+(const bigunsignedint< k > &x, std::uintmax_t y)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bigunsignedint.hh:535\n _\bD_\bU_\bN_\bE_\b__\bT_\bH_\bR_\bO_\bW\n #define DUNE_THROW(E, m)\n D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn exceptions.hh:218\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bi_\bm_\bd_\b:_\b:_\ba_\bn_\by_\bT_\br_\bu_\be\n-bool anyTrue(const Mask &mask)\n-Whether any entry is true\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn simd/interface.hh:429\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bi_\bm_\bd_\b:_\b:_\bc_\bo_\bn_\bd\n-V cond(M &&mask, const V &ifTrue, const V &ifFalse)\n-Like the ?: operator.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn simd/interface.hh:386\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bi_\bm_\bd_\b:_\b:_\ba_\bl_\bl_\bT_\br_\bu_\be\n-bool allTrue(const Mask &mask)\n-Whether all entries are true\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn simd/interface.hh:439\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bi_\bm_\bd_\b:_\b:_\bR_\be_\bb_\bi_\bn_\bd\n-typename Overloads::RebindType< std::decay_t< S >, std::decay_t< V > >::type\n-Rebind\n-Construct SIMD type with different scalar type.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn simd/interface.hh:253\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bi_\bm_\bd_\b:_\b:_\bl_\ba_\bn_\be_\bs\n-constexpr std::size_t lanes()\n-Number of lanes in a SIMD type.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn simd/interface.hh:305\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bi_\bm_\bd_\b:_\b:_\bl_\ba_\bn_\be\n-decltype(auto) lane(std::size_t l, V &&v)\n-Extract an element of a SIMD type.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn simd/interface.hh:324\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bi_\bm_\bd_\b:_\b:_\bO_\bv_\be_\br_\bl_\bo_\ba_\bd_\bs_\b:_\b:_\bm_\ba_\bs_\bk\n-Mask< V > mask(ADLTag< 0, std::is_same< V, Mask< V > >::value >, const V &v)\n-implements Simd::mask()\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn defaults.hh:153\n _\bs_\bt_\bd\n STL namespace.\n _\bD_\bu_\bn_\be\n Dune namespace.\n D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn alignedallocator.hh:13\n-_\bD_\bu_\bn_\be_\b:_\b:_\bs_\bw_\ba_\bp\n-void swap(T &v1, T &v2, bool mask)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn simd.hh:472\n-_\bD_\bu_\bn_\be_\b:_\b:_\bs_\bi_\bg_\bn\n-int sign(const T &val)\n-Return the sign of the value.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn math.hh:180\n-_\bD_\bu_\bn_\be_\b:_\b:_\bc_\bo_\bn_\bj_\bu_\bg_\ba_\bt_\be_\bC_\bo_\bm_\bp_\bl_\be_\bx\n-K conjugateComplex(const K &x)\n-compute conjugate complex of x\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn math.hh:164\n-_\bD_\bu_\bn_\be_\b:_\b:_\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\bH_\be_\bl_\bp_\b:_\b:_\bm_\bu_\bl_\bt_\bA_\bs_\bs_\bi_\bg_\bn\n-static void multAssign(const DenseMatrix< MAT > &matrix, const DenseVector< V1\n-> &x, DenseVector< V2 > &ret)\n-calculates ret = matrix * x\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn densematrix.hh:1169\n-_\bD_\bu_\bn_\be_\b:_\b:_\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx\n-A dense n x m matrix.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn densematrix.hh:140\n-_\bD_\bu_\bn_\be_\b:_\b:_\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bc_\bo_\bn_\bs_\bt_\b__\bi_\bt_\be_\br_\ba_\bt_\bo_\br\n-ConstIterator const_iterator\n-typedef for stl compliant access\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn densematrix.hh:244\n-_\bD_\bu_\bn_\be_\b:_\b:_\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b-\n-derived_type operator-() const\n-Matrix negation.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn densematrix.hh:298\n-_\bD_\bu_\bn_\be_\b:_\b:_\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bs_\bo_\bl_\bv_\be\n-void solve(V1 &x, const V2 &b, bool doPivoting=true) const\n-Solve system A x = b.\n-_\bD_\bu_\bn_\be_\b:_\b:_\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bm_\bv\n-void mv(const X &x, Y &y) const\n-y = A x\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn densematrix.hh:368\n-_\bD_\bu_\bn_\be_\b:_\b:_\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be\n-Traits::value_type field_type\n-export the type representing the field\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn densematrix.hh:160\n-_\bD_\bu_\bn_\be_\b:_\b:_\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\ba_\bx_\bp_\by\n-derived_type & axpy(const field_type &a, const DenseMatrix< Other > &x)\n-vector space axpy operation (*this += a x)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn densematrix.hh:338\n-_\bD_\bu_\bn_\be_\b:_\b:_\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bb_\be_\bf_\bo_\br_\be_\bE_\bn_\bd\n-ConstIterator beforeEnd() const\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn densematrix.hh:264\n-_\bD_\bu_\bn_\be_\b:_\b:_\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b=\n-derived_type & operator=(const RHS &rhs)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn densematrix.hh:279\n-_\bD_\bu_\bn_\be_\b:_\b:_\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bm_\bm_\bt_\bv\n-void mmtv(const X &x, Y &y) const\n-y -= A^T x\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn densematrix.hh:458\n-_\bD_\bu_\bn_\be_\b:_\b:_\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bi_\bn_\bf_\bi_\bn_\bi_\bt_\by_\b__\bn_\bo_\br_\bm_\b__\br_\be_\ba_\bl\n-FieldTraits< vt >::real_type infinity_norm_real() const\n-simplified infinity norm (uses Manhattan norm for complex values)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn densematrix.hh:561\n-_\bD_\bu_\bn_\be_\b:_\b:_\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bC_\bo_\bn_\bs_\bt_\bC_\bo_\bl_\bI_\bt_\be_\br_\ba_\bt_\bo_\br\n-std::remove_reference< const_row_reference >::type::ConstIterator\n-ConstColIterator\n-rename the iterators for easier access\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn densematrix.hh:248\n-_\bD_\bu_\bn_\be_\b:_\b:_\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bb_\be_\bf_\bo_\br_\be_\bB_\be_\bg_\bi_\bn\n-ConstIterator beforeBegin() const\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn densematrix.hh:271\n-_\bD_\bu_\bn_\be_\b:_\b:_\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bi_\bn_\bv_\be_\br_\bt\n-void invert(bool doPivoting=true)\n-Compute inverse.\n-_\bD_\bu_\bn_\be_\b:_\b:_\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bl_\bu_\bD_\be_\bc_\bo_\bm_\bp_\bo_\bs_\bi_\bt_\bi_\bo_\bn\n-static void luDecomposition(DenseMatrix< MAT > &A, Func func, Mask\n-&nonsingularLanes, bool throwEarly, bool doPivoting)\n-do an LU-Decomposition on matrix A\n-_\bD_\bu_\bn_\be_\b:_\b:_\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bb_\bl_\bo_\bc_\bk_\b__\bt_\by_\bp_\be\n-Traits::value_type block_type\n-export the type representing the components\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn densematrix.hh:163\n-_\bD_\bu_\bn_\be_\b:_\b:_\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bm_\bt_\bv\n-void mtv(const X &x, Y &y) const\n-y = A^T x\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn densematrix.hh:387\n-_\bD_\bu_\bn_\be_\b:_\b:_\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bc_\bo_\bl_\bs\n-constexpr size_type cols() const\n-number of columns\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn densematrix.hh:715\n-_\bD_\bu_\bn_\be_\b:_\b:_\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bs_\bi_\bz_\be\n-size_type size() const\n-size method (number of rows)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn densematrix.hh:200\n-_\bD_\bu_\bn_\be_\b:_\b:_\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bM\n-constexpr size_type M() const\n-number of columns\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn densematrix.hh:703\n-_\bD_\bu_\bn_\be_\b:_\b:_\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\br_\bi_\bg_\bh_\bt_\bm_\bu_\bl_\bt_\bi_\bp_\bl_\by\n-MAT & rightmultiply(const DenseMatrix< M2 > &M)\n-Multiplies M from the right to this matrix.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn densematrix.hh:645\n-_\bD_\bu_\bn_\be_\b:_\b:_\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\be_\bn_\bd\n-Iterator end()\n-end iterator\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn densematrix.hh:222\n-_\bD_\bu_\bn_\be_\b:_\b:_\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bb_\be_\bf_\bo_\br_\be_\bB_\be_\bg_\bi_\bn\n-Iterator beforeBegin()\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn densematrix.hh:236\n-_\bD_\bu_\bn_\be_\b:_\b:_\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b/_\b=\n-derived_type & operator/=(const field_type &k)\n-vector space division by scalar\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn densematrix.hh:329\n-_\bD_\bu_\bn_\be_\b:_\b:_\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b*_\b=\n-derived_type & operator*=(const field_type &k)\n-vector space multiplication with scalar\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn densematrix.hh:321\n-_\bD_\bu_\bn_\be_\b:_\b:_\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bb_\be_\bf_\bo_\br_\be_\bE_\bn_\bd\n-Iterator beforeEnd()\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn densematrix.hh:229\n-_\bD_\bu_\bn_\be_\b:_\b:_\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bv_\ba_\bl_\bu_\be_\b__\bt_\by_\bp_\be\n-Traits::value_type value_type\n-export the type representing the field\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn densematrix.hh:157\n-_\bD_\bu_\bn_\be_\b:_\b:_\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bu_\bs_\bm_\bv\n-void usmv(const typename FieldTraits< Y >::field_type &alpha, const X &x, Y &y)\n-const\n-y += alpha A x\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn densematrix.hh:484\n-_\bD_\bu_\bn_\be_\b:_\b:_\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bu_\bs_\bm_\bh_\bv\n-void usmhv(const typename FieldTraits< Y >::field_type &alpha, const X &x, Y\n-&y) const\n-y += alpha A^H x\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn densematrix.hh:512\n-_\bD_\bu_\bn_\be_\b:_\b:_\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bm_\bm_\bv\n-void mmv(const X &x, Y &y) const\n-y -= A x\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn densematrix.hh:445\n-_\bD_\bu_\bn_\be_\b:_\b:_\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\br_\bo_\bw_\bs\n-constexpr size_type rows() const\n-number of rows\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn densematrix.hh:709\n-_\bD_\bu_\bn_\be_\b:_\b:_\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bl_\be_\bf_\bt_\bm_\bu_\bl_\bt_\bi_\bp_\bl_\by\n-MAT & leftmultiply(const DenseMatrix< M2 > &M)\n-Multiplies M from the left to this matrix.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn densematrix.hh:627\n-_\bD_\bu_\bn_\be_\b:_\b:_\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bu_\bs_\bm_\bt_\bv\n-void usmtv(const typename FieldTraits< Y >::field_type &alpha, const X &x, Y\n-&y) const\n-y += alpha A^T x\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn densematrix.hh:498\n-_\bD_\bu_\bn_\be_\b:_\b:_\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b-_\b=\n-derived_type & operator-=(const DenseMatrix< Other > &x)\n-vector space subtraction\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn densematrix.hh:312\n-_\bD_\bu_\bn_\be_\b:_\b:_\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b!_\b=\n-bool operator!=(const DenseMatrix< Other > &x) const\n-Binary matrix incomparison.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn densematrix.hh:358\n-_\bD_\bu_\bn_\be_\b:_\b:_\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bm_\bm_\bh_\bv\n-void mmhv(const X &x, Y &y) const\n-y -= A^H x\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn densematrix.hh:471\n-_\bD_\bu_\bn_\be_\b:_\b:_\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bd_\be_\br_\bi_\bv_\be_\bd_\b__\bt_\by_\bp_\be\n-Traits::derived_type derived_type\n-type of derived matrix class\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn densematrix.hh:154\n-_\bD_\bu_\bn_\be_\b:_\b:_\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b[_\b]\n-row_reference operator[](size_type i)\n-random access\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn densematrix.hh:189\n-_\bD_\bu_\bn_\be_\b:_\b:_\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\be_\bx_\bi_\bs_\bt_\bs\n-bool exists(size_type i, size_type j) const\n-return true when (i,j) is in pattern\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn densematrix.hh:723\n-_\bD_\bu_\bn_\be_\b:_\b:_\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bR_\bo_\bw_\bI_\bt_\be_\br_\ba_\bt_\bo_\br\n-Iterator RowIterator\n-rename the iterators for easier access\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn densematrix.hh:211\n-_\bD_\bu_\bn_\be_\b:_\b:_\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bb_\bl_\bo_\bc_\bk_\bl_\be_\bv_\be_\bl\n-static constexpr int blocklevel\n-The number of block levels we contain. This is the leaf, that is, 1.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn densematrix.hh:178\n-_\bD_\bu_\bn_\be_\b:_\b:_\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bf_\br_\bo_\bb_\be_\bn_\bi_\bu_\bs_\b__\bn_\bo_\br_\bm\n-FieldTraits< value_type >::real_type frobenius_norm() const\n-frobenius norm: sqrt(sum over squared values of entries)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn densematrix.hh:528\n-_\bD_\bu_\bn_\be_\b:_\b:_\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bu_\bm_\bv\n-void umv(const X &x, Y &y) const\n-y += A x\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn densematrix.hh:406\n-_\bD_\bu_\bn_\be_\b:_\b:_\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bC_\bo_\bn_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br\n-DenseIterator< const DenseMatrix, const row_type, const_row_reference >\n-ConstIterator\n-Iterator class for sequential access.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn densematrix.hh:242\n-_\bD_\bu_\bn_\be_\b:_\b:_\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bi_\bn_\bf_\bi_\bn_\bi_\bt_\by_\b__\bn_\bo_\br_\bm\n-FieldTraits< vt >::real_type infinity_norm() const\n-infinity norm (row sum norm, how to generalize for blocks?)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn densematrix.hh:546\n-_\bD_\bu_\bn_\be_\b:_\b:_\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\br_\bo_\bw_\b__\bt_\by_\bp_\be\n-Traits::row_type row_type\n-The type used to represent a row (must fulfill the Dune::DenseVector interface)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn densematrix.hh:169\n-_\bD_\bu_\bn_\be_\b:_\b:_\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bN\n-constexpr size_type N() const\n-number of rows\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn densematrix.hh:697\n-_\bD_\bu_\bn_\be_\b:_\b:_\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be\n-Traits::size_type size_type\n-The type used for the index access and size operation.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn densematrix.hh:166\n-_\bD_\bu_\bn_\be_\b:_\b:_\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bc_\bo_\bn_\bs_\bt_\b__\br_\bo_\bw_\b__\br_\be_\bf_\be_\br_\be_\bn_\bc_\be\n-Traits::const_row_reference const_row_reference\n-The type used to represent a reference to a constant row (usually const\n-row_type &)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn densematrix.hh:175\n-_\bD_\bu_\bn_\be_\b:_\b:_\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bf_\br_\bo_\bb_\be_\bn_\bi_\bu_\bs_\b__\bn_\bo_\br_\bm_\b2\n-FieldTraits< value_type >::real_type frobenius_norm2() const\n-square of frobenius norm, need for block recursion\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn densematrix.hh:536\n-_\bD_\bu_\bn_\be_\b:_\b:_\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bC_\bo_\bl_\bI_\bt_\be_\br_\ba_\bt_\bo_\br\n-std::remove_reference< row_reference >::type::Iterator ColIterator\n-rename the iterators for easier access\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn densematrix.hh:213\n-_\bD_\bu_\bn_\be_\b:_\b:_\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\br_\bo_\bw_\b__\br_\be_\bf_\be_\br_\be_\bn_\bc_\be\n-Traits::row_reference row_reference\n-The type used to represent a reference to a row (usually row_type &)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn densematrix.hh:172\n-_\bD_\bu_\bn_\be_\b:_\b:_\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b=_\b=\n-bool operator==(const DenseMatrix< Other > &x) const\n-Binary matrix comparison.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn densematrix.hh:348\n-_\bD_\bu_\bn_\be_\b:_\b:_\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bi_\bt_\be_\br_\ba_\bt_\bo_\br\n-Iterator iterator\n-typedef for stl compliant access\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn densematrix.hh:209\n-_\bD_\bu_\bn_\be_\b:_\b:_\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bC_\bo_\bn_\bs_\bt_\bR_\bo_\bw_\bI_\bt_\be_\br_\ba_\bt_\bo_\br\n-ConstIterator ConstRowIterator\n-rename the iterators for easier access\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn densematrix.hh:246\n-_\bD_\bu_\bn_\be_\b:_\b:_\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bI_\bt_\be_\br_\ba_\bt_\bo_\br\n-DenseIterator< DenseMatrix, row_type, row_reference > Iterator\n-Iterator class for sequential access.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn densematrix.hh:207\n-_\bD_\bu_\bn_\be_\b:_\b:_\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bu_\bm_\bt_\bv\n-void umtv(const X &x, Y &y) const\n-y += A^T x\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn densematrix.hh:419\n-_\bD_\bu_\bn_\be_\b:_\b:_\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bb_\be_\bg_\bi_\bn\n-ConstIterator begin() const\n-begin iterator\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn densematrix.hh:251\n-_\bD_\bu_\bn_\be_\b:_\b:_\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bd_\be_\bt_\be_\br_\bm_\bi_\bn_\ba_\bn_\bt\n-field_type determinant(bool doPivoting=true) const\n-calculates the determinant of this matrix\n-_\bD_\bu_\bn_\be_\b:_\b:_\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bb_\be_\bg_\bi_\bn\n-Iterator begin()\n-begin iterator\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn densematrix.hh:216\n-_\bD_\bu_\bn_\be_\b:_\b:_\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bu_\bm_\bh_\bv\n-void umhv(const X &x, Y &y) const\n-y += A^H x\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn densematrix.hh:432\n-_\bD_\bu_\bn_\be_\b:_\b:_\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b+_\b=\n-derived_type & operator+=(const DenseMatrix< Other > &x)\n-vector space addition\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn densematrix.hh:289\n-_\bD_\bu_\bn_\be_\b:_\b:_\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\be_\bn_\bd\n-ConstIterator end() const\n-end iterator\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn densematrix.hh:257\n-_\bD_\bu_\bn_\be_\b:_\b:_\bF_\bi_\be_\bl_\bd_\bT_\br_\ba_\bi_\bt_\bs_\b<_\b _\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bM_\b _\b>_\b _\b>_\b:_\b:_\br_\be_\ba_\bl_\b__\bt_\by_\bp_\be\n-const FieldTraits< typenameDenseMatVecTraits< M >::value_type >::real_type\n-real_type\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn densematrix.hh:34\n-_\bD_\bu_\bn_\be_\b:_\b:_\bF_\bi_\be_\bl_\bd_\bT_\br_\ba_\bi_\bt_\bs_\b<_\b _\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bM_\b _\b>_\b _\b>_\b:_\b:_\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be\n-const FieldTraits< typenameDenseMatVecTraits< M >::value_type >::field_type\n-field_type\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn densematrix.hh:33\n-_\bD_\bu_\bn_\be_\b:_\b:_\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx\n-A dense n x m matrix.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn fmatrix.hh:117\n-_\bD_\bu_\bn_\be_\b:_\b:_\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be\n-Base::size_type size_type\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn fmatrix.hh:127\n-_\bD_\bu_\bn_\be_\b:_\b:_\bF_\bi_\be_\bl_\bd_\bV_\be_\bc_\bt_\bo_\br\n-vector space out of a tensor product of fields.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn fvector.hh:91\n-_\bD_\bu_\bn_\be_\b:_\b:_\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\bA_\bs_\bs_\bi_\bg_\bn_\be_\br\n-you have to specialize this structure for any type that should be assignable to\n-a DenseMatrix\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn densematrix.hh:59\n-_\bD_\bu_\bn_\be_\b:_\b:_\bF_\bM_\ba_\bt_\br_\bi_\bx_\bE_\br_\br_\bo_\br\n-Error thrown if operations of a FieldMatrix fail.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn densematrix.hh:126\n-_\bD_\bu_\bn_\be_\b:_\b:_\bD_\be_\bn_\bs_\be_\bV_\be_\bc_\bt_\bo_\br\n-Interface for a class of dense vectors over a given field.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn densevector.hh:229\n-_\bD_\bu_\bn_\be_\b:_\b:_\bD_\be_\bn_\bs_\be_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\bs_\bi_\bz_\be\n-size_type size() const\n-size method\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn densevector.hh:336\n-_\bD_\bu_\bn_\be_\b:_\b:_\bD_\be_\bn_\bs_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br\n-Generic iterator class for dense vector and matrix implementations.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn densevector.hh:131\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\bh_\bE_\br_\br_\bo_\br\n-Default exception class for mathematical errors.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn exceptions.hh:241\n-_\bD_\bu_\bn_\be_\b:_\b:_\bF_\bi_\be_\bl_\bd_\bT_\br_\ba_\bi_\bt_\bs\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn ftraits.hh:26\n-_\bD_\bu_\bn_\be_\b:_\b:_\bF_\bi_\be_\bl_\bd_\bT_\br_\ba_\bi_\bt_\bs_\b:_\b:_\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be\n-T field_type\n-export the type representing the field\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn ftraits.hh:28\n-_\bD_\bu_\bn_\be_\b:_\b:_\bF_\bi_\be_\bl_\bd_\bT_\br_\ba_\bi_\bt_\bs_\b:_\b:_\br_\be_\ba_\bl_\b__\bt_\by_\bp_\be\n-T real_type\n-export the type representing the real type of the field\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn ftraits.hh:30\n-_\bD_\bu_\bn_\be_\b:_\b:_\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\bV_\be_\bc_\bT_\br_\ba_\bi_\bt_\bs\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matvectraits.hh:31\n-_\bD_\bu_\bn_\be_\b:_\b:_\bF_\bM_\ba_\bt_\br_\bi_\bx_\bP_\br_\be_\bc_\bi_\bs_\bi_\bo_\bn_\b:_\b:_\ba_\bb_\bs_\bo_\bl_\bu_\bt_\be_\b__\bl_\bi_\bm_\bi_\bt\n-static ctype absolute_limit()\n-return threshold to declare matrix singular\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn precision.hh:28\n-_\bs_\bi_\bm_\bd_\b._\bh_\bh\n-Include file for users of the SIMD abstraction layer.\n+_\bD_\bu_\bn_\be_\b:_\b:_\bm_\ba_\bx_\b__\bv_\ba_\bl_\bu_\be\n+T max_value(const AlignedNumber< T, align > &val)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn debugalign.hh:494\n+_\bD_\bu_\bn_\be_\b:_\b:_\bm_\bi_\bn_\b__\bv_\ba_\bl_\bu_\be\n+T min_value(const AlignedNumber< T, align > &val)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn debugalign.hh:500\n+_\bD_\bu_\bn_\be_\b:_\b:_\bR_\ba_\bn_\bg_\be_\bE_\br_\br_\bo_\br\n+Default exception class for range errors.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn exceptions.hh:254\n ===============================================================================\n Generated by\u00a0_\b[_\bd_\bo_\bx_\by_\bg_\be_\bn_\b] 1.9.8\n"}]}, {"source1": "./usr/share/doc/libdune-common-doc/doxygen/a00179.html", "source2": "./usr/share/doc/libdune-common-doc/doxygen/a00179.html", "unified_diff": "@@ -1,15 +1,15 @@\n \n \n \n \n \n \n \n-dune-common: tupleutility.hh File Reference\n+dune-common: indices.hh File Reference\n \n \n \n \n \n \n \n@@ -70,118 +70,132 @@\n
    \n \n
    \n \n
    \n \n-
    tupleutility.hh File Reference
    \n+Typedefs |\n+Functions |\n+Variables
    \n+
    indices.hh File Reference
    \n \n
    \n-\n-

    Contains utility classes which can be used with std::tuple. \n-More...

    \n
    #include <cstddef>
    \n-#include <tuple>
    \n+#include <stdexcept>
    \n #include <type_traits>
    \n #include <utility>
    \n-#include <dune/common/hybridutilities.hh>
    \n-#include <dune/common/typetraits.hh>
    \n
    \n

    Go to the source code of this file.

    \n \n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-

    \n-Classes

    struct  Dune::TupleAccessTraits< T >
     
    struct  Dune::TupleAccessTraits< T * >
     
    struct  Dune::TupleAccessTraits< T & >
     
    struct  Dune::NullPointerInitialiser< std::tuple< Args... > >
     
    struct  Dune::ForEachType< TE, std::tuple< Args... > >
     
    class  Dune::TransformTupleFunctor< TE, Args >
     
    struct  Dune::TransformTupleFunctor< TE, Args >::TypeEvaluator< T >
     
    struct  Dune::AddRefTypeEvaluator< T >
     TypeEvaluator to turn a type T into a reference to T More...
     
    struct  Dune::AddPtrTypeEvaluator< T >
     TypeEvaluator to turn a type T into a pointer to T More...
     
    struct  Dune::AddPtrTypeEvaluator< T & >
     
    struct  Dune::AtType< N, Tuple >
     Type for reverse element access. More...
     
    struct  Dune::At< N >
     Reverse element access. More...
     
    struct  Dune::PointerPairDeletor< Tuple >
     Deletes all objects pointed to in a std::tuple of pointers. More...
     
    class  Dune::FirstPredicateIndex< Tuple, Predicate, start, size >
     Finding the index of a certain type in a std::tuple. More...
     
    struct  Dune::IsType< T >
     Generator for predicates accepting one particular type. More...
     
    struct  Dune::IsType< T >::Predicate< U >
     The actual predicate. More...
     
    struct  Dune::FirstTypeIndex< Tuple, T, start >
     Find the first occurrence of a type in a std::tuple. More...
     
    struct  Dune::PushBackTuple< typename std::tuple< Args... >, T >
     
    struct  Dune::PushFrontTuple< typename std::tuple< Args... >, T >
     
    struct  Dune::ReduceTuple< F, Tuple, Seed, N >
     Apply reduce with meta binary function to template. More...
     
    struct  Dune::ReduceTuple< F, Tuple, Seed, 0 >
     Apply reduce with meta binary function to template. More...
     
    struct  Dune::JoinTuples< Head, Tail >
     Join two std::tuple's. More...
     
    struct  Dune::FlattenTuple< Tuple >
     Flatten a std::tuple of std::tuple's. More...
     
    \n \n \n \n \n+\n+\n+\n+\n+\n+

    \n Namespaces

    namespace  Dune
     Dune namespace.
     
    namespace  Dune::Indices
     Namespace with predefined compile time indices for the range [0,19].
     
    namespace  Dune::Indices::Literals
     
    \n+\n+\n+\n+\n+\n

    \n+Typedefs

    template<std::size_t i>
    using Dune::index_constant = std::integral_constant< std::size_t, i >
     An index constant with value i.
     
    \n \n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+

    \n Functions

    template<class F , class ArgTuple , class I , I... i>
    decltype(auto) Dune::applyPartial (F &&f, ArgTuple &&args, std::integer_sequence< I, i... >)
     Apply function with arguments from a given tuple.
     
    template<class Tuple , class Functor >
    auto Dune::genericTransformTuple (Tuple &&t, Functor &&f) -> decltype(genericTransformTupleBackend(t, f))
     
    template<template< class > class TE, class... Args>
    TransformTupleFunctor< TE, Args... > Dune::makeTransformTupleFunctor (Args &&... args)
     
    template<template< class > class TypeEvaluator, class Tuple , class... Args>
    auto Dune::transformTuple (Tuple &&orig, Args &&... args) -> decltype(genericTransformTuple(orig, makeTransformTupleFunctor< TypeEvaluator >(args...)))
     
    template<class F , class I , I... i>
    decltype(auto) constexpr Dune::unpackIntegerSequence (F &&f, std::integer_sequence< I, i... > sequence)
     Unpack an std::integer_sequence<I,i...> to std::integral_constant<I,i>...
     
    template<char... digits>
    constexpr auto Dune::Indices::Literals::operator""_ic ()
     Literal to create an index compile-time constant.
     
    template<char... digits>
    constexpr auto Dune::Indices::Literals::operator""_uc ()
     Literal to create an unsigned integer compile-time constant.
     
    template<char... digits>
    constexpr auto Dune::Indices::Literals::operator""_sc ()
     Literal to create a signed integer compile-time constant.
     
    template<class T , T value>
    constexpr auto Dune::Indices::Literals::operator- (std::integral_constant< T, value >)
     Negation operator for integral constants.
     
    \n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n

    \n+Variables

    constexpr index_constant< 0 > Dune::Indices::_0 = {}
     Compile time index with value 0.
     
    constexpr index_constant< 1 > Dune::Indices::_1 = {}
     Compile time index with value 1.
     
    constexpr index_constant< 2 > Dune::Indices::_2 = {}
     Compile time index with value 2.
     
    constexpr index_constant< 3 > Dune::Indices::_3 = {}
     Compile time index with value 3.
     
    constexpr index_constant< 4 > Dune::Indices::_4 = {}
     Compile time index with value 4.
     
    constexpr index_constant< 5 > Dune::Indices::_5 = {}
     Compile time index with value 5.
     
    constexpr index_constant< 6 > Dune::Indices::_6 = {}
     Compile time index with value 6.
     
    constexpr index_constant< 7 > Dune::Indices::_7 = {}
     Compile time index with value 7.
     
    constexpr index_constant< 8 > Dune::Indices::_8 = {}
     Compile time index with value 8.
     
    constexpr index_constant< 9 > Dune::Indices::_9 = {}
     Compile time index with value 9.
     
    constexpr index_constant< 10 > Dune::Indices::_10 = {}
     Compile time index with value 10.
     
    constexpr index_constant< 11 > Dune::Indices::_11 = {}
     Compile time index with value 11.
     
    constexpr index_constant< 12 > Dune::Indices::_12 = {}
     Compile time index with value 12.
     
    constexpr index_constant< 13 > Dune::Indices::_13 = {}
     Compile time index with value 13.
     
    constexpr index_constant< 14 > Dune::Indices::_14 = {}
     Compile time index with value 14.
     
    constexpr index_constant< 15 > Dune::Indices::_15 = {}
     Compile time index with value 15.
     
    constexpr index_constant< 16 > Dune::Indices::_16 = {}
     Compile time index with value 16.
     
    constexpr index_constant< 17 > Dune::Indices::_17 = {}
     Compile time index with value 17.
     
    constexpr index_constant< 18 > Dune::Indices::_18 = {}
     Compile time index with value 18.
     
    constexpr index_constant< 19 > Dune::Indices::_19 = {}
     Compile time index with value 19.
     
    \n-

    Detailed Description

    \n-

    Contains utility classes which can be used with std::tuple.

    \n-
    \n+\n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,108 +1,117 @@\n dune-common\u00a02.10\n Loading...\n Searching...\n No Matches\n * _\bd_\bu_\bn_\be\n * _\bc_\bo_\bm_\bm_\bo_\bn\n-_\bC_\bl_\ba_\bs_\bs_\be_\bs | _\bN_\ba_\bm_\be_\bs_\bp_\ba_\bc_\be_\bs | _\bF_\bu_\bn_\bc_\bt_\bi_\bo_\bn_\bs\n-tupleutility.hh File Reference\n-_\bC_\bo_\bm_\bm_\bo_\bn \u00bb _\bU_\bt_\bi_\bl_\bi_\bt_\bi_\be_\bs \u00bb _\bT_\bu_\bp_\bl_\be_\b _\bU_\bt_\bi_\bl_\bi_\bt_\bi_\be_\bs\n-Contains utility classes which can be used with std::tuple. _\bM_\bo_\br_\be_\b._\b._\b.\n+_\bN_\ba_\bm_\be_\bs_\bp_\ba_\bc_\be_\bs | _\bT_\by_\bp_\be_\bd_\be_\bf_\bs | _\bF_\bu_\bn_\bc_\bt_\bi_\bo_\bn_\bs | _\bV_\ba_\br_\bi_\ba_\bb_\bl_\be_\bs\n+indices.hh File Reference\n #include \n-#include \n+#include \n #include \n #include \n-#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bh_\by_\bb_\br_\bi_\bd_\bu_\bt_\bi_\bl_\bi_\bt_\bi_\be_\bs_\b._\bh_\bh>\n-#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bt_\by_\bp_\be_\bt_\br_\ba_\bi_\bt_\bs_\b._\bh_\bh>\n _\bG_\bo_\b _\bt_\bo_\b _\bt_\bh_\be_\b _\bs_\bo_\bu_\br_\bc_\be_\b _\bc_\bo_\bd_\be_\b _\bo_\bf_\b _\bt_\bh_\bi_\bs_\b _\bf_\bi_\bl_\be_\b.\n-C\bCl\bla\bas\bss\bse\bes\bs\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\bu_\bp_\bl_\be_\bA_\bc_\bc_\be_\bs_\bs_\bT_\br_\ba_\bi_\bt_\bs_\b<_\b _\bT_\b _\b>\n+N\bNa\bam\bme\bes\bsp\bpa\bac\bce\bes\bs\n+namespace \u00a0 _\bD_\bu_\bn_\be\n+\u00a0 _\bD_\bu_\bn_\be namespace.\n \u00a0\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\bu_\bp_\bl_\be_\bA_\bc_\bc_\be_\bs_\bs_\bT_\br_\ba_\bi_\bt_\bs_\b<_\b _\bT_\b _\b*_\b _\b>\n+namespace \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bd_\bi_\bc_\be_\bs\n+\u00a0 Namespace with predefined compile time indices for the range\n+ [0,19].\n+\u00a0\n+namespace \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bd_\bi_\bc_\be_\bs_\b:_\b:_\bL_\bi_\bt_\be_\br_\ba_\bl_\bs\n+\u00a0\n+T\bTy\byp\bpe\bed\bde\bef\bfs\bs\n+template\n+using\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bi_\bn_\bd_\be_\bx_\b__\bc_\bo_\bn_\bs_\bt_\ba_\bn_\bt = std::integral_constant< std::size_t, i >\n+\u00a0 An index constant with value i.\n \u00a0\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\bu_\bp_\bl_\be_\bA_\bc_\bc_\be_\bs_\bs_\bT_\br_\ba_\bi_\bt_\bs_\b<_\b _\bT_\b _\b&_\b _\b>\n+F\bFu\bun\bnc\bct\bti\bio\bon\bns\bs\n+template\n+decltype(auto) constexpr\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bu_\bn_\bp_\ba_\bc_\bk_\bI_\bn_\bt_\be_\bg_\be_\br_\bS_\be_\bq_\bu_\be_\bn_\bc_\be (F &&f, std::\n+ integer_sequence< I, i... > sequence)\n+\u00a0 Unpack an std::integer_sequence to std::\n+ integral_constant...\n \u00a0\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bN_\bu_\bl_\bl_\bP_\bo_\bi_\bn_\bt_\be_\br_\bI_\bn_\bi_\bt_\bi_\ba_\bl_\bi_\bs_\be_\br_\b<_\b _\bs_\bt_\bd_\b:_\b:_\bt_\bu_\bp_\bl_\be_\b<_\b _\bA_\br_\bg_\bs_\b._\b._\b._\b _\b>_\b _\b>\n+template\n+ constexpr auto\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bd_\bi_\bc_\be_\bs_\b:_\b:_\bL_\bi_\bt_\be_\br_\ba_\bl_\bs_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b\"_\b\"_\b__\bi_\bc ()\n+\u00a0 Literal to create an index compile-time constant.\n \u00a0\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bF_\bo_\br_\bE_\ba_\bc_\bh_\bT_\by_\bp_\be_\b<_\b _\bT_\bE_\b,_\b _\bs_\bt_\bd_\b:_\b:_\bt_\bu_\bp_\bl_\be_\b<_\b _\bA_\br_\bg_\bs_\b._\b._\b._\b _\b>_\b _\b>\n+template\n+ constexpr auto\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bd_\bi_\bc_\be_\bs_\b:_\b:_\bL_\bi_\bt_\be_\br_\ba_\bl_\bs_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b\"_\b\"_\b__\bu_\bc ()\n+\u00a0 Literal to create an unsigned integer compile-time\n+ constant.\n \u00a0\n- class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\bT_\bu_\bp_\bl_\be_\bF_\bu_\bn_\bc_\bt_\bo_\br_\b<_\b _\bT_\bE_\b,_\b _\bA_\br_\bg_\bs_\b _\b>\n+template\n+ constexpr auto\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bd_\bi_\bc_\be_\bs_\b:_\b:_\bL_\bi_\bt_\be_\br_\ba_\bl_\bs_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b\"_\b\"_\b__\bs_\bc ()\n+\u00a0 Literal to create a signed integer compile-time\n+ constant.\n \u00a0\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\bT_\bu_\bp_\bl_\be_\bF_\bu_\bn_\bc_\bt_\bo_\br_\b<_\b _\bT_\bE_\b,_\b _\bA_\br_\bg_\bs_\b _\b>_\b:_\b:_\bT_\by_\bp_\be_\bE_\bv_\ba_\bl_\bu_\ba_\bt_\bo_\br_\b<_\b _\bT_\b _\b>\n+template\n+ constexpr auto\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bd_\bi_\bc_\be_\bs_\b:_\b:_\bL_\bi_\bt_\be_\br_\ba_\bl_\bs_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b- (std::\n+ integral_constant< T, value >)\n+\u00a0 Negation operator for integral constants.\n \u00a0\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bd_\bd_\bR_\be_\bf_\bT_\by_\bp_\be_\bE_\bv_\ba_\bl_\bu_\ba_\bt_\bo_\br_\b<_\b _\bT_\b _\b>\n-\u00a0 TypeEvaluator to turn a type T into a reference to T _\bM_\bo_\br_\be_\b._\b._\b.\n+V\bVa\bar\bri\bia\bab\bbl\ble\bes\bs\n+ constexpr _\bi_\bn_\bd_\be_\bx_\b__\bc_\bo_\bn_\bs_\bt_\ba_\bn_\bt< 0 >\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bd_\bi_\bc_\be_\bs_\b:_\b:_\b__\b0 = {}\n+\u00a0 Compile time index with value 0.\n \u00a0\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bd_\bd_\bP_\bt_\br_\bT_\by_\bp_\be_\bE_\bv_\ba_\bl_\bu_\ba_\bt_\bo_\br_\b<_\b _\bT_\b _\b>\n-\u00a0 TypeEvaluator to turn a type T into a pointer to T _\bM_\bo_\br_\be_\b._\b._\b.\n+ constexpr _\bi_\bn_\bd_\be_\bx_\b__\bc_\bo_\bn_\bs_\bt_\ba_\bn_\bt< 1 >\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bd_\bi_\bc_\be_\bs_\b:_\b:_\b__\b1 = {}\n+\u00a0 Compile time index with value 1.\n \u00a0\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bd_\bd_\bP_\bt_\br_\bT_\by_\bp_\be_\bE_\bv_\ba_\bl_\bu_\ba_\bt_\bo_\br_\b<_\b _\bT_\b _\b&_\b _\b>\n+ constexpr _\bi_\bn_\bd_\be_\bx_\b__\bc_\bo_\bn_\bs_\bt_\ba_\bn_\bt< 2 >\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bd_\bi_\bc_\be_\bs_\b:_\b:_\b__\b2 = {}\n+\u00a0 Compile time index with value 2.\n \u00a0\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bt_\bT_\by_\bp_\be_\b<_\b _\bN_\b,_\b _\bT_\bu_\bp_\bl_\be_\b _\b>\n-\u00a0 Type for reverse element access. _\bM_\bo_\br_\be_\b._\b._\b.\n+ constexpr _\bi_\bn_\bd_\be_\bx_\b__\bc_\bo_\bn_\bs_\bt_\ba_\bn_\bt< 3 >\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bd_\bi_\bc_\be_\bs_\b:_\b:_\b__\b3 = {}\n+\u00a0 Compile time index with value 3.\n \u00a0\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bt_\b<_\b _\bN_\b _\b>\n-\u00a0 Reverse element access. _\bM_\bo_\br_\be_\b._\b._\b.\n+ constexpr _\bi_\bn_\bd_\be_\bx_\b__\bc_\bo_\bn_\bs_\bt_\ba_\bn_\bt< 4 >\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bd_\bi_\bc_\be_\bs_\b:_\b:_\b__\b4 = {}\n+\u00a0 Compile time index with value 4.\n \u00a0\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bP_\bo_\bi_\bn_\bt_\be_\br_\bP_\ba_\bi_\br_\bD_\be_\bl_\be_\bt_\bo_\br_\b<_\b _\bT_\bu_\bp_\bl_\be_\b _\b>\n-\u00a0 Deletes all objects pointed to in a std::tuple of pointers. _\bM_\bo_\br_\be_\b._\b._\b.\n+ constexpr _\bi_\bn_\bd_\be_\bx_\b__\bc_\bo_\bn_\bs_\bt_\ba_\bn_\bt< 5 >\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bd_\bi_\bc_\be_\bs_\b:_\b:_\b__\b5 = {}\n+\u00a0 Compile time index with value 5.\n \u00a0\n- class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bF_\bi_\br_\bs_\bt_\bP_\br_\be_\bd_\bi_\bc_\ba_\bt_\be_\bI_\bn_\bd_\be_\bx_\b<_\b _\bT_\bu_\bp_\bl_\be_\b,_\b _\bP_\br_\be_\bd_\bi_\bc_\ba_\bt_\be_\b,_\b _\bs_\bt_\ba_\br_\bt_\b,_\b _\bs_\bi_\bz_\be_\b _\b>\n-\u00a0 Finding the index of a certain type in a std::tuple. _\bM_\bo_\br_\be_\b._\b._\b.\n+ constexpr _\bi_\bn_\bd_\be_\bx_\b__\bc_\bo_\bn_\bs_\bt_\ba_\bn_\bt< 6 >\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bd_\bi_\bc_\be_\bs_\b:_\b:_\b__\b6 = {}\n+\u00a0 Compile time index with value 6.\n \u00a0\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bI_\bs_\bT_\by_\bp_\be_\b<_\b _\bT_\b _\b>\n-\u00a0 Generator for predicates accepting one particular type. _\bM_\bo_\br_\be_\b._\b._\b.\n+ constexpr _\bi_\bn_\bd_\be_\bx_\b__\bc_\bo_\bn_\bs_\bt_\ba_\bn_\bt< 7 >\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bd_\bi_\bc_\be_\bs_\b:_\b:_\b__\b7 = {}\n+\u00a0 Compile time index with value 7.\n \u00a0\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bI_\bs_\bT_\by_\bp_\be_\b<_\b _\bT_\b _\b>_\b:_\b:_\bP_\br_\be_\bd_\bi_\bc_\ba_\bt_\be_\b<_\b _\bU_\b _\b>\n-\u00a0 The actual predicate. _\bM_\bo_\br_\be_\b._\b._\b.\n+ constexpr _\bi_\bn_\bd_\be_\bx_\b__\bc_\bo_\bn_\bs_\bt_\ba_\bn_\bt< 8 >\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bd_\bi_\bc_\be_\bs_\b:_\b:_\b__\b8 = {}\n+\u00a0 Compile time index with value 8.\n \u00a0\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bF_\bi_\br_\bs_\bt_\bT_\by_\bp_\be_\bI_\bn_\bd_\be_\bx_\b<_\b _\bT_\bu_\bp_\bl_\be_\b,_\b _\bT_\b,_\b _\bs_\bt_\ba_\br_\bt_\b _\b>\n-\u00a0 Find the first occurrence of a type in a std::tuple. _\bM_\bo_\br_\be_\b._\b._\b.\n+ constexpr _\bi_\bn_\bd_\be_\bx_\b__\bc_\bo_\bn_\bs_\bt_\ba_\bn_\bt< 9 >\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bd_\bi_\bc_\be_\bs_\b:_\b:_\b__\b9 = {}\n+\u00a0 Compile time index with value 9.\n \u00a0\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bP_\bu_\bs_\bh_\bB_\ba_\bc_\bk_\bT_\bu_\bp_\bl_\be_\b<_\b _\bt_\by_\bp_\be_\bn_\ba_\bm_\be_\b _\bs_\bt_\bd_\b:_\b:_\bt_\bu_\bp_\bl_\be_\b<_\b _\bA_\br_\bg_\bs_\b._\b._\b._\b _\b>_\b,_\b _\bT_\b _\b>\n+constexpr _\bi_\bn_\bd_\be_\bx_\b__\bc_\bo_\bn_\bs_\bt_\ba_\bn_\bt< 10 >\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bd_\bi_\bc_\be_\bs_\b:_\b:_\b__\b1_\b0 = {}\n+\u00a0 Compile time index with value 10.\n \u00a0\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bP_\bu_\bs_\bh_\bF_\br_\bo_\bn_\bt_\bT_\bu_\bp_\bl_\be_\b<_\b _\bt_\by_\bp_\be_\bn_\ba_\bm_\be_\b _\bs_\bt_\bd_\b:_\b:_\bt_\bu_\bp_\bl_\be_\b<_\b _\bA_\br_\bg_\bs_\b._\b._\b._\b _\b>_\b,_\b _\bT_\b _\b>\n+constexpr _\bi_\bn_\bd_\be_\bx_\b__\bc_\bo_\bn_\bs_\bt_\ba_\bn_\bt< 11 >\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bd_\bi_\bc_\be_\bs_\b:_\b:_\b__\b1_\b1 = {}\n+\u00a0 Compile time index with value 11.\n \u00a0\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bR_\be_\bd_\bu_\bc_\be_\bT_\bu_\bp_\bl_\be_\b<_\b _\bF_\b,_\b _\bT_\bu_\bp_\bl_\be_\b,_\b _\bS_\be_\be_\bd_\b,_\b _\bN_\b _\b>\n-\u00a0 Apply reduce with meta binary function to template. _\bM_\bo_\br_\be_\b._\b._\b.\n+constexpr _\bi_\bn_\bd_\be_\bx_\b__\bc_\bo_\bn_\bs_\bt_\ba_\bn_\bt< 12 >\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bd_\bi_\bc_\be_\bs_\b:_\b:_\b__\b1_\b2 = {}\n+\u00a0 Compile time index with value 12.\n \u00a0\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bR_\be_\bd_\bu_\bc_\be_\bT_\bu_\bp_\bl_\be_\b<_\b _\bF_\b,_\b _\bT_\bu_\bp_\bl_\be_\b,_\b _\bS_\be_\be_\bd_\b,_\b _\b0_\b _\b>\n-\u00a0 Apply reduce with meta binary function to template. _\bM_\bo_\br_\be_\b._\b._\b.\n+constexpr _\bi_\bn_\bd_\be_\bx_\b__\bc_\bo_\bn_\bs_\bt_\ba_\bn_\bt< 13 >\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bd_\bi_\bc_\be_\bs_\b:_\b:_\b__\b1_\b3 = {}\n+\u00a0 Compile time index with value 13.\n \u00a0\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bJ_\bo_\bi_\bn_\bT_\bu_\bp_\bl_\be_\bs_\b<_\b _\bH_\be_\ba_\bd_\b,_\b _\bT_\ba_\bi_\bl_\b _\b>\n-\u00a0 Join two std::tuple's. _\bM_\bo_\br_\be_\b._\b._\b.\n+constexpr _\bi_\bn_\bd_\be_\bx_\b__\bc_\bo_\bn_\bs_\bt_\ba_\bn_\bt< 14 >\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bd_\bi_\bc_\be_\bs_\b:_\b:_\b__\b1_\b4 = {}\n+\u00a0 Compile time index with value 14.\n \u00a0\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bF_\bl_\ba_\bt_\bt_\be_\bn_\bT_\bu_\bp_\bl_\be_\b<_\b _\bT_\bu_\bp_\bl_\be_\b _\b>\n-\u00a0 Flatten a std::tuple of std::tuple's. _\bM_\bo_\br_\be_\b._\b._\b.\n+constexpr _\bi_\bn_\bd_\be_\bx_\b__\bc_\bo_\bn_\bs_\bt_\ba_\bn_\bt< 15 >\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bd_\bi_\bc_\be_\bs_\b:_\b:_\b__\b1_\b5 = {}\n+\u00a0 Compile time index with value 15.\n \u00a0\n-N\bNa\bam\bme\bes\bsp\bpa\bac\bce\bes\bs\n-namespace \u00a0 _\bD_\bu_\bn_\be\n-\u00a0 _\bD_\bu_\bn_\be namespace.\n+constexpr _\bi_\bn_\bd_\be_\bx_\b__\bc_\bo_\bn_\bs_\bt_\ba_\bn_\bt< 16 >\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bd_\bi_\bc_\be_\bs_\b:_\b:_\b__\b1_\b6 = {}\n+\u00a0 Compile time index with value 16.\n \u00a0\n-F\bFu\bun\bnc\bct\bti\bio\bon\bns\bs\n-template\n- decltype(auto)\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\ba_\bp_\bp_\bl_\by_\bP_\ba_\br_\bt_\bi_\ba_\bl (F &&f, ArgTuple\n- &&args, std::integer_sequence< I, i... >)\n-\u00a0 Apply function with arguments from a\n- given tuple.\n-\u00a0\n-template\n- auto\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bg_\be_\bn_\be_\br_\bi_\bc_\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\bT_\bu_\bp_\bl_\be (Tuple &&t,\n- Functor &&f) -> decltype\n- (genericTransformTupleBackend(t, f))\n-\u00a0\n-template class TE, class... Args>\n-_\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\bT_\bu_\bp_\bl_\be_\bF_\bu_\bn_\bc_\bt_\bo_\br< TE, Args... >\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bm_\ba_\bk_\be_\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\bT_\bu_\bp_\bl_\be_\bF_\bu_\bn_\bc_\bt_\bo_\br (Args\n- &&... args)\n-\u00a0\n-template class TypeEvaluator, class Tuple , class... Args>\n- auto\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bt_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\bT_\bu_\bp_\bl_\be (Tuple &&orig, Args\n- &&... args) -> decltype\n- (_\bg_\be_\bn_\be_\br_\bi_\bc_\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\bT_\bu_\bp_\bl_\be(orig,\n- _\bm_\ba_\bk_\be_\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\bT_\bu_\bp_\bl_\be_\bF_\bu_\bn_\bc_\bt_\bo_\br< TypeEvaluator\n- >(args...)))\n+constexpr _\bi_\bn_\bd_\be_\bx_\b__\bc_\bo_\bn_\bs_\bt_\ba_\bn_\bt< 17 >\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bd_\bi_\bc_\be_\bs_\b:_\b:_\b__\b1_\b7 = {}\n+\u00a0 Compile time index with value 17.\n+\u00a0\n+constexpr _\bi_\bn_\bd_\be_\bx_\b__\bc_\bo_\bn_\bs_\bt_\ba_\bn_\bt< 18 >\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bd_\bi_\bc_\be_\bs_\b:_\b:_\b__\b1_\b8 = {}\n+\u00a0 Compile time index with value 18.\n+\u00a0\n+constexpr _\bi_\bn_\bd_\be_\bx_\b__\bc_\bo_\bn_\bs_\bt_\ba_\bn_\bt< 19 >\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bd_\bi_\bc_\be_\bs_\b:_\b:_\b__\b1_\b9 = {}\n+\u00a0 Compile time index with value 19.\n \u00a0\n-*\b**\b**\b**\b**\b* D\bDe\bet\bta\bai\bil\ble\bed\bd D\bDe\bes\bsc\bcr\bri\bip\bpt\bti\bio\bon\bn *\b**\b**\b**\b**\b*\n-Contains utility classes which can be used with std::tuple.\n ===============================================================================\n Generated by\u00a0_\b[_\bd_\bo_\bx_\by_\bg_\be_\bn_\b] 1.9.8\n"}]}, {"source1": "./usr/share/doc/libdune-common-doc/doxygen/a00179_source.html", "source2": "./usr/share/doc/libdune-common-doc/doxygen/a00179_source.html", "unified_diff": "@@ -1,15 +1,15 @@\n \n \n \n \n \n \n \n-dune-common: tupleutility.hh Source File\n+dune-common: indices.hh Source File\n \n \n \n \n \n \n \n@@ -74,448 +74,191 @@\n \n
    \n \n
    \n \n
    \n-
    tupleutility.hh
    \n+
    indices.hh
    \n
    \n
    \n Go to the documentation of this file.
    1// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
    \n
    2// vi: set et ts=4 sw=2 sts=2:
    \n
    3// SPDX-FileCopyrightInfo: Copyright \u00a9 DUNE Project contributors, see file LICENSE.md in module root
    \n
    4// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception
    \n
    5
    \n-
    6#ifndef DUNE_TUPLE_UTILITY_HH
    \n-
    7#define DUNE_TUPLE_UTILITY_HH
    \n+
    6#ifndef DUNE_COMMON_INDICES_HH
    \n+
    7#define DUNE_COMMON_INDICES_HH
    \n
    8
    \n
    9#include <cstddef>
    \n-
    10#include <tuple>
    \n+
    10#include <stdexcept>
    \n
    11#include <type_traits>
    \n
    12#include <utility>
    \n
    13
    \n-\n-\n-
    16
    \n-
    17namespace Dune {
    \n-
    18
    \n-
    41 template<class F, class ArgTuple, class I, I... i>
    \n-
    \n-
    42 decltype(auto) applyPartial(F&& f, ArgTuple&& args, std::integer_sequence<I, i...> /*indices*/)
    \n-
    43 {
    \n-
    44 return f(std::get<i>(args)...);
    \n-
    45 }
    \n-
    \n-
    46
    \n-
    47 template<class T>
    \n-
    \n-\n-
    49 {
    \n-
    50 typedef typename std::add_const<T>::type& ConstType;
    \n-
    51 typedef T& NonConstType;
    \n-
    52 typedef const typename std::remove_const<T>::type& ParameterType;
    \n-
    53 };
    \n-
    \n-
    54
    \n-
    55 template<class T>
    \n-
    \n-\n-
    57 {
    \n-
    58 typedef typename std::add_const<T>::type* ConstType;
    \n-
    59 typedef T* NonConstType;
    \n-
    60 typedef T* ParameterType;
    \n-
    61 };
    \n-
    \n+
    14namespace Dune
    \n+
    15{
    \n+
    28 template<std::size_t i>
    \n+
    29 using index_constant = std::integral_constant<std::size_t, i>;
    \n+
    30
    \n+
    31
    \n+
    32
    \n+
    \n+
    49 namespace Indices
    \n+
    50 {
    \n+
    52 inline constexpr index_constant< 0> _0 = {};
    \n+
    53
    \n+
    55 inline constexpr index_constant< 1> _1 = {};
    \n+
    56
    \n+
    58 inline constexpr index_constant< 2> _2 = {};
    \n+
    59
    \n+
    61 inline constexpr index_constant< 3> _3 = {};
    \n
    62
    \n-
    63 template<class T>
    \n-
    \n-\n-
    65 {
    \n-
    66 typedef T& ConstType;
    \n-
    67 typedef T& NonConstType;
    \n-
    68 typedef T& ParameterType;
    \n-
    69 };
    \n-
    \n-
    70
    \n-
    78 template<class T>
    \n-\n+
    64 inline constexpr index_constant< 4> _4 = {};
    \n+
    65
    \n+
    67 inline constexpr index_constant< 5> _5 = {};
    \n+
    68
    \n+
    70 inline constexpr index_constant< 6> _6 = {};
    \n+
    71
    \n+
    73 inline constexpr index_constant< 7> _7 = {};
    \n+
    74
    \n+
    76 inline constexpr index_constant< 8> _8 = {};
    \n+
    77
    \n+
    79 inline constexpr index_constant< 9> _9 = {};
    \n
    80
    \n-
    81 template<class... Args>
    \n-
    \n-
    82 struct NullPointerInitialiser<std::tuple<Args...> >
    \n-
    83 {
    \n-
    84 typedef std::tuple<Args...> ResultType;
    \n-
    \n-\n-
    86 {
    \n-
    87 return ResultType(static_cast<Args>(nullptr)...);
    \n-
    88 }
    \n-
    \n-
    89 };
    \n-
    \n-
    90
    \n-
    115 template<template <class> class TE, class T>
    \n-\n-
    117
    \n-
    118 template<template <class> class TE, class... Args>
    \n-
    \n-
    119 struct ForEachType<TE, std::tuple<Args...> >
    \n-
    120 {
    \n-
    121 typedef std::tuple<typename TE<Args>::Type...> Type;
    \n-
    122 };
    \n-
    \n-
    123
    \n-
    124#ifndef DOXYGEN
    \n-
    125 template<class Tuple, class Functor, std::size_t... I>
    \n-
    126 inline auto genericTransformTupleBackendImpl(Tuple& t, Functor& f, const std::index_sequence<I...>& )
    \n-
    127 -> std::tuple<decltype(f(std::get<I>(t)))...>
    \n-
    128 {
    \n-
    129 return std::tuple<decltype(f(std::get<I>(t)))...>(f(std::get<I>(t))...);
    \n-
    130 }
    \n-
    131
    \n-
    132 template<class... Args, class Functor>
    \n-
    133 auto genericTransformTupleBackend(std::tuple<Args...>& t, Functor& f) ->
    \n-
    134 decltype(genericTransformTupleBackendImpl(t, f,std::index_sequence_for<Args...>{}))
    \n-
    135 {
    \n-
    136 return genericTransformTupleBackendImpl(t, f,std::index_sequence_for<Args...>{});
    \n-
    137 }
    \n-
    138
    \n-
    139 template<class... Args, class Functor>
    \n-
    140 auto genericTransformTupleBackend(const std::tuple<Args...>& t, Functor& f) ->
    \n-
    141 decltype(genericTransformTupleBackendImpl(t, f, std::index_sequence_for<Args...>{}))
    \n-
    142 {
    \n-
    143 return genericTransformTupleBackendImpl(t, f, std::index_sequence_for<Args...>{});
    \n-
    144 }
    \n-
    145#endif
    \n-
    146
    \n-
    185 template<class Tuple, class Functor>
    \n-
    \n-
    186 auto genericTransformTuple(Tuple&& t, Functor&& f) ->
    \n-
    187 decltype(genericTransformTupleBackend(t, f))
    \n-
    188 {
    \n-
    189 return genericTransformTupleBackend(t, f);
    \n-
    190 }
    \n-
    \n-
    191
    \n-
    224 template<template<class> class TE, class... Args>
    \n-
    \n-\n-
    226 {
    \n-
    227 mutable std::tuple<Args&...> tup;
    \n-
    228
    \n-
    229 template<class T, std::size_t... I>
    \n-
    230 inline auto apply(T&& t, const std::index_sequence<I...>& ) ->
    \n-
    231 decltype(TE<T>::apply(t,std::get<I>(tup)...)) const
    \n-
    232 {
    \n-
    233 return TE<T>::apply(t,std::get<I>(tup)...);
    \n-
    234 }
    \n-
    235
    \n-
    236 public:
    \n-
    237 template<class T>
    \n-
    \n-
    238 struct TypeEvaluator : public TE<T>
    \n-
    239 {};
    \n-
    \n-
    240
    \n-
    \n-
    241 TransformTupleFunctor(Args&&... args)
    \n-
    242 : tup(args...)
    \n-
    243 { }
    \n-
    \n-
    244
    \n-
    245 template<class T>
    \n-
    \n-
    246 inline auto operator()(T&& t) ->
    \n-
    247 decltype(this->apply(t,std::index_sequence_for<Args...>{})) const
    \n-
    248 {
    \n-
    249 return apply(t,std::index_sequence_for<Args...>{});
    \n-
    250 }
    \n-
    \n-
    251 };
    \n-
    \n-
    252
    \n-
    253 template<template<class> class TE, class... Args>
    \n-
    \n-\n-
    255 {
    \n-
    256 return TransformTupleFunctor<TE, Args...>(args...);
    \n-
    257 }
    \n-
    \n-
    258
    \n-
    291 template<template<class> class TypeEvaluator, class Tuple, class... Args>
    \n-
    \n-
    292 auto transformTuple(Tuple&& orig, Args&&... args) ->
    \n-
    293 decltype(genericTransformTuple(orig, makeTransformTupleFunctor<TypeEvaluator>(args...)))
    \n-
    294 {
    \n-
    295 return genericTransformTuple(orig, makeTransformTupleFunctor<TypeEvaluator>(args...));
    \n-
    296 }
    \n-
    \n-
    297
    \n-
    299
    \n-
    303 template<class T>
    \n-
    \n-\n-
    305 {
    \n-
    306 typedef T& Type;
    \n-
    \n-
    307 static Type apply(T& t)
    \n-
    308 {
    \n-
    309 return t;
    \n-
    310 }
    \n-
    \n-
    311 };
    \n-
    \n-
    312
    \n-
    314
    \n-
    318 template<class T>
    \n-
    \n-\n-
    320 {
    \n-
    321 typedef typename std::remove_reference<T>::type* Type;
    \n-
    \n-
    322 static Type apply(T& t)
    \n-
    323 {
    \n-
    324 return &t;
    \n-
    325 }
    \n-
    \n-
    326 };
    \n-
    \n-
    327
    \n-
    328 // Specialization, in case the type is already a reference
    \n-
    329 template<class T>
    \n-
    \n-\n-
    331 {
    \n-
    332 typedef typename std::remove_reference<T>::type* Type;
    \n-
    \n-
    333 static Type apply(T& t)
    \n-
    334 {
    \n-
    335 return &t;
    \n-
    336 }
    \n-
    \n-
    337 };
    \n-
    \n-
    338
    \n-
    344 template<int N, class Tuple>
    \n-
    \n-
    345 struct AtType
    \n-
    346 {
    \n-
    347 typedef typename std::tuple_element<std::tuple_size<Tuple>::value - N - 1, Tuple>::type Type;
    \n-
    348 };
    \n-
    \n-
    349
    \n-
    357 template<int N>
    \n-
    \n-
    358 struct At
    \n-
    359 {
    \n-
    360 template<typename Tuple>
    \n-
    361 static typename TupleAccessTraits<typename AtType<N, Tuple>::Type>::NonConstType
    \n-
    \n-
    362 get(Tuple& t)
    \n-
    363 {
    \n-
    364 return std::get<std::tuple_size<Tuple>::value - N - 1>(t);
    \n-
    365 }
    \n-
    \n-
    366
    \n-
    367 template<typename Tuple>
    \n-
    368 static typename TupleAccessTraits<typename AtType<N, Tuple>::Type>::ConstType
    \n-
    \n-
    369 get(const Tuple& t)
    \n-
    370 {
    \n-
    371 return std::get<std::tuple_size<Tuple>::value - N - 1>(t);
    \n-
    372 }
    \n-
    \n-
    373 };
    \n-
    \n-
    374
    \n-
    378 template<class Tuple>
    \n-
    \n-\n-
    380 {
    \n-
    381 template<typename... Ts>
    \n-
    \n-
    382 static void apply(std::tuple<Ts...>& t)
    \n-
    383 {
    \n-
    384 Hybrid::forEach(t,[&](auto&& ti){delete ti; ti=nullptr;});
    \n-
    385 }
    \n-
    \n-
    386 };
    \n-
    \n-
    387
    \n-
    411 template<class Tuple, template<class> class Predicate, std::size_t start = 0,
    \n-
    412 std::size_t size = std::tuple_size<Tuple>::value>
    \n-
    \n-\n-
    414 public std::conditional<Predicate<typename std::tuple_element<start,
    \n-
    415 Tuple>::type>::value,
    \n-
    416 std::integral_constant<std::size_t, start>,
    \n-
    417 FirstPredicateIndex<Tuple, Predicate, start+1> >::type
    \n-
    418 {
    \n-
    419 static_assert(std::tuple_size<Tuple>::value == size, "The \\"size\\" "
    \n-
    420 "template parameter of FirstPredicateIndex is an "
    \n-
    421 "implementation detail and should never be set "
    \n-
    422 "explicitly!");
    \n-
    423 };
    \n-
    \n-
    424
    \n-
    425#ifndef DOXYGEN
    \n-
    426 template<class Tuple, template<class> class Predicate, std::size_t size>
    \n-
    427 class FirstPredicateIndex<Tuple, Predicate, size, size>
    \n-
    428 {
    \n-
    429 static_assert(AlwaysFalse<Tuple>::value, "None of the std::tuple element "
    \n-
    430 "types matches the predicate!");
    \n-
    431 };
    \n-
    432#endif // !DOXYGEN
    \n-
    433
    \n-
    443 template<class T>
    \n-
    \n-
    444 struct IsType
    \n-
    445 {
    \n-
    447 template<class U>
    \n-
    448 struct Predicate : public std::is_same<T, U> {};
    \n-
    449 };
    \n-
    \n-
    450
    \n-
    464 template<class Tuple, class T, std::size_t start = 0>
    \n-
    \n-\n-
    466 public FirstPredicateIndex<Tuple, IsType<T>::template Predicate, start>
    \n-
    467 { };
    \n-
    \n-
    468
    \n-
    475 template<class Tuple, class T>
    \n-\n-
    477
    \n-
    478 template<class... Args, class T>
    \n-
    \n-
    479 struct PushBackTuple<typename std::tuple<Args...>, T>
    \n-
    480 {
    \n-
    481 typedef typename std::tuple<Args..., T> type;
    \n-
    482 };
    \n-
    \n-
    483
    \n-
    490 template<class Tuple, class T>
    \n-\n-
    492
    \n-
    493 template<class... Args, class T>
    \n-
    \n-
    494 struct PushFrontTuple<typename std::tuple<Args...>, T>
    \n-
    495 {
    \n-
    496 typedef typename std::tuple<T, Args...> type;
    \n-
    497 };
    \n-
    \n-
    498
    \n-
    511 template<
    \n-
    512 template <class, class> class F,
    \n-
    513 class Tuple,
    \n-
    514 class Seed=std::tuple<>,
    \n-
    515 int N=std::tuple_size<Tuple>::value>
    \n-
    \n-\n-
    517 {
    \n-
    518 typedef typename ReduceTuple<F, Tuple, Seed, N-1>::type Accumulated;
    \n-
    519 typedef typename std::tuple_element<N-1, Tuple>::type Value;
    \n-
    520
    \n-
    522 typedef typename F<Accumulated, Value>::type type;
    \n-
    523 };
    \n-
    \n-
    524
    \n-
    535 template<
    \n-
    536 template <class, class> class F,
    \n-
    537 class Tuple,
    \n-
    538 class Seed>
    \n-
    \n-
    539 struct ReduceTuple<F, Tuple, Seed, 0>
    \n-
    540 {
    \n-
    542 typedef Seed type;
    \n-
    543 };
    \n-
    \n-
    544
    \n-
    554 template<class Head, class Tail>
    \n-
    \n-\n-
    556 {
    \n-\n-
    559 };
    \n-
    \n-
    560
    \n-
    569 template<class Tuple>
    \n-
    \n-\n-
    571 {
    \n-\n-
    574 };
    \n-
    \n-
    575
    \n-
    577}
    \n-
    578
    \n-
    579#endif
    \n-
    Traits for type conversions and type information.
    \n-\n-
    std::add_const< T >::type & ConstType
    Definition tupleutility.hh:50
    \n-
    static void apply(std::tuple< Ts... > &t)
    Definition tupleutility.hh:382
    \n-
    T * ParameterType
    Definition tupleutility.hh:60
    \n-
    auto transformTuple(Tuple &&orig, Args &&... args) -> decltype(genericTransformTuple(orig, makeTransformTupleFunctor< TypeEvaluator >(args...)))
    Definition tupleutility.hh:292
    \n-
    T & ConstType
    Definition tupleutility.hh:66
    \n-
    ReduceTuple< F, Tuple, Seed, N-1 >::type Accumulated
    Definition tupleutility.hh:518
    \n-
    T * NonConstType
    Definition tupleutility.hh:59
    \n-
    Seed type
    Result of the reduce operation.
    Definition tupleutility.hh:542
    \n-
    std::remove_reference< T >::type * Type
    Definition tupleutility.hh:321
    \n-
    static Type apply(T &t)
    Definition tupleutility.hh:307
    \n-
    static ResultType apply()
    Definition tupleutility.hh:85
    \n-
    std::tuple< Args... > ResultType
    Definition tupleutility.hh:84
    \n-
    std::remove_reference< T >::type * Type
    Definition tupleutility.hh:332
    \n-
    TransformTupleFunctor(Args &&... args)
    Definition tupleutility.hh:241
    \n-
    std::tuple_element< std::tuple_size< Tuple >::value-N-1, Tuple >::type Type
    Definition tupleutility.hh:347
    \n-
    static Type apply(T &t)
    Definition tupleutility.hh:333
    \n-
    auto operator()(T &&t) -> decltype(this->apply(t, std::index_sequence_for< Args... >{})) const
    Definition tupleutility.hh:246
    \n-
    T & NonConstType
    Definition tupleutility.hh:67
    \n-
    T & NonConstType
    Definition tupleutility.hh:51
    \n-
    static TupleAccessTraits< typenameAtType< N, Tuple >::Type >::ConstType get(const Tuple &t)
    Definition tupleutility.hh:369
    \n-
    T & Type
    Definition tupleutility.hh:306
    \n-
    static TupleAccessTraits< typenameAtType< N, Tuple >::Type >::NonConstType get(Tuple &t)
    Definition tupleutility.hh:362
    \n-
    std::tuple< Args..., T > type
    Definition tupleutility.hh:481
    \n-
    std::tuple_element< N-1, Tuple >::type Value
    Definition tupleutility.hh:519
    \n-
    std::tuple< T, Args... > type
    Definition tupleutility.hh:496
    \n-
    ReduceTuple< JoinTuples, Tuple >::type type
    Result of the flatten operation.
    Definition tupleutility.hh:573
    \n-
    static Type apply(T &t)
    Definition tupleutility.hh:322
    \n-
    F< Accumulated, Value >::type type
    Result of the reduce operation.
    Definition tupleutility.hh:522
    \n-
    ReduceTuple< PushBackTuple, Tail, Head >::type type
    Result of the join operation.
    Definition tupleutility.hh:558
    \n-
    std::tuple< typename TE< Args >::Type... > Type
    Definition tupleutility.hh:121
    \n-
    auto genericTransformTuple(Tuple &&t, Functor &&f) -> decltype(genericTransformTupleBackend(t, f))
    Definition tupleutility.hh:186
    \n-
    decltype(auto) applyPartial(F &&f, ArgTuple &&args, std::integer_sequence< I, i... >)
    Apply function with arguments from a given tuple.
    Definition tupleutility.hh:42
    \n-
    T & ParameterType
    Definition tupleutility.hh:68
    \n-
    const std::remove_const< T >::type & ParameterType
    Definition tupleutility.hh:52
    \n-
    std::add_const< T >::type * ConstType
    Definition tupleutility.hh:58
    \n-
    TransformTupleFunctor< TE, Args... > makeTransformTupleFunctor(Args &&... args)
    Definition tupleutility.hh:254
    \n-
    constexpr void forEach(Range &&range, F &&f)
    Range based for loop.
    Definition hybridutilities.hh:256
    \n-
    STL namespace.
    \n+
    82 inline constexpr index_constant<10> _10 = {};
    \n+
    83
    \n+
    85 inline constexpr index_constant<11> _11 = {};
    \n+
    86
    \n+
    88 inline constexpr index_constant<12> _12 = {};
    \n+
    89
    \n+
    91 inline constexpr index_constant<13> _13 = {};
    \n+
    92
    \n+
    94 inline constexpr index_constant<14> _14 = {};
    \n+
    95
    \n+
    97 inline constexpr index_constant<15> _15 = {};
    \n+
    98
    \n+
    100 inline constexpr index_constant<16> _16 = {};
    \n+
    101
    \n+
    103 inline constexpr index_constant<17> _17 = {};
    \n+
    104
    \n+
    106 inline constexpr index_constant<18> _18 = {};
    \n+
    107
    \n+
    109 inline constexpr index_constant<19> _19 = {};
    \n+
    110
    \n+
    111 } // namespace Indices
    \n+
    \n+
    112
    \n+
    123 template<class F, class I, I... i>
    \n+
    \n+
    124 decltype(auto) constexpr unpackIntegerSequence(F&& f, std::integer_sequence<I, i...> sequence)
    \n+
    125 {
    \n+
    126 return f(std::integral_constant<I, i>()...);
    \n+
    127 }
    \n+
    \n+
    128
    \n+
    129
    \n+
    \n+
    130 namespace Indices { inline namespace Literals
    \n+
    131 {
    \n+
    132 namespace Impl
    \n+
    133 {
    \n+
    134 // convert a single character into an unsigned integer
    \n+
    135 constexpr unsigned char2digit (const char c)
    \n+
    136 {
    \n+
    137 if (c >= '0' && c <= '9')
    \n+
    138 return unsigned(c) - unsigned('0');
    \n+
    139 else {
    \n+
    140 throw std::invalid_argument("Character is not a digit.");
    \n+
    141 return 0u;
    \n+
    142 }
    \n+
    143 }
    \n+
    144
    \n+
    145 // convert a sequence of character digits into an unsigned integer
    \n+
    146 template <class T, char... digits>
    \n+
    147 constexpr T chars2number ()
    \n+
    148 {
    \n+
    149 const char arr[] = {digits...};
    \n+
    150 T result = 0;
    \n+
    151 T power = 1;
    \n+
    152 const T base = 10;
    \n+
    153
    \n+
    154 const int N = sizeof...(digits);
    \n+
    155 for (int i = 0; i < N; ++i) {
    \n+
    156 char c = arr[N - 1 - i];
    \n+
    157 result+= char2digit(c) * power;
    \n+
    158 power *= base;
    \n+
    159 }
    \n+
    160
    \n+
    161 return result;
    \n+
    162 }
    \n+
    163
    \n+
    164 } //namespace Impl
    \n+
    165
    \n+
    172 template <char... digits>
    \n+
    \n+
    173 constexpr auto operator"" _ic()
    \n+
    174 {
    \n+
    175 return std::integral_constant<std::size_t, Impl::chars2number<std::size_t,digits...>()>{};
    \n+
    176 }
    \n+
    \n+
    177
    \n+
    184 template <char... digits>
    \n+
    \n+
    185 constexpr auto operator"" _uc()
    \n+
    186 {
    \n+
    187 return std::integral_constant<unsigned, Impl::chars2number<unsigned,digits...>()>{};
    \n+
    188 }
    \n+
    \n+
    189
    \n+
    196 template <char... digits>
    \n+
    \n+
    197 constexpr auto operator"" _sc()
    \n+
    198 {
    \n+
    199 return std::integral_constant<int, Impl::chars2number<int,digits...>()>{};
    \n+
    200 }
    \n+
    \n+
    201
    \n+
    208 template <class T, T value>
    \n+
    \n+
    209 constexpr auto operator- (std::integral_constant<T,value>)
    \n+
    210 {
    \n+
    211 return std::integral_constant<std::make_signed_t<T>, -value>{};
    \n+
    212 }
    \n+
    \n+
    213
    \n+
    214 }} //namespace Indices::Literals
    \n+
    \n+
    215} //namespace Dune
    \n+
    216
    \n+
    217#endif // DUNE_COMMON_INDICES_HH
    \n+
    constexpr index_constant< 16 > _16
    Compile time index with value 16.
    Definition indices.hh:100
    \n+
    constexpr index_constant< 15 > _15
    Compile time index with value 15.
    Definition indices.hh:97
    \n+
    constexpr index_constant< 8 > _8
    Compile time index with value 8.
    Definition indices.hh:76
    \n+
    constexpr index_constant< 7 > _7
    Compile time index with value 7.
    Definition indices.hh:73
    \n+
    constexpr index_constant< 0 > _0
    Compile time index with value 0.
    Definition indices.hh:52
    \n+
    constexpr index_constant< 9 > _9
    Compile time index with value 9.
    Definition indices.hh:79
    \n+
    constexpr index_constant< 14 > _14
    Compile time index with value 14.
    Definition indices.hh:94
    \n+
    constexpr index_constant< 1 > _1
    Compile time index with value 1.
    Definition indices.hh:55
    \n+
    constexpr index_constant< 3 > _3
    Compile time index with value 3.
    Definition indices.hh:61
    \n+
    constexpr index_constant< 12 > _12
    Compile time index with value 12.
    Definition indices.hh:88
    \n+
    decltype(auto) constexpr unpackIntegerSequence(F &&f, std::integer_sequence< I, i... > sequence)
    Unpack an std::integer_sequence<I,i...> to std::integral_constant<I,i>...
    Definition indices.hh:124
    \n+
    constexpr auto operator-(std::integral_constant< T, value >)
    Negation operator for integral constants.
    Definition indices.hh:209
    \n+
    constexpr index_constant< 11 > _11
    Compile time index with value 11.
    Definition indices.hh:85
    \n+
    constexpr index_constant< 18 > _18
    Compile time index with value 18.
    Definition indices.hh:106
    \n+
    constexpr index_constant< 13 > _13
    Compile time index with value 13.
    Definition indices.hh:91
    \n+
    constexpr index_constant< 5 > _5
    Compile time index with value 5.
    Definition indices.hh:67
    \n+
    constexpr index_constant< 17 > _17
    Compile time index with value 17.
    Definition indices.hh:103
    \n+
    constexpr index_constant< 10 > _10
    Compile time index with value 10.
    Definition indices.hh:82
    \n+
    constexpr index_constant< 2 > _2
    Compile time index with value 2.
    Definition indices.hh:58
    \n+
    std::integral_constant< std::size_t, i > index_constant
    An index constant with value i.
    Definition indices.hh:29
    \n+
    constexpr index_constant< 19 > _19
    Compile time index with value 19.
    Definition indices.hh:109
    \n+
    constexpr index_constant< 6 > _6
    Compile time index with value 6.
    Definition indices.hh:70
    \n+
    constexpr index_constant< 4 > _4
    Compile time index with value 4.
    Definition indices.hh:64
    \n
    Dune namespace.
    Definition alignedallocator.hh:13
    \n-
    constexpr std::integral_constant< std::size_t, sizeof...(II)> size(std::integer_sequence< T, II... >)
    Return the size of the sequence.
    Definition integersequence.hh:75
    \n-
    Definition tupleutility.hh:49
    \n-
    A helper template that initializes a std::tuple consisting of pointers to nullptr.
    Definition tupleutility.hh:79
    \n-
    Helper template to clone the type definition of a std::tuple with the storage types replaced by a use...
    Definition tupleutility.hh:116
    \n-
    Definition tupleutility.hh:226
    \n-
    Definition tupleutility.hh:239
    \n-
    TypeEvaluator to turn a type T into a reference to T
    Definition tupleutility.hh:305
    \n-
    TypeEvaluator to turn a type T into a pointer to T
    Definition tupleutility.hh:320
    \n-
    Type for reverse element access.
    Definition tupleutility.hh:346
    \n-
    Reverse element access.
    Definition tupleutility.hh:359
    \n-
    Deletes all objects pointed to in a std::tuple of pointers.
    Definition tupleutility.hh:380
    \n-
    Finding the index of a certain type in a std::tuple.
    Definition tupleutility.hh:418
    \n-
    Generator for predicates accepting one particular type.
    Definition tupleutility.hh:445
    \n-
    The actual predicate.
    Definition tupleutility.hh:448
    \n-
    Find the first occurrence of a type in a std::tuple.
    Definition tupleutility.hh:467
    \n-
    Helper template to append a type to a std::tuple.
    Definition tupleutility.hh:476
    \n-
    Helper template to prepend a type to a std::tuple.
    Definition tupleutility.hh:491
    \n-
    Apply reduce with meta binary function to template.
    Definition tupleutility.hh:517
    \n-
    Join two std::tuple's.
    Definition tupleutility.hh:556
    \n-
    Flatten a std::tuple of std::tuple's.
    Definition tupleutility.hh:571
    \n-
    template which always yields a false value
    Definition typetraits.hh:124
    \n+
    constexpr Base power(Base m, Exponent p)
    Power method for integer exponents.
    Definition math.hh:75
    \n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,520 +1,249 @@\n dune-common\u00a02.10\n Loading...\n Searching...\n No Matches\n * _\bd_\bu_\bn_\be\n * _\bc_\bo_\bm_\bm_\bo_\bn\n-tupleutility.hh\n+indices.hh\n _\bG_\bo_\b _\bt_\bo_\b _\bt_\bh_\be_\b _\bd_\bo_\bc_\bu_\bm_\be_\bn_\bt_\ba_\bt_\bi_\bo_\bn_\b _\bo_\bf_\b _\bt_\bh_\bi_\bs_\b _\bf_\bi_\bl_\be_\b.\n 1// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-\n 2// vi: set et ts=4 sw=2 sts=2:\n 3// SPDX-FileCopyrightInfo: Copyright \u00c2\u00a9 DUNE Project contributors, see file\n LICENSE.md in module root\n 4// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception\n 5\n-6#ifndef DUNE_TUPLE_UTILITY_HH\n-7#define DUNE_TUPLE_UTILITY_HH\n+6#ifndef DUNE_COMMON_INDICES_HH\n+7#define DUNE_COMMON_INDICES_HH\n 8\n 9#include \n-10#include \n+10#include \n 11#include \n 12#include \n 13\n-14#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bh_\by_\bb_\br_\bi_\bd_\bu_\bt_\bi_\bl_\bi_\bt_\bi_\be_\bs_\b._\bh_\bh>\n-15#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bt_\by_\bp_\be_\bt_\br_\ba_\bi_\bt_\bs_\b._\bh_\bh>\n-16\n-17namespace _\bD_\bu_\bn_\be {\n-18\n-41 template\n-_\b4_\b2 decltype(auto) _\ba_\bp_\bp_\bl_\by_\bP_\ba_\br_\bt_\bi_\ba_\bl(F&& f, ArgTuple&& args, std::integer_sequence /*indices*/)\n-43 {\n-44 return f(std::get(args)...);\n-45 }\n-46\n-47 template\n-_\b4_\b8 struct _\bT_\bu_\bp_\bl_\be_\bA_\bc_\bc_\be_\bs_\bs_\bT_\br_\ba_\bi_\bt_\bs\n-49 {\n-_\b5_\b0 typedef typename std::add_const::type& _\bC_\bo_\bn_\bs_\bt_\bT_\by_\bp_\be;\n-_\b5_\b1 typedef T& _\bN_\bo_\bn_\bC_\bo_\bn_\bs_\bt_\bT_\by_\bp_\be;\n-_\b5_\b2 typedef const typename std::remove_const::type& _\bP_\ba_\br_\ba_\bm_\be_\bt_\be_\br_\bT_\by_\bp_\be;\n-53 };\n-54\n-55 template\n-_\b5_\b6 struct _\bT_\bu_\bp_\bl_\be_\bA_\bc_\bc_\be_\bs_\bs_\bT_\br_\ba_\bi_\bt_\bs\n-57 {\n-_\b5_\b8 typedef typename std::add_const::type* _\bC_\bo_\bn_\bs_\bt_\bT_\by_\bp_\be;\n-_\b5_\b9 typedef T* _\bN_\bo_\bn_\bC_\bo_\bn_\bs_\bt_\bT_\by_\bp_\be;\n-_\b6_\b0 typedef T* _\bP_\ba_\br_\ba_\bm_\be_\bt_\be_\br_\bT_\by_\bp_\be;\n-61 };\n+14namespace _\bD_\bu_\bn_\be\n+15{\n+28 template\n+_\b2_\b9 using _\bi_\bn_\bd_\be_\bx_\b__\bc_\bo_\bn_\bs_\bt_\ba_\bn_\bt = std::integral_constant;\n+30\n+31\n+32\n+_\b4_\b9 namespace Indices\n+50 {\n+_\b5_\b2 inline constexpr _\bi_\bn_\bd_\be_\bx_\b__\bc_\bo_\bn_\bs_\bt_\ba_\bn_\bt_\b<_\b _\b0_\b> _\b__\b0 = {};\n+53\n+_\b5_\b5 inline constexpr _\bi_\bn_\bd_\be_\bx_\b__\bc_\bo_\bn_\bs_\bt_\ba_\bn_\bt_\b<_\b _\b1_\b> _\b__\b1 = {};\n+56\n+_\b5_\b8 inline constexpr _\bi_\bn_\bd_\be_\bx_\b__\bc_\bo_\bn_\bs_\bt_\ba_\bn_\bt_\b<_\b _\b2_\b> _\b__\b2 = {};\n+59\n+_\b6_\b1 inline constexpr _\bi_\bn_\bd_\be_\bx_\b__\bc_\bo_\bn_\bs_\bt_\ba_\bn_\bt_\b<_\b _\b3_\b> _\b__\b3 = {};\n 62\n-63 template\n-_\b6_\b4 struct _\bT_\bu_\bp_\bl_\be_\bA_\bc_\bc_\be_\bs_\bs_\bT_\br_\ba_\bi_\bt_\bs\n-65 {\n-_\b6_\b6 typedef T& _\bC_\bo_\bn_\bs_\bt_\bT_\by_\bp_\be;\n-_\b6_\b7 typedef T& _\bN_\bo_\bn_\bC_\bo_\bn_\bs_\bt_\bT_\by_\bp_\be;\n-_\b6_\b8 typedef T& _\bP_\ba_\br_\ba_\bm_\be_\bt_\be_\br_\bT_\by_\bp_\be;\n-69 };\n-70\n-78 template\n-_\b7_\b9 struct _\bN_\bu_\bl_\bl_\bP_\bo_\bi_\bn_\bt_\be_\br_\bI_\bn_\bi_\bt_\bi_\ba_\bl_\bi_\bs_\be_\br;\n+_\b6_\b4 inline constexpr _\bi_\bn_\bd_\be_\bx_\b__\bc_\bo_\bn_\bs_\bt_\ba_\bn_\bt_\b<_\b _\b4_\b> _\b__\b4 = {};\n+65\n+_\b6_\b7 inline constexpr _\bi_\bn_\bd_\be_\bx_\b__\bc_\bo_\bn_\bs_\bt_\ba_\bn_\bt_\b<_\b _\b5_\b> _\b__\b5 = {};\n+68\n+_\b7_\b0 inline constexpr _\bi_\bn_\bd_\be_\bx_\b__\bc_\bo_\bn_\bs_\bt_\ba_\bn_\bt_\b<_\b _\b6_\b> _\b__\b6 = {};\n+71\n+_\b7_\b3 inline constexpr _\bi_\bn_\bd_\be_\bx_\b__\bc_\bo_\bn_\bs_\bt_\ba_\bn_\bt_\b<_\b _\b7_\b> _\b__\b7 = {};\n+74\n+_\b7_\b6 inline constexpr _\bi_\bn_\bd_\be_\bx_\b__\bc_\bo_\bn_\bs_\bt_\ba_\bn_\bt_\b<_\b _\b8_\b> _\b__\b8 = {};\n+77\n+_\b7_\b9 inline constexpr _\bi_\bn_\bd_\be_\bx_\b__\bc_\bo_\bn_\bs_\bt_\ba_\bn_\bt_\b<_\b _\b9_\b> _\b__\b9 = {};\n 80\n-81 template\n-_\b8_\b2 struct _\bN_\bu_\bl_\bl_\bP_\bo_\bi_\bn_\bt_\be_\br_\bI_\bn_\bi_\bt_\bi_\ba_\bl_\bi_\bs_\be_\br<_\bs_\bt_\bd::tuple >\n-83 {\n-_\b8_\b4 typedef std::tuple _\bR_\be_\bs_\bu_\bl_\bt_\bT_\by_\bp_\be;\n-_\b8_\b5 static _\bR_\be_\bs_\bu_\bl_\bt_\bT_\by_\bp_\be _\ba_\bp_\bp_\bl_\by()\n-86 {\n-87 return _\bR_\be_\bs_\bu_\bl_\bt_\bT_\by_\bp_\be(static_cast(nullptr)...);\n-88 }\n-89 };\n-90\n-115 template